2013-03-10 45 views
5

Tôi đang tìm kiếm câu trả lời nhưng không thể tìm thấy câu trả lời ở đây. Xin lỗi nếu câu hỏi này đã được hỏi.PHP mcrypt_encrypt/mcrypt_decrypt issue, trả về một giá trị khác

Tôi có một mã đơn giản mã hóa và giải mã một chuỗi, chuỗi trông giống nhau, nhưng khi so sánh chúng bằng == họ dường như không giống nhau, vì vậy băm khác nhau cũng ..

Dưới đây là mã của tôi:

$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"; 

Trên trang:

rompish rompish NOPE

Xin vui lòng cho tôi biết những gì tôi đang làm sai.

Cảm ơn bạn!

+2

AES luôn mã hóa mọi thứ theo khối 16 byte. Rõ ràng 'mcrypt_encrypt' đệm chuỗi bằng 0 byte cho đến khi nó là bội số của 16.' mcrypt_decrypt' dutifully decrypts này nhưng thiếu thông tin để loại bỏ padding. Và bạn đang lừa mình vì các giá trị được hiển thị trông giống nhau mặc dù 'oppa_dec' thực sự kết thúc bằng 9 byte không. Thay vào đó, hãy sử dụng lược đồ đệm hợp lý. –

+0

Đó là một câu trả lời, không phải là một bình luận, GregS (làm cho nó như vậy hoặc tôi sẽ đăng nó bao gồm cả tên của bạn ở cuối: P) –

Trả lời

2

AES luôn mã hóa mọi thứ theo khối 16 byte. Rõ ràng là mcrypt_encrypt sẽ bỏ chuỗi bằng không có byte cho đến khi nó là một số nhiều của 16. mcrypt_decrypt dutifully giải mã này nhưng thiếu thông tin để loại bỏ phần đệm. Và bạn đang lừa mình vì các giá trị được hiển thị trông giống nhau mặc dù oppa_dec thực sự kết thúc bằng 9 byte không. Thay vào đó, hãy sử dụng lược đồ đệm hợp lý . - GregS

Để xóa các ký tự rỗng này, bạn có thể sử dụng chức năng rtrim. Sau khi chạy đầu ra được giải mã thông qua đó nó phải bằng nhau.

Các vấn đề liên quan