2017-09-18 3 views
0

Ich habe generic Krypta erstellt und entschlüsseln Funktionalität, es funktioniert gut, wenn ich eine beliebige Zeichenfolge zur Verfügung stellen, aber wenn ich in sha256 Hash-String zu übergeben versuchen, dann wirft Krypto einen Fehler - error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block lengthNodeJS Krypto decrypt verhält inkonsequent

Hier der Code -

let crypto = require('crypto'); 

const secret = new Buffer('1234567890abcdef71234567890abcdef1234567890abcdef1234567890abcdef', 'hex'); 
const iv = new Buffer('1234567890abcdef1234567890abcdef', 'hex'); 

const config = { 
    secret: secret, 
    iv: iv 
}; 

function encrypt(data, sec, siv) { 
    let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data)); 
    let cipher = crypto.createCipheriv('aes-256-cbc', sec, siv); 
    let crypt = cipher.update(dataBuffer); 
    crypt += cipher.final('hex'); 

    return Buffer.from(crypt, 'hex'); 
} 

function decrypt(data, sec, siv) { 
    let dataBuffer = ((data instanceof Buffer)?data:Buffer.from(data)); 
    let decipher = crypto.createDecipheriv('aes-256-cbc', sec, siv); 
    let decrypt = decipher.update(dataBuffer); 
    decrypt += decipher.final(); 

    return Buffer.from(decrypt); 
} 

function main() { 
    let test = 'asdfqwerty'; 
    let secretBytes = crypto.randomBytes(32); 
    let secretHash = Buffer.from(crypto.createHmac('sha256', config.secret).update(secretBytes).digest('hex')); 

    console.log('\nTesting test string\n==================='); 
    console.log(test); 
    a = encrypt(test, config.secret, config.iv); 
    console.log(decrypt(a, config.secret, config.iv).toString()); 

    console.log('\nTesting test string\n==================='); 
    console.log(secretHash); 

    a = encrypt(secretHash, config.secret, config.iv); 
    console.log(decrypt(a, config.secret, config.iv).toString()); 
} 

try { 
    main(); 
} catch (e) { 
    console.log(e); 
} 

Allerdings wird die Ausgabe wie folgt -

Testing test string 
=================== 
asdfqwerty 
asdfqwerty 

Testing test string 
=================== 
<Buffer 62 36 62 62 37 39 36 65 63 36 36 36 64 32 63 61 64 34 63 61 32 32 39 66 32 35 64 38 64 30 61 39 34 66 31 39 34 38 62 33 63 66 33 38 64 37 65 62 33 39 ... > 
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length 
    at Decipheriv.final (crypto.js:181:26) 
    at decrypt (/project/test2.js:24:23) 
    at main (/project/test2.js:43:15) 
    at Object.<anonymous> (/project/test2.js:47:3) 
    at Module._compile (module.js:573:30) 
    at Object.Module._extensions..js (module.js:584:10) 
    at Module.load (module.js:507:32) 
    at tryModuleLoad (module.js:470:12) 
    at Function.Module._load (module.js:462:3) 
    at Function.Module.runMain (module.js:609:10) 

ich kann nicht herausfinden, warum es funktioniert in der erste Testfall schlägt im zweiten Testfall noch fehl.

hier ein repl.it link zum Code ist

+1

'typeof data === 'Puffer' wird niemals wahr sein. 'typeof' erzeugt nur' string', '' number' ', '' boolean'', '' function'', '' object'', '' symbol'' und ''undefined''; Du meintest wahrscheinlich 'Buffer.isBuffer (data)'. – Ryan

+0

Sie sind so richtig. Danke dafür, ich dachte, ich würde meinen Verstand verlieren wegen etwas, das sich als super einfach herausstellt. Ich sollte 'instancesof' verwenden, um nicht' typeof' zu testen. Das behebt jedoch nicht das zugrunde liegende Problem, da Krypto-Methoden mit Buffers oder Strings arbeiten sollten – JayReardon

Antwort

0

Nach einigen weiteren Studien, entdeckte ich, dass die Frage von den Erwartungen der AES-256 Stämme und die Blockgröße der Daten verschlüsselt werden. Die zu verschlüsselnden Daten können nicht größer sein als die erwartete Blockgröße (d. H. 16 Bytes). Wenn der Block größer ist, wirft Crypto den error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length Fehler.

Wenn große Daten mit aes-256-cbc verschlüsselt werden, ist es notwendig, die Daten in 16-Byte oder weniger Blöcke zu chicken, jeden Block zu verschlüsseln und dann jedes der Ergebnisse zusammen mit einer Form eines Trennzeichens zu packen.

Ähnliches Entschlüsseln erfordert das Aufteilen des gepackten Ergebnisses durch das Trennzeichen, Entschlüsseln jedes Blocks und erneutes Zusammenfügen der Ergebnisse.