Tengo un proyecto entre manos en el cual necesito cifrar una cadena de texto desde Javascript y que esta se descifre en un servicio que está hecho en PHP.
Una búsqueda por Internet me ha dado las siguientes librerías:
- https://github.com/mdp/gibberish-aes
- https://github.com/bitwiseshiftleft/sjcl
- https://github.com/brainfoolong/cryptojs-aes-php
- https://code.google.com/p/crypto-js/
Con ninguna de ellas he conseguido que metiendo yo el iv como parámetro sea equivalente a la siguiente llamada en php:
openssl_encrypt('Hola', 'aes-256-cbc', 'My32charPasswordAndInitVectorStr', false, '1234567890123456');
Después de más búsquedas, he encontrado la solución: node-crypto + browserify
La idea es usar la librería crypto de node en el navegador mediante la herramienta browserify.
Para ello instalo browserify:
npm install -g browserify
Instalo crypto:
npm install crypto
Creo el fichero cifrar.js con el siguiente contenido:
var crypto = require('crypto'); var Crypto = {}; Crypto.encrypt = function (plain_text, encryptionMethod, secret, iv) { var encryptor = crypto.createCipheriv(encryptionMethod, secret, iv); encryptor.setEncoding('base64'); encryptor.write(plain_text); encryptor.end(); return encryptor.read(); }; Crypto.decrypt = function (encryptedMessage, encryptionMethod, secret, iv) { var decryptor = crypto.createDecipheriv(encryptionMethod, secret, iv); return decryptor.update(encryptedMessage, 'base64', 'utf8') + decryptor.final('utf8'); }; window.Crypto = Crypto;
Y por último utilizo browserify para crear el fichero que incluiré en el proyecto:
browserify cifrar.js -o crypto.js
Y la llamada equivalente en Javascript sería la siguiente:
Crypto.encrypt('Hola', 'AES-256-CBC', 'My32charPasswordAndInitVectorStr', '1234567890123456');