Rumah > Soal Jawab > teks badan
P粉0142181242023-08-31 10:27:11
Fungsi build3DesKey()
将一个太短的3DES密钥扩展到24个字节,通过在末尾填充0x00值,对于太长的密钥,末尾会被简单地截断。在PHP中,可以如下实现 build3DesKey()
:
$key = substr(str_pad($key, 24, "$key = "12345"; $ciphertext = "84b24172c57752385251d142abadbed1d9945301a3aee429ce00c1e291a605c30ad18c5e00007f6db394fc6138a2ee4c"; $key = substr(str_pad($key, 24, "rrreee"), 0, 24); $plaintext = openssl_decrypt(hex2bin($ciphertext), "des-ede3", $key, OPENSSL_RAW_DATA); print($plaintext. PHP_EOL); // The quick brown fox jumps over the lazy dog"), 0, 24);
Walaupun kekurangan fungsi str2ByteArray()
,但其功能可以推断出来。由于在您的示例中,密文是十六进制编码的,所以这个函数似乎只是执行十六进制解码。在PHP中,与 str2ByteArray()
相对应的是 hex2bin()
.
Jadi kemungkinan pelaksanaan penyahsulitan adalah (menggunakan PHP/OpenSSL):
rrreeeData input ini mengembalikan teks biasa yang sama dalam kod Java!
Perbezaan dari kod anda:
Kod anda menggunakan mcrypt
yang telah ditamatkan. Atas sebab keselamatan, ia tidak sepatutnya digunakan sekarang. Alternatif yang lebih baik ialah PHP/OpenSSL, seperti yang ditunjukkan dalam kod di atas. Tambahan pula, terbitan kunci yang dilaksanakan adalah salah, cth. ia menggunakan MD5 digest, yang tidak digunakan sama sekali dalam kod Java.
Keselamatan:
Walaupun ini mungkin apl lama, beberapa nota tentang keselamatan:
build3DesKey()
adalah tidak selamat. Jika bahan utama adalah rentetan, ia biasanya bukan kunci tetapi kata laluan. Oleh itu, fungsi terbitan kunci yang boleh dipercayai seperti Argon2 atau PBKDF2 harus digunakan.