Bagaimana untuk menyahsulit rentetan yang disulitkan dalam Java dalam PHP?
P粉083785014
P粉083785014 2023-08-30 12:12:13
0
1
483
<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>
P粉083785014
P粉083785014

membalas semua(1)
P粉014218124

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):

rrreee

Data 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:

  • Terbitan utama 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.
  • des-ede3 menggunakan mod ECB, yang juga tidak selamat. Penyulitan yang disahkan seperti AES-GCM kini harus digunakan.
  • 3DES/TripleDES sudah lapuk, dan satu-satunya varian yang belum lagi ditamatkan, Triple Length Key atau 3TDEA, juga akan ditamatkan tidak lama lagi dan agak perlahan. Standard hari ini adalah untuk menggunakan AES.
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!