BLAKE算法的C#实现:BlakeSharp

BlakeSharp是一个用C#编写的BLAKE算法实现,属于公共领域,这意味着可以自由地在项目中包含/使用它,包括商业项目。如果使用了它,在程序文档中提及作者会是一个很好的做法,但这不是强制性的。

BLAKE是一种密码学安全的单向哈希函数,由Jean-Philippe Aumasson、Luca Henzen、Willi Meier和Raphael C.-W. Phan设计。BLAKE是NIST的SHA-3竞赛的五个最终入围者之一。

有关BLAKE的更多信息,请访问。BlakeSharp是基于BLAKE的参考C实现派生的。所有代码都已用C#重写,即现在只使用托管代码,不使用原生或不安全代码。因此它是可移植的,在.NET(Windows)和Mono(Linux / Mac OS X / ...)下运行良好。

如何在项目中包含BlakeSharp

BlakeSharp由两个类组成,分别实现了BLAKE的两个主要实例:Blake256类实现了BLAKE的256位版本(BLAKE-256,产生一个256位=32字节长的哈希),Blake512类实现了BLAKE的512位版本(BLAKE-512,产生一个512位=64字节长的哈希)。这两个类是相互独立的(即,当只需要256位版本时,不需要包含512位代码,反之亦然)。

可以通过两种不同的方式将BlakeSharp包含在项目中:

  • 包含源代码。如果项目是用C#编写的,可以直接将BlakeSharp文件复制/包含到项目中。
  • 引用BlakeSharp程序集。如果项目是用另一种.NET语言编写的,可以在项目中引用BlakeSharp程序集(BlakeSharp.dll文件)。

Blake256.cs和Blake512.cs可以在可下载包的BlakeSharp文件夹中找到。编译后的BlakeSharp.dll位于Build/BlakeSharp/Release目录中。

使用BlakeSharp

这两个类(Blake256和Blake512)是从.NET基础类HashAlgorithm派生的。因此,这些类的使用方式与其他.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的演示应用程序,可以哈希字符串和文件。可以在Build/BlakeSharpDemo/Release目录中找到编译后的可执行文件BlakeSharpDemo.exe。

BlakeSharpDemo.exe可以通过以下命令行参数调用:

  • -f 所有随后的参数被解释为文件路径,应用程序计算它们的BLAKE-256和BLAKE-512哈希。
  • -s 所有随后的参数被解释为ANSI字符串,应用程序计算它们的BLAKE-256和BLAKE-512哈希。
  • -t 执行一个非常基础的自测试。
  • -tf 所有随后的参数被解释为测试向量文件的路径。应用程序加载测试向量并验证计算出的哈希是否正确。
  • -b256 执行Blake256的基准测试。输出的数字表示当前PC上每秒可以哈希多少兆字节的数据。
  • -b512 执行Blake512的基准测试。输出的数字表示当前PC上每秒可以哈希多少兆字节的数据。

示例:

BlakeSharpDemo.exe -f MyFile.txt MyFile2.txt

计算并打印文件MyFile.txt和MyFile2.txt的内容的BLAKE-256和BLAKE-512哈希。

BlakeSharpDemo.exe -s "The quick brown fox jumps over the lazy dog"

输出如下:

Text 'The quick brown fox jumps over the lazy dog' (encoding Windows-1252) BLAKE-256: 7576698EE9CAD30173080678E5965916ADBB11CB5245D386BF1FFDA1CB26C9D7 BLAKE-512: 1F7E26F63B6AD25A0896FD978FD050A1766391D2FD0471A77AFB975E5034B7AD- 2D9CCF8DFB47ABBBE656E1B82FBC634BA42CE186E8DC5E1CE09A885D41F43451 BlakeSharpDemo.exe -tf ShortMsgKAT_512.txt LongMsgKAT_512.txt

当将文件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"。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485