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.