2013-03-10 9 views
5

Szukałem odpowiedzi, ale nie mogłem jej znaleźć tutaj. Proszę wybaczyć, jeśli to pytanie zostało już zadane.PHP mcrypt_encrypt/mcrypt_decrypt problem, zwraca inną wartość

mam prosty kod szyfrowania i odszyfrowywania ciąg, ciągi wyglądają tak samo, ale porównując je za pomocą == oni nie wydają się być takie same, więc hashe są różne, jak dobrze ..

Tutaj mój kod:

$oppa = "rompish"; 
$opp_enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, "key", $oppa, MCRYPT_MODE_ECB); 
$opp_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, "key", $opp_enc, MCRYPT_MODE_ECB); 

echo $oppa."<br />".$opp_dec."<br />"; 

if ($oppa == $opp_dec) echo "YAY"; else echo "NOPE"; 

na stronie:

rompish rompish NOPE

Proszę powiedz mi, co robię źle.

Dziękujemy!

+2

AES zawsze szyfruje rzeczy w blokach po 16 bajtów. Najwyraźniej 'mcrypt_encrypt' umieszcza ciąg znaków na zero bajtów, dopóki nie jest wielokrotnością 16.' mcrypt_decrypt' sumiennie odszyfrowuje to, ale brakuje informacji do usunięcia dopełnienia. I oszukujesz się, ponieważ wyświetlane wartości wyglądają tak samo, chociaż 'oppa_dec' faktycznie kończy się na 9 zerowych bajtach. Zamiast tego użyj rozsądnego schematu dopełnienia. –

+0

To jest odpowiedź, a nie komentarz, GregS (spraw, żeby tak było lub opublikuję to, łącznie z twoim imieniem na końcu: P) –

Odpowiedz

2

AES zawsze szyfruje rzeczy w blokach po 16 bajtów. Wygląda na to, że mcrypt_encrypt wyrzuca ciąg znaków z zerową bajtową liczbą aż do wielokrotności 16. mcrypt_decrypt sumiennie odszyfrowuje to, ale brakuje informacji o w celu usunięcia dopełnienia. I oszukujesz siebie, ponieważ wyświetlane wartości wyglądają tak samo, mimo że oppa_dec w rzeczywistości kończą się 9 zerami bajtów. Zamiast tego użyj rozsądnego schematu dopełnienia. - GregS

Aby usunąć te pustych znaków, można użyć funkcji rtrim. Po uruchomieniu odszyfrowanego wyjścia przez to powinno być równe.