BlakeSharp - BLAKE 哈希算法的 C# 实现






4.94/5 (32投票s)
BLAKE 哈希算法的 C# 实现。
目录
BLAKE 和 BlakeSharp
BlakeSharp 是我用 C# 实现的 BLAKE 算法。它是公共领域软件,即您可以自由地将其包含/用于您的项目(也包括商业项目)。如果您正在使用它,如果能在您的程序文档中某处提及我,那将不胜感激,但这并非强制要求。
BLAKE 是一种密码学安全单向哈希函数。它由 Jean-Philippe Aumasson、Luca Henzen、Willi Meier 和 Raphael C.-W. Phan 设计。BLAKE 是 NIST SHA-3 竞赛的五名决赛选手之一。有关 BLAKE 的更多信息,请参阅BLAKE 官方网站。
BlakeSharp 源自 BLAKE 的参考 C 实现。所有代码均已用 C# 重写,即现在只使用托管代码,没有原生或不安全代码。因此,它具有可移植性,在 .NET(Windows)和 Mono(Linux / Mac OS X / ...)下都能良好运行。
在您的项目中包含 BlakeSharp
BlakeSharp 由两个类组成,它们实现了 BLAKE 的两个主要实例:Blake256
类实现 256 位版本的 BLAKE(BLAKE-256,生成 256 位 = 32 字节长的哈希),而 Blake512
类实现 512 位版本的 BLAKE(BLAKE-512,生成 512 位 = 64 字节长的哈希)。这两个类相互独立(即,当您只需要 256 位版本时,不需要包含 512 位代码,反之亦然)。
有两种不同的方式可以包含 BlakeSharp
- 包含源代码。如果您的项目是用 C# 编写的,您可以简单地将 BlakeSharp 文件复制/包含到您的项目中。根据您是想使用 256 位版本和/或 512 位版本,您需要包含 Blake256.cs 和/或 Blake512.cs 文件。包含文件后,可以在
BlakeSharp
命名空间中找到这些类。 - 引用 BlakeSharp 程序集。如果您的项目是用另一种 .NET 语言编写的,您可以在您的项目中引用 BlakeSharp 程序集(BlakeSharp.dll 文件)。这将使
BlakeSharp
命名空间可用,您将在其中找到这两个类。
Blake256.cs 和 Blake512.cs 可以在可下载包的 BlakeSharp 文件夹中找到。编译后的 BlakeSharp.dll 位于 Build/BlakeSharp/Release 中。
使用 BlakeSharp
这两个类(Blake256
和 Blake512
)都派生自 HashAlgorithm
.NET 基类。因此,这些类的使用方式与 .NET 框架中的其他哈希算法类完全相同,例如 SHA1Managed
或 SHA256Managed
。
一些使用示例
- 哈希字符串。要哈希字符串,您首先需要决定要使用哪种编码。编码定义了字符串字符如何映射到字节序列。
在测试向量中,字符串通常使用 ANSI 编码。可以使用 Encoding.Default
以 ANSI 编码字符串。因此,对 ANSI 编码字符串“The quick brown fox jumps over the lazy dog”进行哈希的代码可能如下所示:
string str = "The quick brown fox jumps over the lazy dog";
byte[] pbText = Encoding.Default.GetBytes(str);
Blake512 blake512 = new Blake512();
byte[] pbHash = blake512.ComputeHash(pbText);
pbHash
字节数组现在包含 BLAKE-512 哈希(64 字节)。
这里我们使用了接受 byte[]
的 ComputeHash
方法重载。这当然要求所有要哈希的数据都在内存中,这可能并非总是可行(例如,在哈希一个多 GB 文件时)。在这种情况下,下面的方法更实用。
ComputeHash
方法会自动重新初始化对象,即,如果您愿意,可以在之后立即再次调用它;不需要分配新的类实例。
FileStream fsIn = new FileStream(strFilePath,
FileMode.Open, FileAccess.Read, FileShare.Read);
Blake512 blake512 = new Blake512();
byte[] pbHash = blake512.ComputeHash(fsIn);
fsIn.Close();
这里我们使用了接受 Stream
的 ComputeHash
方法重载。此方法连续地从流中分块读取数据并对这些块进行哈希处理。由于内存中始终只需要保留一个块,因此此方法所需的内存非常少,适用于哈希多 GB 文件。
ComputeHash
方法会自动重新初始化对象,即,如果您愿意,可以在之后立即再次调用它;不需要分配新的类实例。
TransformBlock
和 TransformFinalBlock
方法。之后,可以使用 Hash
属性查询哈希。有关详细信息,请参阅 MSDN 上关于 HashAlgorithm
的文档。演示应用程序
可下载包包含一个名为 BlakeSharpDemo 的演示应用程序,它可以哈希字符串和文件。编译后的可执行文件 BlakeSharpDemo.exe 可以在 Build/BlakeSharpDemo/Release 中找到。
BlakeSharpDemo.exe 可以通过以下命令行参数调用
-f
-s
-t
-tf
-b256
-b512
此参数后的所有参数都将被解释为文件路径,应用程序将计算它们的 BLAKE-256 和 BLAKE-512 哈希。
此参数后的所有参数都将被解释为 ANSI 字符串,应用程序将计算它们的 BLAKE-256 和 BLAKE-512 哈希。
执行一个非常简单的自检。
此参数后的所有参数都将被解释为测试向量文件的文件路径。应用程序加载测试向量并验证是否计算了正确的哈希。
执行 Blake256
的基准测试。输出数字表示当前 PC 每秒可以哈希多少兆字节的数据。
执行 Blake512
的基准测试。输出数字表示当前 PC 每秒可以哈希多少兆字节的数据。
示例
- BlakeSharpDemo.exe -f MyFile.txt MyFile2.txt
- BlakeSharpDemo.exe -s "The quick brown fox jumps over the lazy dog"
计算并打印文件 MyFile.txt 和 MyFile2.txt 内容的 BLAKE-256 和 BLAKE-512 哈希。
输出如下
Text 'The quick brown fox jumps over the lazy dog' (encoding Windows-1252)
BLAKE-256:
7576698EE9CAD30173080678E5965916ADBB11CB5245D386BF1FFDA1CB26C9D7
BLAKE-512:
1F7E26F63B6AD25A0896FD978FD050A1766391D2FD0471A77AFB975E5034B7AD-
2D9CCF8DFB47ABBBE656E1B82FBC634BA42CE186E8DC5E1CE09A885D41F43451
当您将文件 ShortMsgKAT_512.txt 和 LongMsgKAT_512.txt(来自官方 BLAKE 规范包中的 KAT_MCT 文件夹)复制到 BlakeSharpDemo 应用程序目录并运行上述命令时,BlakeSharpDemo 将加载这两个测试向量文件并验证所有哈希。输出应为
Summary: 255 test vectors validated successfully, 0 errors.
Summary: 65 test vectors validated successfully, 0 errors.
BlakeSharpDemo 支持解析和检查所有测试向量文件,但 MonteCarlo_*.txt 文件除外(对这些文件的解析支持可能会在 BlakeSharpDemo 的后续版本中添加)。
要在 Mono (Linux / Mac OS X / ...) 下运行 BlakeSharpDemo,请在上述命令行前加上“mono
”。
就是这样!祝您哈希愉快!
版本历史
- 版本 1.0 - 2011-11-20
- 初始发布(实现 BLAKE v1.4)。