example crypto bytes javascript ruby aes cryptojs

javascript - bytes - Cómo descifrar mensaje con CryptoJS AES. Tengo un ejemplo de Ruby trabajando



install cryptojs angular (5)

Soy capaz de descifrar el mensaje cifrado AES con Ruby así:

require ''openssl'' require ''base64'' data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg=" key = "2e35f242a46d67eeb74aabc37d5e5d05" aes = OpenSSL::Cipher::Cipher.new(''aes-128-cbc'') aes.decrypt aes.key = key.scan(/../).collect{ |x| x.hex }.pack(''c*'') aes.iv = Base64.decode64(data)[0...16] puts aes.update(Base64.decode64(data)[16..-1]) + aes.final # => JSON data...

Al ser nuevo en CryptoJS, no logro armar una alternativa de trabajo. Esto es lo que he hecho hasta ahora:

data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg="; key = "2e35f242a46d67eeb74aabc37d5e5d05"; CryptoJS.AES.decrypt(atob(data).substring(16), key, { iv: atob(cipher).substring(0, 16), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });

¿CryptoJS espera datos, claves y vectores de inicialización de alguna manera diferente? Por lo que entiendo, los IV son los primeros 16 bytes en datos.


Esto funciona para descifrar usando javascript.

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/aes.js"></script> var decrypted = CryptoJS.AES.decrypt(data,key).toString(CryptoJS.enc.Utf8);

Supongo que llego un poco tarde a la fiesta.


Esto parece funcionar para mí (escribe una cadena decodificada en la consola):

data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg="; key = "2e35f242a46d67eeb74aabc37d5e5d05"; // Decode the base64 data so we can separate iv and crypt text. var rawData = atob(data); var iv = btoa(rawData.substring(0,16)); var crypttext = btoa(rawData.substring(16)); // Decrypt... var plaintextArray = CryptoJS.AES.decrypt( { ciphertext: CryptoJS.enc.Base64.parse(crypttext), salt: "" }, CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Base64.parse(iv) } ); // Convert hex string to ASCII. // See https://.com/questions/11889329/word-array-to-string function hex2a(hex) { var str = ''''; for (var i = 0; i < hex.length; i += 2) str += String.fromCharCode(parseInt(hex.substr(i, 2), 16)); return str; } console.log(hex2a(plaintextArray.toString()));

Los bits importantes son no especificar sal en su entrada y pasar la clave como WordArray como dice jlvaquero. Probablemente se realicen algunas mejoras de eficiencia, por ejemplo, supongo que hay una forma más fácil de convertir una cadena a un WordArray que ir a base64 y viceversa, pero al menos se decodifica con éxito. Levanté la función hex2a de en cuestión de Word Array a String .

Edición: Descubrí cómo convertir cadenas a WordArrays y viceversa con CryptoJS, por lo que no es necesario el codificador / decodificación extra base64 y la función hex-to-ASCII. También resulta que la propiedad de sal no necesita ser especificada. Esto es más compacto y eficiente:

data = "IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJDjdYIdW8T9YPOI9E1hih8lbfRnMWcOFJgYekfLpoy5LI525UGnlM46J1k6ekLqsn9FqvbiOOoLgqa4YqBm1i9P0ePyjkME+t+RiL8xXX+ItgOYr9G7kM64wlTJPCW8B/crmUdmGzQNC/hD/u/8wfHBS2f8u6OtQMG/+Kpk1oju8lcUZGI/4S8A6/OuktvQr2zgnbs2aADMrM37Oait/pJ3G73S7NwVT8EaK+X43c0C/fUvW2/bD/rqCNpAh9WQlz4Cj6JHwjbmwuind6aCimF1tHjXuR9FXu+g17sPT4ZkKZ6aeBG+m170XdCGn2hVM0wH1rh3VeCG2u/JFqfuGKGSoqeHeNY/icu9pEhtZDzHd7aPoaMXcWvXC9PjooBf7GM1EPacSdnon1kBobjtKSt1l15DjO5TMrJoX7VO7GotQwo+uI/u5Kop01hBXxyxyggl1/8N0ESohPJoqLDrIwvbGK5kW4B49FVPnx9CMvjZDdSsoxPAh+hx6SPe8Hj0Nx4bRs06cbtOkte/V8QSYIqjiJDleEqPrdiKlvgToZz9L29ZR/3Ln65qU1sq7q9c0SEYxIopV7TdTjFS7y76zDPFZkhzc3DjfLtJo/M1hdtt648APcZdmAIgWH6fh3eJZ0qbiPh8RStYH7I2COmnlMw4+t/B5mlhYVSgwPK2Ir736Mh+P9Bw0fF8r9Ghhs4AJzpU0RiK9d1tCsrLfK/hSRwTXhtsSB6eDWEGkO7oeEIz43mgn0sv3SrA9JNHzYkg="; key = "2e35f242a46d67eeb74aabc37d5e5d05"; // Decode the base64 data so we can separate iv and crypt text. var rawData = atob(data); var iv = rawData.substring(0,16); var crypttext = rawData.substring(16); // Decrypt... var plaintextArray = CryptoJS.AES.decrypt( { ciphertext: CryptoJS.enc.Latin1.parse(crypttext) }, CryptoJS.enc.Hex.parse(key), { iv: CryptoJS.enc.Latin1.parse(iv) } ); console.log(CryptoJS.enc.Latin1.stringify(plaintextArray));


para el hex2a proporcionado por otro usuario, puede que no funcione si el código ASCII es superior a 128 (es decir, el texto contiene chino, etc.)

Puede utilizar el seguimiento para devolver unicode adecuado

function hex2a(hex) { var str = ''''; for (var i = 0; i < hex.length; i += 2){ var dec = parseInt(hex.substr(i, 2), 16); character = String.fromCharCode(dec); if (dec > 127) character = "%"+hex.substr(i,2); str += character; } return decodeURI(str); }


var key = CryptoJS.enc.Utf8.parse(''8080808080808080''); var iv = CryptoJS.enc.Utf8.parse(''8080808080808080''); var _enid = CryptoJS.AES.decrypt(data, key, { keySize: 128 / 8, iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); return _enid;


encryptWithCryptoJS(plainText: string): string { const key = CryptoJS.enc.Utf8.parse("hf8685nfhfhjs9h8"); const iv1 = CryptoJS.enc.Utf8.parse("hf8685nfhfhjs9h8"); const encrypted = CryptoJS.AES.encrypt(plainText, key, { keySize: 16, iv: iv1, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted + ""; } decryptionWithCryptoJS(cipher: string): string { const key = CryptoJS.enc.Utf8.parse("hf8685nfhfhjs9h8"); const iv1 = CryptoJS.enc.Utf8.parse("hf8685nfhfhjs9h8"); const plainText = CryptoJS.AES.decrypt(cipher, key, { keySize: 16, iv: iv1, mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return plainText.toString(CryptoJS.enc.Utf8); }