3

我试图了解散列算法的工作原理,特别是 SHA3-512。为了了解它是如何工作的,我在 Google 中搜索了代码并遇到了Hashlib。该代码不起作用,因为我没有 Hashlib 库(不确定应该调用什么)。我怎样才能得到它,它是在 C# 中应用 SHA3-512 的唯一方法吗?

我想知道的一些基本的事情,

  1. 是什么Hashlib

  2. 是图书馆吗?

  3. 的输出结果/工作过程/功能是否Hashlib相同System.Security.Cryptography.HashAlgorithm?如果不是,那么它们之间有什么区别?

编辑:很抱歉从中间删除了几个问题。因为我觉得他们不再需要在这里展示了。

4

2 回答 2

8

注: 2017 年更新。

哈希库

Hashlib 是一个哈希实现库:

https://hashlib.codeplex.com/

它包括相当多的加密和非加密哈希的实现——.NET 框架(in 中System.Security.Cryptography)已经支持的和不支持的。您将需要它(或其他外部实现)来支持 SHA-3。

但是请注意,Hashlib 实际上并没有在其最终形式中包含 SHA-3,而是在对其进行一些调整之前的样子。这意味着,它的输出不会是您对 SHA-3 的期望。

HashLib 的HashAlgorithm哈希算法使用与.NET 不同的体系结构- 输出是相同的(对于相同的算法,例如SHA256),用法不同。但它有一个包装器/适配器,可以使工作流程与 for 相同HashAlgorithm,例如:

IHash hash = HashFactory.Crypto.SHA3.CreateKeccak512();
HashAlgorithm hashAlgo = HashFactory.Wrappers.HashToHashAlgorithm(hash);
// Now hashAlgo can be used the same as any .NET HashAlgorithm, e.g.:

// Create byte input from string encoded as UTF-8
byte[] input = Encoding.UTF8.GetBytes("Hello Keccak!");

byte[] output = hashAlgo.ComputeHash(bytes);

但同样,请注意它Keccak512与 SHA-3 不同 - 它不会提供与实际 512 位 SHA-3 实现相同的哈希值。

C# 中最终 SHA-3 的实际实现仍然很少(2017 年) - 与在 Hashlib 中实现的 Keccak 的差异非常小,尽管它对输出有重大影响,就像哈希算法的情况一样- 由于 Wikipedia 不再提供差异示例,因此这里有一个示例:

Keccak-512('abc') =
Keccak[1024]('abc', 512) =
    18 58 7d c2 ea 10 6b 9a 15 63 e3 2b 33 12 42 1c
    a1 64 c7 f1 f0 7b c9 22 a9 c8 3d 77 ce a3 a1 e5
    d0 c6 99 10 73 90 25 37 2d c1 4a c9 64 26 29 37
    95 40 c1 7e 2a 65 b1 9d 77 aa 51 1a 9d 00 bb 96

SHA3-512('abc') =
Keccak[1024]('abc' || 01, 512) =
    b7 51 85 0b 1a 57 16 8a 56 93 cd 92 4b 6b 09 6e
    08 f6 21 82 74 44 f7 0d 88 4f 5d 02 40 d2 71 2e
    10 e1 16 e9 19 2a f3 c9 1a 7e c5 76 47 e3 93 40
    57 34 0b 4c f4 08 d5 a5 65 92 f8 27 4e ec 53 f0

Keccak[c](M || s, d)表示“具有容量 c消息 M后缀位 s输出大小 的Keccak d”。

这(来自维基百科文章)是“标准”Keccak(和 Hashlib 的实现)和 SHA-3 之间的唯一区别,因为它在当前规范中看起来:

对于 SHA3-n,额外的两位 01 在填充之前附加到消息中。

但是,在不知道 Hashlib 是如何工作的情况下,实现它(例如通过修补 Hashlib 代码)并非易事。

那么,您应该使用 SHA-3 吗?

这取决于您想要它的用途 - 如果您想要与最终确定的 SHA-3 标准兼容,那就不好了。

整个 Keccak 系列,独立于 SHA-3,本身就是一个标准 - 但 NIST 对 SHA-3 的调整仍然是 Keccak - 只是它的一个特定子集(很像 AES 是 Rijndael 的一个子集)。当 SHA-3 最终出现在 - 例如 - .NET 框架本身时,它可能只是带有 NIST 选择的参数的 SHA-3,而不是带有可调整参数的通用 Keccak。

SHA-512(对现已删除的部分问题的回答)

SHA-512 是SHA-2 512 位 -SHA-3 512 不同。也就是说,要使用它,您只需导入System.Security.Cryptography-using在这种情况下导入命名空间- 使命名空间内的类可用于您的代码。

之后,工作流程与任何其他HashAlgorithm.

那么,我应该使用 SHA-2 还是 SHA-3 来散列密码?

他们俩都没有。或者至少不是靠他们自己。虽然盐可以改善问题,但这也不是最佳的安全性。请参阅如何安全地散列密码,特别是从以下内容开始:

基本散列函数,即使作为散列函数是安全的,也不适合密码散列

于 2014-06-07T15:02:59.777 回答
3

什么是哈希库

基本上它是一个实现许多散列算法的库。

是图书馆吗?

是的

Hashlib 和 System.Security.Cryptography.HashAlgorithm 的输出结果/工作过程/功能是否相同?如果不是,那么它们之间有什么区别?

是的。

Hashlib 提供了HashLib.HashFactory.Wrappers可用于将 hashlib 提供的实现转换为System.Security.Cryptography.HashAlgorithm

可以这样使用。

IHash hash = HashFactory.Crypto.CreateSHA256();
System.Security.Cryptography.HashAlgorithm algorith = HashLib.HashFactory.Wrappers.HashToHashAlgorithm(hash);
于 2014-06-07T15:05:03.563 回答