Comment décrypter une chaîne cryptée en Java en PHP ?
P粉083785014
P粉083785014 2023-08-30 12:12:13
0
1
480
<p>J'essaie de déchiffrer une chaîne cryptée en JAVA à l'aide du code suivant. </p> <pre class="lang-java Prettyprint-override"><code>SecretKey secretKey = new SecretKeySpec(build3DesKey(key), "DESede"); Cipher cipher = Cipher.getInstance("DESede"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] b = cipher.doFinal(str2ByteArray(dest)); Décodeur de chaînes = new String(b, "utf-8"); </code></pre> <pre class="lang-java Prettyprint-override"><code>private static byte[] build3DesKey(String keyStr) lève une exception { clé d'octet[] = nouvel octet[24]; byte[] temp = keyStr.getBytes("utf-8"); if (key.length > temp.length) { System.arraycopy(temp, 0, key, 0, temp.length); } autre { System.arraycopy(temp, 0, clé, 0, clé.longueur); } clé de retour ; } </code></pre> <p>Comment obtenir les mêmes résultats dans la version PHP ? J'ai essayé de l'écrire en PHP, mais le résultat était faux. </p> <pre class="brush:php;toolbar:false;">$data = '69C16E8142F2BDDE7569842BB0D68A3176624264E...'; $clé = 'rpwdvbppnrvr56m123+#'; fonction décrypter($data, $secret) { // générer une clé à partir du hachage $key = md5(utf8_encode($secret), vrai); //Ajoute les 8 premiers octets de $key à la fin de $key. $key .= substr($key, 0, 8); $données = base64_decode($données); $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb'); $block = mcrypt_get_block_size('tripledes', 'ecb'); $len = strlen($données); $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

répondre à tous(1)
P粉014218124

Fonction 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);

Malgré le manque de fonctions str2ByteArray(),但其功能可以推断出来。由于在您的示例中,密文是十六进制编码的,所以这个函数似乎只是执行十六进制解码。在PHP中,与 str2ByteArray() 相对应的是 hex2bin().

Une implémentation possible du décryptage est donc (en utilisant PHP/OpenSSL) :

rrreee

Ces données d'entrée renvoient le même texte brut en code Java !


Différence par rapport à votre code :
Votre code utilise le mcrypt obsolète. Pour des raisons de sécurité, il ne faut pas l'utiliser maintenant. Une meilleure alternative est PHP/OpenSSL, comme indiqué dans le code ci-dessus. De plus, la dérivation de clé implémentée est erronée, par exemple elle applique le résumé MD5, qui n'est pas du tout utilisé dans le code Java.


Sécurité :
Bien qu'il s'agisse peut-être d'une ancienne application, quelques remarques sur la sécurité :

  • La dérivation de clé build3DesKey() n'est pas sécurisée. Si le matériel de clé est une chaîne, il ne s’agit généralement pas d’une clé mais d’un mot de passe. Par conséquent, une fonction de dérivation de clé fiable telle que Argon2 ou PBKDF2 doit être utilisée.
  • des-ede3 applique le mode ECB, qui est également dangereux. Un cryptage authentifié tel que AES-GCM doit désormais être utilisé.
  • 3DES/TripleDES est obsolète, et la seule variante non encore obsolète, Triple length Key ou 3TDEA, sera également bientôt obsolète et est relativement lente. La norme actuelle consiste à appliquer AES.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!