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由两个类组成,分别实现了BLAKE的两个主要实例:Blake256类实现了BLAKE的256位版本(BLAKE-256,产生一个256位=32字节长的哈希),Blake512类实现了BLAKE的512位版本(BLAKE-512,产生一个512位=64字节长的哈希)。这两个类是相互独立的(即,当只需要256位版本时,不需要包含512位代码,反之亦然)。
可以通过两种不同的方式将BlakeSharp包含在项目中:
Blake256.cs和Blake512.cs可以在可下载包的BlakeSharp文件夹中找到。编译后的BlakeSharp.dll位于Build/BlakeSharp/Release目录中。
这两个类(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可以通过以下命令行参数调用:
示例:
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"。