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

C# 中的 Tiger 哈希实现

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (20投票s)

2011 年 1 月 21 日

GPL3

2分钟阅读

viewsIcon

63149

downloadIcon

1541

C# 虎哈希实现,可通过 dotnet 的 HashAlgorithm 类调用

引言

这套纯 C# 类实现了密码学虎哈希算法。它继承自 .NET 的 HashAlgorithm 类,因此可以在任何已经使用 .NET 内置哈希函数的地方直接使用。虽然不如 C++ 或 ASM 生成的本机机器代码快,但它仍然比我找到的其他 C# 实现快约 30% (2010 年)。

为了避免预先制作的 S-box 表占用源代码空间,这些表在首次使用时生成,在当前硬件上大约需要 1 毫秒 (2022 年)。

该程序已经使用多种不同的二进制文件进行了测试,并且测试了 Tiger 算法创建者提供的的大部分测试向量。

背景

密码学哈希将任意长度的数据块(例如,密码、文件)映射到固定长度的哈希值,作为一个单向函数(=不可逆)。

Tiger 算法设计于 1995 年,因此已经有足够的时间进行充分分析,并且迄今为止,尚未发现针对完整 24 轮 Tiger 算法的成功攻击。始终建议查阅维基百科或哈希函数休息室,以检查自本文撰写以来是否发现了新的漏洞。

其安全级别与 RIPEMD-160 或 SHA-256 相当。它处理完整的 512 位输入数据块,并产生 192 位的哈希值输出。不符合 512 位边界的输入数据(通常是这种情况)将相应地填充。

Tiger 算法本身是针对 64 位优化的算法,但仍然可以在较窄的总线上良好运行。此实现进行了一些优化,这些优化不会明显降低 64 位性能,但可以极大地帮助 32 位系统。

底层的密码学设计基本上在 维基百科 上有所描述,并在发明者的 网页 上有更详细的描述。S-Box 的数据取自参考实现。

一些功能(例如,FileStream 处理)由 .NET Framework 通过抽象的 HashAlgorithm 基类提供。

Using the Code

该类不是直接创建/实例化,而是通过抽象的 HashAlgorithm 类使用/调用。

using System.Security.Cryptography;
using Tiger=SoftwareUnion.Tiger;

HashAlgorithm myhash;

switch(AlgorithmToUse)
{   case "MD5":   myhash=new MD5CryptoServiceProvider();
    case "TIGER": myhash=new Tiger();  // <<-- create the object
// [...]
    default: throw new NotImplementedException();
}

// vv-- then ask framework's HashAlgorithm class to
//      coordinate and call our own class methods
myhash.ComputeHash( File.OpenRead("myfile.bin") );

byte[] the_hash_result=myhash.HashValue;

Tiger 算法有一个版本 2,它仅在填充值上有所不同,将 0x01 升级为 0x80(ProcessFinalBlock 函数中已经有注释说明)。

历史

  • 2011 年 1 月 21 日:测试完成,公开发布
  • 2012 年 3 月 9 日:添加了一些网络链接
  • 2022 年 6 月 28 日:首次使用 S-box 创建
© . All rights reserved.