Cifrado AES en Node.js para coincidir con el descifrado esperado en Python

Tengo el siguiente script de Python para descifrar:

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) 

Estoy tratando de generar los valores que producirían el blob original usando ese script, usando Node. Aquí está mi bash:

 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 la secuencia de comandos Node.js, pero no estoy seguro de dónde va mal.

Debe codificar la clave secreta compartida en 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 asume que el secreto compartido es una contraseña y no una clave, por lo que usará 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 tipo de relleno por sí solo. Por lo tanto, debe usar el mismo desempaquetamiento en Python o puede deshabilitar el relleno en node.js con Cipher.setAutoPadding(false); , pero luego tendrá que proporcionar plaintexts que sean un múltiplo del tamaño del bloque (16 bytes para AES).

Consideraciones de Seguridad:

  • Nunca utilice el modo ECB . Es determinista y por lo tanto no es semánticamente seguro. Por lo menos debe usar un modo aleatorio como CBC o CTR . Es mejor autenticar los textos cifrados para que no sean posibles ataques como un ataque de oracle de relleno . Esto se puede hacer con modos autenticados como GCM o EAX, o con un esquema de cifrado y luego MAC .