CHash 1.5 - 一个 MFC 哈希类






4.09/5 (61投票s)
2005年5月1日
2分钟阅读

217189

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()
。
- 2005年5月2日:根据建议添加了
- 1.2
- 2005年5月3日
- 添加了哈希样式。
- 添加了 GOSTHash 算法。
- 添加了
GetHashAlgorithm()
。 - 重写了哈希函数,使其更高效。
- 2005年5月3日
- 1.3
- 2005年5月4日:更新了演示项目。
- 1.5
- 2005年5月8日
- 添加了 CRC32。
- 使类“模块化”,以便你可以从编译中排除算法。
- 添加了
GetHashFormat()
。 - 根据建议更新了代码。
- 2005年5月8日
- 2005年8月3日
- 修复了内存泄漏。
- 使每个哈希更有效,总的来说整理了代码。