為什麼 Mcrypt 和 OpenSSL 對 Blowfish-ECB 產生不同的加密結果?

Barbara Streisand
發布: 2024-11-20 19:10:16
原創
706 人瀏覽過

Why Do Mcrypt and OpenSSL Produce Different Encryption Results for Blowfish-ECB?

用 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板