Bagaimana untuk menyahsulit rentetan yang disulitkan dalam Java dalam PHP?
P粉083785014
2023-08-30 12:12:13
<p>Saya cuba menyahsulit rentetan yang disulitkan dalam JAVA menggunakan kod berikut. </p>
<pre class="lang-java prettyprint-override"><code>SecretKey secretKey = SecretKeySpec baharu(build3DesKey(key), "DESede");
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] b = cipher.doFinal(str2ByteArray(dest));
Penyahkod rentetan = Rentetan baharu(b, "utf-8");
</code></pre>
<pre class="lang-java prettyprint-override"><kod>bait statik peribadi[] build3DesKey(String keyStr) melontar Exception {
kekunci bait[] = bait baharu[24];
byte[] temp = keyStr.getBytes("utf-8");
if (key.length > temp.length) {
System.arraycopy(temp, 0, key, 0, temp.length);
} lain {
System.arraycopy(temp, 0, key, 0, key.length);
}
kunci pulangan;
}
</code></pre>
<p>Bagaimanakah saya boleh mendapatkan hasil yang sama dalam versi PHP? Saya cuba menulisnya dalam PHP, tetapi outputnya salah. </p>
<pre class="brush:php;toolbar:false;">$data = '69C16E8142F2BDDE7569842BB0D68A3176624264E...';
$key = 'rpwdvbppnrvr56m123+#';
fungsi menyahsulit($data, $rahsia)
{
//jana kunci daripada hash
$key = md5(utf8_encode($rahsia), benar);
//Tambahkan 8 bait pertama $key ke penghujung $key.
$key .= substr($key, 0, 8);
$data = base64_decode($data);
$data = mcrypt_decrypt('tripledes', $key, $data, 'ecb');
$block = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = ord($data[$len-1]);
return substr($data, 0, strlen($data) - $pad);
}
var_dump(utf8_encode(Decrypt ($data, $key)));</pre></p>
Fungsi
build3DesKey()
将一个太短的3DES密钥扩展到24个字节,通过在末尾填充0x00值,对于太长的密钥,末尾会被简单地截断。在PHP中,可以如下实现build3DesKey()
: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.