Dlaczego algorytm MacTripleDes nie jest stabilny w programie PowerShell?

14

Sprawdzam skróty plików za pomocą kilku różnych algorytmów w PowerShell. Kiedy używam MacTripleDes, zawsze otrzymuję różne skróty. Wszystkie pozostałe, takie jak SHA256 lub MD5, zawsze dają wiarygodne odpowiedzi. Możesz być w stanie replikować problem na własnym komputerze:

"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

Otrzymuję te same wartości skrótu dla pierwszych dwóch skrótów, ale różne wartości dla dwóch pozostałych skrótów. Czy MacTripleDes powinien być używany inaczej?

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   
użytkownik6722022
źródło
3
MACTripleDES jest kluczowym algorytmem mieszającym. Polecenie Get-FileHashcmdlet nie obsługuje kluczowego parametru.
jscott,
To brzmi jak błąd. Ten komentarz wydaje się być najlepszą odpowiedzią. Ale nie widzę, jak to oznaczyć.
user6722022,

Odpowiedzi:

18

MACTripleDES różni się od innych algorytmów oferowanych przez Get-FileHashcmdlet. Szczerze mówiąc, nie jestem pewien, dlaczego został zawarty w poleceniu cmdlet. Nie pasuje do innych, IMO.

SHA1, SHA256, MD5, RIPEMD itp. Są to wszystkie zwykłe funkcje mieszające. Pobierają niektóre dane o dowolnej długości i tworzą zestaw o stałej długości, który reprezentuje te dane. MACTripleDES jest jednak inny, ponieważ nie jest to tylko algorytm mieszający. Ma w nazwie TripleDES, a 3DES jest algorytmem szyfrującym, a nie algorytmem mieszającym. Największa różnica między funkcjami skrótu a funkcjami szyfrowania polega na tym, że szyfrowanie można odwrócić za pomocą klucza. Hashe to funkcje jednokierunkowe.

A MAC oznacza kod uwierzytelnienia wiadomości. Jest to kod służący do uwierzytelnienia wiadomości. Aby sprawdzić, czy nie zostało zmienione. MAC są zaprojektowane tak, aby były efemeryczne lub unikalne w zależności od wiadomości.

Sprawdź konstruktora :

 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 generuje liczby losowe ... liczby losowe oznaczają, że wynik będzie inny przy każdym uruchomieniu.

Ryan Ries
źródło
Tak, tutaj jest całkiem bezużyteczne. W prawidłowym użyciu albo przekażesz znany konstruktor do konstruktora, albo odzyskasz losowy klucz z KeyedHashAlgorithmobiektu. Ale nie ma też nic wspólnego z Get-FileHash...
Bob
1
Jeśli Get-FileHashnie pozwala ci określić klucza do użycia i zamiast tego generuje losowy klucz, którego nigdy nie ujawnia użytkownikowi, wydaje się, że jest to błąd (jak w oryginalnym tytule pytania), ponieważ nie możesz go użyć to na wszystko. (Nie to, że rozumiem, dlaczego miałbyś wybrać MACTripleDES w pierwszej kolejności, jeśli chcesz MAC.)
Håkan Lindqvist,
@ HåkanLindqvist Rozumiem twój punkt widzenia, ale zależy to od twojej definicji błędu. Jeśli kod działa tak, jak powinien, nawet jeśli robi coś zupełnie bezużytecznego , to nadal nie jest to błąd w mojej książce. Jest to prośba o zmianę projektu, tj. „Zmień polecenie cmdlet, aby faktycznie zrobiło coś pożytecznego”. :)
Ryan Ries,
@RyanRies Nawet wtedy, czy naprawdę uzasadnione jest założenie, że jest to zamierzone? Czy jest coś poza samym kodem i jego zachowaniem, które wspierają ideę, że opcja algorytmu MACTripleDES Get-FileHashpowinna być jakąś formą zawiłego RNG?
Håkan Lindqvist,