2016-12-21 1 views
0

Ich versuche, verschlüsseln/entschlüsseln Funktionen mit AES-128-Gcm wie von Node Krypto bereitgestellt. Aus meiner Sicht verschlüsselt gcm den Chiffretext aber auch Hashes und stellt dies als "Authentifizierungs-Tag" zur Verfügung. Ich erhalte jedoch weiterhin den Fehler: "Nicht unterstützter Status oder Daten können nicht authentifiziert werden"."Nicht unterstützten Zustand oder nicht authentifizieren Daten" mit AES-128-Gcm in Knoten

Ich bin mir nicht sicher, ob das ein Fehler in meinem Code ist - mit Blick auf den verschlüsselten Chiffretext und Auth-Tag ist derjenige, der von der Entschlüsselungsfunktion abgerufen wird, der gleiche wie der von der Verschlüsselungsfunktion.

function encrypt(plaintext) { 
    // IV is being generated for each encryption 
    var iv = crypto.randomBytes(12), 
     cipher = crypto.createCipheriv(aes,key,iv), 
     encryptedData = cipher.update(plaintext), 
     tag; 

    // Cipher.final has been called, so no more encryption/updates can take place 
    encryptedData += cipher.final(); 

    // Auth tag must be generated after cipher.final() 
    tag = cipher.getAuthTag(); 

    return encryptedData + "$$" + tag.toString('hex') + "$$" + iv.toString('hex'); 
} 

function decrypt(ciphertext) { 
    var cipherSplit = ciphertext.split("$$"), 
     text = cipherSplit[0], 
     tag = Buffer.from(cipherSplit[1], 'hex'), 
     iv = Buffer.from(cipherSplit[2], 'hex'), 
     decipher = crypto.createDecipheriv(aes,key,iv); 

    decipher.setAuthTag(tag); 

    var decryptedData = decipher.update(text); 

    decryptedData += decipher.final(); 
} 

der Fehler durch decipher.final geworfen wird().

Antwort

0

Es ist mir gelungen, das zu beheben: Das Problem war, dass ich keinen Kodierungstyp für cipher.final() angegeben hatte, und ich es innerhalb eines Strings zurückgab, so dass es kein Buffer-Objekt zurückgab, das entschlüsselt. final() hat erwartet.

Um zu beheben, füge ich 'utf-8' zu 'hex' Codierungsparameter in meinem cipher.update und cipher.final, und umgekehrt in entschlüsseln.

-1

Um die Bedienung von AES GCM zu vereinfachen, habe ich ein npm-Paket node-cryto-gcm geschrieben, das direkt verwendet werden kann. Sie können auch auf source code verweisen, um zu sehen, wie AES GCM funktioniert.

npm install node-crypto-gcm 

Anwendungsbeispiel:

const GCM = require('node-crypto-gcm').GCM; 

let plainText = 'To be or not to be, that is the question.'; 
let gcm = new GCM('password'); 

let output = gcm.encrypt(plainText); 

let decryptedText = gcm.decrypt(output); // decryptedText should equals plainText 
Verwandte Themen