2016-05-12 5 views
3

Schritt 1: Erstellen Schlüssel mit pbkdf2

var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512'); 

einen Schlüssel mit dem Kennwort erstellen, prancy poodle, salzen mit sherylcrowe, 10.000-mal wiederholen, löschte einen 32 Byte langen Schlüssel (AES-256-CBC benötigt diese Länge).AES-256-CBC Bad Decrypt

Schritt 2: Verschlüsseln etwas

var cipher = crypto.createCipheriv('aes-256-cbc', key, 'dogsarefun'.toString("binary")); 

var crypted = cipher.update('wherearemysocks?'); 
crypted = Buffer.concat([crypted, cipher.final()]); 

Schritt 3: Entschlüsseln & Ausfallen

var decipher = crypto.createDecipheriv('aes-256-cbc', key, 'dogsarefun'.toString('binary')); 

var decrypted = decipher.update(crypted); 
decrypted = Buffer.concat([decrypted, decipher.final()]); 
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt 
    at Error (native) 
    at Decipher.Cipher.final (crypto.js:150:26) 
    at repl:1:48 
    at REPLServer.defaultEval (repl.js:272:27) 
    at bound (domain.js:280:14) 
    at REPLServer.runBound [as eval] (domain.js:293:12) 
    at REPLServer.<anonymous> (repl.js:441:10) 
    at emitOne (events.js:101:20) 
    at REPLServer.emit (events.js:188:7) 
    at REPLServer.Interface._onLine (readline.js:219:10) 

Was mache ich falsch? Es scheint so richtig, aber ist so falsch.

Antwort

4

Sie müssen einen IV für den CBC-Modus bereitstellen und er muss Blockgröße haben (16 Byte für AES). 'dogsarefun' ist nur 10 Bytes, also die restlichen Bytes sind nicht spezifiziert und können (wahrscheinlich) Müll sein.

Da PKCS padding ist die Standardeinstellung und CBC-Modus verwendet wird, eine falsche IV in falscher Polsterung auf Entschlüsselung resultiert wahrscheinlich mit dem Fehler: Routinen: EVP_DecryptFinal_ex: schlecht entschlüsseln.

P.S. Vorsicht: Dies ist das Internet, das von Katzen gepinselt wird.

+0

Gibt es eine gute Referenz für welche Länge Schlüssel und IVS verschiedene Algorithmen benötigen? – Breedly

+1

Guter Punkt, [Wikipedia] (https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) liefert die Schlüsselgrößen und die Blockgröße, aber versäumt es zu erwähnen, dass die IV-Größe die gleiche wie die Blockgröße ist, zu viel angenommen wird. Es gibt einige gute Bücher wie [* Handbook of Applied Cryptography *] (http://cacr.uwaterloo.ca/hac/index.html) siehe kostenlosen Download * Angewandte Kryptographie * von Bruce Schneier * Praktische Kryptographie * von Niels Ferguson und Bruce Schneier * Kryptografie entschlüsselt * von HX Mel und Doris M. Baker (gute Starter, die ich wirklich mag). – zaph

0

Sie müssen die createDecipheriv-Funktion zum Entschlüsseln verwenden, und Ihre IV muss 16 Zeichen lang sein.

Beispiel:

var crypto = require('crypto'); 
var buffer = require('buffer'); 

var key = crypto.pbkdf2Sync('prancypoodle', 'sherylcrowe', 10000, 32, 'sha512'); 

// Initialization vector must be 16 characters. 
var cipher = crypto.createCipheriv('aes-256-cbc', key, 
    new Buffer('1234567812345678', 'binary')); 

var crypted = cipher.update('wherearemysocks?'); 
console.log('Encrypted: %s', crypted); 
crypted = Buffer.concat([crypted, cipher.final()]); 
// Again, IV must be 16 characters. 
var decipher = crypto.createDecipheriv('aes-256-cbc', key, 
    new Buffer('1234567812345678', 'binary')); 

var decrypted = decipher.update(crypted); 
console.log('Decrypted: %s', decrypted); 

Ausgang:

Encrypted: #�j���(���� 
Decrypted: wherearemysocks? 
+0

Es ist wirklich besser, verschlüsselte Daten im Hexadezimalformat anzuzeigen, da viele (die meisten) Bytes keine druckbaren Zeichen sind. Etwas wie "# j ( " ist ziemlich bedeutungslos, da so viele Bytes fehlen. – zaph

+1

Ah, meistens habe ich es getan, um zu zeigen, dass es einmal verdeckt war (weil es verschlüsselt ist!) Und jetzt nicht ist .: P – Switch