web-dev-qa-db-ja.com

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

最初の2つのハッシュのハッシュ値は同じですが、2番目の2つのハッシュの値は異なります。 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   
14
user6722022

MACTripleDESは、Get-FileHashコマンドレットによって提供される他のアルゴリズムとは異なります。正直なところ、それがコマンドレットに含まれていた理由がわかりません。他の人には合いません、IMO。

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は乱数を生成します...乱数は、実行ごとに結果が異なることを意味します。

18
Ryan Ries