javascript - decrypt - AES encripta en CryptoJS y descifra en Coldfusion
cryptojs aes javascript (1)
Parece que hay dos problemas:
CryptoJS no está usando tu variable como la
key
. Como mencionó @Miguel-F, cuando pasas una cadena, "se trata como una frase de contraseña y se usa para derivar [la] clave real y IV" . Ambos se generan de forma aleatoria, por lo que su resultado cifrado cambia constantemente. Pero lo que es más importante, esto significa que CryptoJS está utilizando unakey
completamente diferente a la de su código CF y es por eso que falla el descifrado (). (Al menos es parte de la razón ...)El segundo problema es que, además del algoritmo "AES", hay otras dos configuraciones de encriptación que deben coincidir: el modo y el esquema de relleno . Mientras que CryptoJS y ColdFusion usan los mismos valores predeterminados para el esquema de relleno, los "modos" son diferentes:
- ColdFusion usa "ECB" . "AES" es en realidad la abreviatura de
"AES/ECB/PKCS5Padding"
- CryptoJS usa "CBC", que requiere un valor
iv
adicional ( vector de inicialización ).
- ColdFusion usa "ECB" . "AES" es en realidad la abreviatura de
Debe asegurarse de que las tres configuraciones sean las mismas en ambos lados. Intente usar el modo CBC en CF, ya que de todos modos es más seguro que ECB. Nota: Requiere agregar un valor IV.
Código CF:
<!--- this is the base64 encrypted value from CryptoJS --->
<cfset encrypted = "J2f66oiDpZkFlQu26BDKL6ZwgNwN7T3ixst4JtMyNIY=">
<cfset rawString = "[email protected]">
<cfset base64Key = "MTIzNDU2NzgxMjM0NTY3OA==">
<cfset base64IV = "EBESExQVFhcYGRobHB0eHw==">
<cfset ivBytes = binaryDecode(base64IV, "base64")>
<cfoutput>
#decrypt(encrypted, base64Key, "AES/CBC/PKCS5Padding", "base64", ivBytes)#
</cfoutput>
CryptoJS: (Ejemplo original ajustado)
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<script>
var text = "#rawString#";
var key = CryptoJS.enc.Base64.parse("#base64Key#");
var iv = CryptoJS.enc.Base64.parse("#base64IV#");
var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv});
console.log(encrypted.toString());
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv});
console.log(decrypted.toString(CryptoJS.enc.Utf8));
</script>
Editar:
Dicho todo esto, ¿qué quiere decir con que el cliente "no tiene más remedio que usar CryptoJS para realizar el cifrado" ? ¿Por qué no pueden usar el cifrado del lado del servidor? No soy un experto en cifrado, pero hacer encriptación en javascript y exponer la clave en el cliente no suena demasiado seguro para empezar ...
Tenemos un servicio de Ingreso silencioso escrito en Coldfusion9 que acepta cadenas cifradas de sistemas externos y luego descifra en función de una configuración de Algoritmo / Codificación acordada. Esto ha funcionado sin problemas desde hace años en los sistemas que ejecutan ASP / JAVA / PHP, pero ahora tenemos un cliente que no tiene más remedio que usar CryptoJS para realizar la encriptación y, por mi vida, no puedo entender por qué esto no funcionará. descifrar en Coldfusion.
Mi conocimiento del cifrado no es brillante, pero lo que noto es que el texto cifrado cifrado de CryptoJS para la misma cadena / clave difiere cada vez que realizo el cifrado, mientras que en Coldfusion / Java siempre puedo esperar la misma cadena cifrada. No estoy seguro de si esto está relacionado con la codificación o no, pero nunca me he encontrado con este problema, aceptando cadenas cifradas de cualquier otro sistema anteriormente, así que espero que sea la forma en que estoy encriptando en CryptoJS que es incorrecta.
<cfoutput>
<!--- Set String and Key --->
<cfset theKey = toBase64("1234567812345678")>
<cfset string = "[email protected]">
<!--- CryptoJS AES Libraries --->
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<script>
// Encrypt String using CryptoJS AES
var encrypted = CryptoJS.AES.encrypt("#string#", "#theKey#");
console.log(encrypted.toString());
// Decrypt String using CryptoJS AES
var decrypted = CryptoJS.AES.decrypt(encrypted, "#theKey#");
console.log(decrypted.toString(CryptoJS.enc.Utf8));
</script>
<!--- Coldfusion Decrypt String / FAILS --->
Decrypted: #decrypt(encryptedEmail, "#theKey#", "AES", "BASE64")#
</cfoutput>