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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (32投票s)

2011年11月20日

CPOL

5分钟阅读

viewsIcon

56698

downloadIcon

1543

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.csBlake512.cs 可以在可下载包的 BlakeSharp 文件夹中找到。编译后的 BlakeSharp.dll 位于 Build/BlakeSharp/Release 中。

使用 BlakeSharp

这两个类(Blake256Blake512)都派生自 HashAlgorithm .NET 基类。因此,这些类的使用方式与 .NET 框架中的其他哈希算法类完全相同,例如 SHA1ManagedSHA256Managed

一些使用示例

  • 哈希字符串。要哈希字符串,您首先需要决定要使用哪种编码。编码定义了字符串字符如何映射到字节序列。
  • 在测试向量中,字符串通常使用 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();

    这里我们使用了接受 StreamComputeHash 方法重载。此方法连续地从流中分块读取数据并对这些块进行哈希处理。由于内存中始终只需要保留一个块,因此此方法所需的内存非常少,适用于哈希多 GB 文件。

    ComputeHash 方法会自动重新初始化对象,即,如果您愿意,可以在之后立即再次调用它;不需要分配新的类实例。

  • 自行哈希。如果您想(分块)将数据自行输入到哈希算法中,可以使用 TransformBlockTransformFinalBlock 方法。之后,可以使用 Hash 属性查询哈希。有关详细信息,请参阅 MSDN 上关于 HashAlgorithm 的文档。

演示应用程序

可下载包包含一个名为 BlakeSharpDemo 的演示应用程序,它可以哈希字符串和文件。编译后的可执行文件 BlakeSharpDemo.exe 可以在 Build/BlakeSharpDemo/Release 中找到。

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.txtMyFile2.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.txtLongMsgKAT_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)。
© . All rights reserved.