2016-06-17 5 views
0

Ich habe den folgende Python-Skript für die Entschlüsselung:AES-Verschlüsselung in Node.js erwartete Entschlüsselung in Python entsprechen

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) 

Ich versuche, um die Werte zu erzeugen, die die ursprünglichen blob unter Verwendung dieses Skript erzeugen würden, unter Verwendung von Knoten. Hier ist mein Versuch:

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'); 

ich nur das Node.js Skript ändern kann, aber ich bin mir nicht sicher, wo es schief geht.

Antwort

2

Sie müssen den gemeinsamen geheimen Schlüssel zu Base64 nur nach Sie für die Verschlüsselung verwenden, um es zu kodieren:

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')` 

Andere Probleme:

  • crypto.createCipher nimmt das gemeinsame Geheimnis ein Passwort und nicht ein Schlüssel, weshalb er eine Bad Key-Ableitung (OpenSSL-kompatibel) verwendet.
  • Das Crypto-Modul von Node.js wendet automatisch PKCS # 7-Padding an (dasselbe wie PKCS # 5-Padding), aber PyCrypto wendet kein Padding an. Entweder müssen Sie in Python das gleiche Unpadding verwenden oder Sie können das Padding in node.js mit Cipher.setAutoPadding(false); deaktivieren, aber dann müssen Sie Klartexte bereitstellen, die ein Vielfaches der Blockgröße sind (16 Byte für AES).

Sicherheits-Überlegungen:

  • Nie ECB mode verwenden. Es ist deterministisch und daher nicht semantisch sicher. Sie sollten zumindest einen zufälligen Modus wie CBC oder CTR verwenden. Es ist besser, Ihre Chiffrate zu authentifizieren, so dass Angriffe wie padding oracle attack nicht möglich sind. Dies kann mit authentifizierten Modi wie GCM oder EAX oder mit einem encrypt-then-MAC Schema geschehen.
+0

Ich kann immer noch nicht funktionieren. Ich habe den RSA-Code geschnitten, der funktionierte, der AES ist der Teil, der nicht zu funktionieren scheint. Wenn ich Knoten öffnen und mit 'blob = 'Hallo Welt' anfangen und dann die 4 Zeilen Code ausführen, bekomme ich z. 'FH1hDHh49uGiWZhNCtg5Dw ==' als 'crypted_blob'. Dann kann ich 'shared_secret.toString ('base64')' ausführen und z. 'bUQXpYLhZnR + 9vKTU8txkRo7O6j7nrks1MJnxI/YIGo ='. Dann öffne ich Python, geben Sie die letztere als 'shared_secret' und die ehemalige als' Blob', aber ich bekomme immer noch eine verschlüsselte Zeichenfolge (falsche Entschlüsselung). – wizplum

+0

Ja, ich habe verpasst, dass Sie die falsche Methode in node.js verwendet haben. Siehe meine Bearbeitung. –

+0

Das hat funktioniert! Ich werde versuchen, die EZB durch CBC zu ersetzen, danke für den Tipp! – wizplum