65.9K
CodeProject 正在变化。 阅读更多。
Home

CHash 1.5 - 一个 MFC 哈希类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (61投票s)

2005年5月1日

2分钟阅读

viewsIcon

217189

downloadIcon

8549

一个 MFC 实现,使用 CRC32、GOST-Hash、MD2、MD4、MD5、SHA-1 和 SHA-2 (256/384/512) 对文件和字符串进行哈希。

引言

我曾多次看到单个哈希算法的实现,并认为将它们组合在一个易于使用的类中可能是一个好主意。好吧,这就是了。

什么是哈希?

哈希是一串字母/数字。它们用作数据的表示,但它们是单向的,你不能从哈希返回到原始数据;由于哈希是固定长度的,你也不能确定所表示数据的长度或数量。这使得哈希在实际安全应用以及完整性应用中都很有用。

为什么使用哈希?

哈希有多种用途,主要用途是数据完整性。例如,P2P 客户端将使用哈希来验证文件是否在完成后没有损坏或“伪造”。通过生成文件的哈希,你可以将其与另一个哈希进行比较,并检查文件是否相同。

使用代码

使用 CHash 相对简单。

将要使用的主要函数是

  • DoHash
  • SetHashAlgorithm
  • SetHashFile
  • SetHashOperation
  • SetHashString

使用 MD5 哈希字符串的示例

// Define a CHash object
CHash hashObj;

// Set the algorithm
hashObj.SetHashAlgorithm(MD5);

// Set the operation
hashObj.SetHashOperation(STRING_HASH);

// Set the string
hashObj.SetHashString("String to hash");

// Hash the string
CString outHash = hashObj.DoHash();

使用 SHA-1 哈希文件的示例

// Define a CHash object
CHash hashObj;

// Set the algorithm
hashObj.SetHashAlgorithm(SHA1);

// Set the operation
hashObj.SetHashOperation(FILE_HASH);

// Set the file
hashObj.SetHashFile("C:\\Windows\\Explorer.exe");

// Hash the file
CString outHash = hashObj.DoHash();

代码在整个过程中都是一样的,除了 SHA-2,它有一个额外的函数 SetSHA2Strength,它接受一个参数,即哈希的强度,可以是 256、384 或 512。

一个例子用法是

// Define a CHash object
CHash hashObj;

// Set the operation
hashObj.SetHashOperation(FILE_HASH);

// Set the algorithm
hashObj.SetHashAlgorithm(SHA2);

// Set the SHA-2 strength
hashObj.SetSHA2Strength(256);

// Set the file
hashObj.SetHashFile("C:\\Windows\\Explorer.exe");

// Hash the file
CString outHash = hashObj.DoHash();

选择要包含的算法

在版本 1.5 中,我使该类模块化,因此你可以排除/包含特定的算法(如果你不需要某些算法,可以减少不必要的代码)。要选择要使用的算法,请转到 CHash.h,并找到

// Choose which algorithms you want
// Put 1s to support algorithms, else 0 to not support

在这里你会找到定义,例如

#define        SUPPORT_CRC32          1

如果你想排除一个算法,将 1 改为 0。

哈希样式

在版本 1.2 中,我添加了哈希样式。这允许程序员自定义输出哈希。有四种样式

  • 小写,无空格
    b4df98798c02b7c7a500d18632bf5b7d
  • 小写,有空格
    b4 df 98 79 8c 02 b7 c7 a5 00 d1 86 32 bf 5b 7d
  • 大写,无空格
    B4DF98798C02B7C7A500D18632BF5B7Dd
  • 大写,有空格
    B4 DF 98 79 8C 02 B7 C7 A5 00 D1 86 32 BF 5B 7D

这些可以使用 SetHashFormat() 设置。

致谢

  • 感谢 Dominik Reichl 提供的出色 ReHash 程序。
  • 感谢 Markku-Juhani O. Saarinen 提供的 GOST-Hash 实现。
  • 感谢 Dr. Brian Gladman 提供的 SHA-1/SHA-2 实现。

历史

  • 1.0
    • 2005年5月1日:首次公开发布。
  • 1.1
    • 2005年5月2日:根据建议添加了 SetHashAlgorithm()DoHash()
  • 1.2
    • 2005年5月3日
      • 添加了哈希样式。
      • 添加了 GOSTHash 算法。
      • 添加了 GetHashAlgorithm()
      • 重写了哈希函数,使其更高效。
  • 1.3
    • 2005年5月4日:更新了演示项目。
  • 1.5
    • 2005年5月8日
      • 添加了 CRC32。
      • 使类“模块化”,以便你可以从编译中排除算法。
      • 添加了 GetHashFormat()
      • 根据建议更新了代码。
  • 1.6
    • 2005年8月3日
      • 修复了内存泄漏。
      • 使每个哈希更有效,总的来说整理了代码。
  • © . All rights reserved.