Encriptación AES en Node.js para que coincida con el descifrado esperado en Python
encryption (1)
Tengo el siguiente script de Python para descifrado:
from Crypto.Cipher import AES
shared_secret = raw_input(''Enter crypted_shared_secret: '').strip()
cipher = AES.new(shared_secret.decode(''base64''), AES.MODE_ECB)
blob = raw_input(''Enter crypted_blob: '').strip()
plain = cipher.decrypt(blob.decode(''base64''))
print(plain)
Intento generar los valores que producirían el blob
original usando ese script, usando Node. Aquí está mi intento:
const Crypto = require(''crypto'');
var shared_secret = Crypto.randomBytes(32);
var cipher = Crypto.createCipher(''aes-256-ecb'', shared_secret);
crypted_blob = cipher.update(blob, ''utf8'', ''base64'') + cipher.final(''base64'');
Solo puedo modificar el script Node.js, pero no estoy seguro de dónde está yendo mal.
Debe codificar la clave secreta compartida para Base64 solo después de usarla para el cifrado:
var shared_secret = Crypto.randomBytes(32);
var cipher = Crypto.createCipheriv(''aes-256-ecb'', shared_secret, "");
crypted_blob = cipher.update(blob, ''utf8'', ''base64'') + cipher.final(''base64'');
// send `shared_secret.toString(''base64'')`
Otros problemas:
-
crypto.createCipher
supone que el secreto compartido es una contraseña y no una clave, por lo que utilizará una derivación de clave incorrecta (compatible con OpenSSL). - El módulo criptográfico de Node.js aplica automáticamente el relleno PKCS # 7 (igual que el relleno PKCS # 5), pero PyCrypto no aplica ningún relleno por sí mismo. Por lo tanto, debe usar el mismo relleno en Python o puede desactivar el relleno en node.js con
Cipher.setAutoPadding(false);
, pero luego tendrá que proporcionar textos planos que son un múltiplo del tamaño del bloque (16 bytes para AES).
Consideraciones de Seguridad:
- Nunca use el modo ECB . Es determinista y, por lo tanto, no semánticamente seguro. Al menos debe usar un modo aleatorio como CBC o CTR . Es mejor autenticar sus textos cifrados para que los ataques como un ataque oráculo de relleno no sean posibles. Esto se puede hacer con modos autenticados como GCM o EAX, o con un esquema de cifrado y luego MAC .