Tengo javascript que encripta y da la cadena.
Pero tengo que hacer esto a través de PHP.
El método que probé me está dando un resultado diferente al de javascript.
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js" integrity="sha512-nOQuvD9nKirvxDdvQ9OMqe2dgapbPB7vYAMrzJihw5m+aNcf0dX53m6YxM4LgA9u8e9eg9QX+/+mPu8kCNpV2A==" crossorigin="anonymous"></script> var txt="This text will be encrypted."; var key = CryptoJS.enc.Hex.parse('0123456789abcdef0123456789abcdef'); var iv = CryptoJS.enc.Hex.parse('abcdef9876543210abcdef9876543210'); var encrypted = CryptoJS.AES.encrypt((txt), key, { iv: iv }); var encrypted_data = encrypted.ciphertext.toString(CryptoJS.enc.Base64); alert(encrypted_data); obtengo salida:
2X/btHgrMBhNlgD8oKNO9rzqCg+RSydprVKmpbYY+j0=
En PHP
<?php $plaintext="This text will be encrypted."; $key = pack("H*", "0123456789abcdef0123456789abcdef"); $iv = pack("H*", "abcdef9876543210abcdef9876543210"); $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $iv); $ciphertext_base64 = base64_encode($ciphertext); echo $ciphertext_base64; ?> obtengo salida:
2X/btHgrMBhNlgD8oKNO9nJyd4xC4VTLGxnnrzGim+U=
Quiero la salida igual que la salida en javascript.
Descubrí que los 21 caracteres iniciales coinciden, pero no el resto de la cadena.
¿Algo que me esté perdiendo?
Esto se debe a los diferentes rellenos. CryptoJS usa PKCS#7, mcrypt aplica cero relleno.
Debe reemplazar mcrypt en el lado de PHP, ya que está en desuso ( ver aquí ). Una alternativa sería PHP/OpenSSL, que usa PKCS#7 por defecto.
Una solución con PHP/OpenSSL que produce el mismo texto cifrado es:
<?php $plaintext="This text will be encrypted."; $key = hex2bin("0123456789abcdef0123456789abcdef"); $iv = hex2bin("abcdef9876543210abcdef9876543210"); $ciphertext_base64 = openssl_encrypt($plaintext, "aes-128-cbc", $key, 0, $iv); echo $ciphertext_base64; // 2X/btHgrMBhNlgD8oKNO9rzqCg+RSydprVKmpbYY+j0= ?>