Menggantikan Mcrypt dengan OpenSSL
Isu: Menghijrahkan aplikasi daripada menggunakan Mcrypt ke OpenSSL untuk penyulitan data. Sifir penyulitan ialah Blowfish dan modnya ialah Buku Kod Elektronik (ECB). Walau bagaimanapun, output daripada fungsi Openssl_encrypt dan Openssl_decrypt berbeza daripada rakan MCrypt, walaupun mempunyai parameter yang sama.
Punca:
Percanggahan timbul daripada algoritma pelapik berbeza yang digunakan oleh Mcrypt dan OpenSSL. Mcrypt menggunakan padding PKCS#5, manakala OpenSSL menggunakan padding PKCS#7. Pelapik PKCS#7 memerlukan minimum 1 bait padding, manakala padding PKCS#5 membenarkan panjang padding 0 bait. Selain itu, Mcrypt memerlukan Vektor Permulaan (IV) untuk mod ECB, walaupun IV tidak diperlukan untuk mod ECB.
Penyelesaian:
Untuk menyelesaikan isu, sama ada pad data input secara manual dengan padding gaya PKCS#7 sebelum menggunakan fungsi MCrypt atau sulitkan semula data menggunakan padding yang betul algoritma.
Berikut ialah versi ubah suai kod yang disediakan dalam soalan yang menggunakan padding PKCS#7 untuk 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);
Dengan menambahkan 1 byte padding pada data input sebelum MCrypt penyulitan, output daripada kedua-dua fungsi Mcrypt dan OpenSSL akan sepadan. Ambil perhatian bahawa mod ECB tidak memerlukan IV, dan tidak perlu menyediakannya.
Atas ialah kandungan terperinci Mengapa Mcrypt dan OpenSSL Menghasilkan Keputusan Penyulitan Berbeza untuk Blowfish-ECB?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!