为什么PowerShell中的MacTripleDesalgorithm输出不稳定?

我在PowerShell中使用几种不同的algorithm检查文件散列。 当我使用MacTripleDes时,我总是得到不同的哈希。 所有其他的,如SHA256或MD5总是给出可靠的答案。 您可以在自己的计算机上复制问题:

"this is a test" | out-file test.txt get-filehash test.txt -algorithm sha256 get-filehash test.txt -algorithm sha256 get-filehash test.txt -algorithm mactripledes get-filehash test.txt -algorithm mactripledes 

我得到了前两个哈希值相同的哈希值,但是后两个哈希值却不同。 MacTripleDes应该被用于不同的?

 Algorithm Hash Path --------- ---- ---- SHA256 3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51 C:\temp\test.txt SHA256 3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51 C:\temp\test.txt MACTRIPLEDES 904D74A529C7A739 C:\temp\test.txt MACTRIPLEDES AF720778A2C878A2 C:\temp\test.txt 

MACTripleDES与Get-FileHash cmdlet提供的其他algorithm不同。 我不确定为什么它包含在cmdlet中,说实话。 它不适合其他人,国际海事组织。

SHA1,SHA256,MD5,RIPEMD等,这些都是常规的散列函数。 他们采取一些任意长度的数据,并创build一个代表数据的固定长度的摘要。 MACTripleDES是不同的,因为它不只是一个哈希algorithm。 它的名称中有TripleDES,3DES是encryptionalgorithm,而不是散列algorithm。 哈希函数和encryption函数最大的区别是encryption可以通过一个关键字来反转。 哈希是单向函数。

MAC代表消息authentication码。 这是一个用来validation消息的代码。 validation它没有被篡改。 从一个消息到另一个消息,MAC被devise成短暂的或独特的。

看看构造函数 :

  public MACTripleDES() { KeyValue = new byte[24]; Utils.StaticRandomNumberGenerator.GetBytes(KeyValue); // Create a TripleDES encryptor des = TripleDES.Create(); HashSizeValue = des.BlockSize; m_bytesPerBlock = des.BlockSize/m_bitsPerByte; // By definition, MAC-CBC-3DES takes an IV=0. C# zero-inits arrays, // so all we have to do here is define it. des.IV = new byte[m_bytesPerBlock]; des.Padding = PaddingMode.Zeros; ... 

StaticRandomNumberGenerator生成随机数…随机数意味着每次运行的结果都会不同。