为什么PowerShell中的MacTripleDes算法输出不稳定?

为什么PowerShell中的MacTripleDes算法输出不稳定?

我在 powershell 中使用几种不同的算法检查文件哈希值。当我使用 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   

答案1

MACTripleDES 与 cmdlet 提供的其他算法不同Get-FileHash。老实说,我不确定为什么它会包含在 cmdlet 中。在我看来,它与其他算法不相符。

SHA1、SHA256、MD5、RIPEMD 等都是常规哈希函数。它们采用任意长度的数据并创建表示该数据的固定长度摘要。但 MACTripleDES 有所不同,因为它不仅仅是一种哈希算法。它的名称中包含 TripleDES,而 3DES 是一种加密算法,而不是哈希算法。哈希函数和加密函数之间的最大区别在于,加密可以用密钥逆转。哈希是单向函数。

MAC 代表消息认证码。它是用来认证消息的代码。用于验证消息是否被篡改。MAC 被设计为在每条消息之间都是短暂的或唯一的。

查看构造函数

 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 生成随机数...随机数意味着每次运行的结果都会不同。

相关内容