用 OpenSSL 取代 Mcrypt
問題: 將應用程式從使用 Mcrypt 遷移到 OpenSSL 進行資料加密。加密密碼為Blowfish,模式為電子密碼本(ECB)。然而,儘管具有相同的參數,Openssl_encrypt 和 Openssl_decrypt 函數的輸出與 MCrypt 對應函數的輸出不同。
原因:
差異是由 MCrypt 使用的不同填充演算法引起的。 Mcrypt 和 OpenSSL。 Mcrypt 使用 PKCS#5 填充,而 OpenSSL 使用 PKCS#7 填充。 PKCS#7 填充需要至少 1 個位元組的填充,而 PKCS#5 填充允許 0 個位元組的填充長度。此外,Mcrypt 需要 ECB 模式的初始化向量 (IV),即使 ECB 模式不需要 IV。
解決方案:
要解決此問題,請執行以下任一操作:在使用MCrypt 函數之前手動使用PKCS#7 樣式填充來填充輸入數據,或使用正確的填充演算法重新加密資料。
這裡是使用PKCS#7 的問題中提供的程式碼的修改版本MCrypt 的填充:
$key = "anotherpassword1"; $str = "does it work 12"; $enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB); $dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB); echo(bin2hex($enc).PHP_EOL); var_dump($dec); $enc = openssl_encrypt($str, 'bf-ecb', $key, true); $dec = openssl_decrypt($enc, 'bf-ecb', $key, true); echo(bin2hex($enc).PHP_EOL); var_dump($dec);
透過在MCrypt 加密之前向輸入資料添加1 個位元組的填充, Mcrypt 和OpenSSL 函數的輸出將會匹配。注意ECB模式不需要IV,也沒有必要提供。
以上是為什麼 Mcrypt 和 OpenSSL 對 Blowfish-ECB 產生不同的加密結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!