python node.js encryption aes

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 .