P粉0142181242023-08-31 10:27:11
函数 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);
尽管缺少函数 str2ByteArray()
,但其功能可以推断出来。由于在您的示例中,密文是十六进制编码的,所以这个函数似乎只是执行十六进制解码。在PHP中,与 str2ByteArray()
相对应的是 hex2bin()
。
因此,解密的可能实现方式是(使用PHP/OpenSSL):
rrreee这些输入数据在Java代码中返回相同的明文!
与您的代码的差异:
您的代码使用了已弃用的 mcrypt
。出于安全原因,现在不应该使用它。一个更好的替代方案是PHP/OpenSSL,如上面的代码所示。此外,实现的密钥派生是错误的,例如它应用了MD5摘要,在Java代码中根本没有使用。
安全性:
尽管这可能是一个旧的应用程序,但还是有几点关于安全性的说明:
build3DesKey()
是不安全的。如果密钥材料是一个字符串,它通常不是一个密钥,而是一个密码。因此,应该使用可靠的密钥派生函数,例如Argon2或PBKDF2。