2 votes

Comment décrypter les données en PHP cryptées avec JSEncrypt

J'essaie de sécuriser la communication entre un front-end JS et un back-end PHP en utilisant un cryptage symétrique et asymétrique. Je crée une clé symétrique sur le client et la crypte avec la clé publique du serveur avec JSEncrypt et l'envoie au serveur pour une utilisation future. openssl_open requiert une enveloppe pour décrypter la clé symétrique et je ne sais même pas quelles données sont censées se trouver dans l'enveloppe. J'avais l'impression que l'enveloppe est la clé symétrique qui a été cryptée avec la clé publique, mais utiliser cela n'a pas fonctionné. J'ai également essayé différentes combinaisons de décodage car j'ai lu que JSEncrypt encode le message en base 64 et la clé en hexadécimal, mais ces tentatives sont également infructueuses.

Code de cryptage JS :

let pub = "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----";

//I have a function that just creates a random string of characters
let key = generateKey(32);
let aesData = CryptoJS.AES.encrypt( "test", key );
let symKey = aesData.key + ":::" + aesData.iv;
let msg = aesData.toString();

let rsa = new JSEncrypt();
rsa.setPublicKey( pub );
let cryptKey = rsa.encrypt( symKey );

//I'm passing the data through a hidden form field
$("#key").val(cryptKey + ":::" + msg);

Code de décryptage PHP :

$key = openssl_get_privatekey( file_get_contents( $_SERVER["PRIV_KEY"]) );
$encryptedKey = explode( ":::", $msg )[0];
$realMsg = base64_decode(explode( ":::", $msg )[1]);

openssl_open($realMsg, $decrypted, $encryptedKey, $key);
return $decrypted;

Le code ci-dessus ne donne rien car l'appel à openssl_open échoue (renvoie faux). Lorsque je décode en base 64 la variable $encryptedKey, j'obtiens :

�vEi���pΕ��d_���@����욲JE��

mais la clé symétrique change à chaque fois, donc la sortie change aussi à chaque fois. Comme je l'ai dit, j'ai essayé différentes combinaisons d'encodage, mais elles renvoient toutes le même non-sens. Comme le montre le code JS, j'ai crypté le message "test".

Je n'ai jamais mis en œuvre le cryptage auparavant, donc je suis peut-être à côté de la plaque ici, mais après avoir regardé ce code pendant des jours, tout commentaire serait apprécié.

Edit : J'ai des problèmes pour décrypter avec ma clé privée en PHP, pas avec la clé symétrique.

2voto

ljcrafty Points 41

J'ai trouvé ! !! Donc, j'ai découvert que PHP a une fonction pour décrypter sans avoir besoin d'une enveloppe appelée openssl_private_decrypt qui utilise une clé privée pour décrypter un message. En utilisant cette fonction et en décodant en base 64 la clé cryptée, je suis en mesure de décrypter la clé symétrique du côté serveur et j'espère pouvoir maintenant décrypter le message de manière symétrique. Pour ceux qui sont intéressés, mon code côté serveur est le suivant :

$key = openssl_get_privatekey( file_get_contents( $_SERVER['PRIV_KEY'] ) );
$encryptedKey = base64_decode(explode( ":::", $msg )[0]);

if( openssl_private_decrypt($encryptedKey, $decrypted, $key) )
{
    return $decrypted;
}
return $encryptedKey;

Et du côté client, mon code est le même que ci-dessus. J'espère que cela aidera quelqu'un !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X