Esta es una especie de segunda parte de la pregunta Tratando de imprimir una cadena hexadecimal con CryptoJS
Básicamente, tengo una función que usa CryptoJS para encriptar un mensaje y escupir el texto cifrado como una cadena hexadecimal.
function EncryptAES(text, key) { var encrypted = CryptoJS.AES.encrypt(text, key); return encrypted.ciphertext.toString() } Quiero escribir una función DecryptAES que tome la cadena hexadecimal, la clave y la sal (que aparentemente necesito) y devuelva el texto sin formato original. El problema es que no puedo descifrar cómo volver a poner la cadena hexadecimal en una forma que CryptoJS.AES.decrypt , y no puedo encontrar en ninguna parte de la documentación donde realmente explique cómo hacerlo. Tal vez pasé por alto algo. Por favor ayuda.
CryptoJS usa el tipo de datos WordArray internamente y proporciona codificadores para la conversión. Si desea convertir una cadena codificada en hexadecimal en WordArray , esto es posible con el codificador hexadecimal de la siguiente manera:
CryptoJS.enc.Hex.parse(<your hex encoded string>)O al revés
<your WordArray>.toString(CryptoJS.enc.Hex)o para abreviar
<your WordArray>.toString() Además, CryptoJS.AES.encrypt() devuelve un objeto CipherParams que encapsula texto cifrado y sal, entre otras cosas. Este objeto CipherParams debe pasarse a CryptoJS.AES.decrypt() para el descifrado.
Con esto, lo que quieres se puede implementar de la siguiente manera:
function EncryptAES(text, key) { var encrypted = CryptoJS.AES.encrypt(text, key); return {ciphertext: encrypted.ciphertext.toString(), salt: encrypted.salt.toString()} } function DecryptAES(ciphertext, salt, key){ var decrypted = CryptoJS.AES.decrypt({ciphertext:CryptoJS.enc.Hex.parse(ciphertext), salt:CryptoJS.enc.Hex.parse(salt)}, key); return decrypted; } var {ciphertext, salt} = EncryptAES('The quick brown fox jumps over the lazy dog', 'my passphrase'); console.log('Ciphertext (hex): ', ciphertext); console.log('Salt (hex): ', salt); var decrypted = DecryptAES(ciphertext, salt, 'my passphrase'); console.log('Decrypted: ', decrypted.toString(CryptoJS.enc.Utf8)); <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script> Sin embargo, hay una manera más fácil de manejar la sal y el texto cifrado. Para un objeto CipherParams , .toString() devuelve los datos en el formato OpenSSL codificado en Base64 que consta de la codificación hexadecimal de Salted__ seguida de los 8 bytes salt y el texto cifrado real. CryptoJS.AES.decrypt() implícitamente convierte una cadena Base64 de este tipo en un objeto CipherParams :
var encrypted = CryptoJS.AES.encrypt('The quick brown fox jumps over the lazy dog', 'my passphrase').toString(); console.log("Salt, ciphertext (OpenSSL format, Base64): ", encrypted); var decrypted = CryptoJS.AES.decrypt(encrypted, 'my passphrase'); console.log("Decrypted: ", decrypted.toString(CryptoJS.enc.Utf8)); <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>