2012-09-24 7 views
5

Ich habe ein Array von JSON-Arrays, deren Werte ich mit CryptoJS zu verschlüsseln versuchen und dann für die Verwendung in einer anderen Datei, wo diese Werte mit einer benutzerdefinierten Passphrase entschlüsselt werden sollen.Meine CryptoJS-Verschlüsselung/Entschlüsselung funktioniert nicht

Aber ich mache etwas falsch und ich bekomme "Uncaught Error: Malformed UTF-8-Daten" beim Entschlüsseln der URLs.

encrypt.js:

var encrypted = CryptoJS.AES.encrypt(item[key], pass); 
json[j] += encrypted.ciphertext.toString(CryptoJS.enc.Base64); 

decrypt.js:

var decrypted = CryptoJS.AES.decrypt(item[key], pass); 
html += '<a href="' + decrypted.toString(CryptoJS.enc.Utf8) + '" target="_blank" class="socialico ' + key + '">' + icons[key] + '</a>'; 

folgte ich this Beispiel ... Hilfe, bitte schön?

Antwort

11

Diese Fehlermeldung bedeutet normalerweise, dass die Daten nicht korrekt entschlüsselt wurden und die resultierenden Klartextbytes keine gültigen UTF-8-Zeichen bilden.

Ein paar Dinge zu überprüfen:

  • Erstens, stellen Sie sicher, dass Sie das gleiche Passwort verwenden sowohl für die Verschlüsselung und Entschlüsselung. Möglicherweise möchten Sie einen Hash des korrekten Kennworts aufbewahren, damit Sie überprüfen können, ob der Benutzer das richtige Kennwort angegeben hat, bevor Sie es für die Entschlüsselung verwenden.
  • Zweitens stellen Sie sicher, dass der Wert item[key] eine Zeichenfolge vor dem Verschlüsseln ist. CryptoJS kann JSON-Objekte nicht verschlüsseln. Sie müssen es zuerst serialisieren.
+0

Vielen Dank für Ihr Interesse. Ich habe in beiden Dateien das gleiche 'var pass = 'something' und' console.log (typeof (item [key]) == 'string') 'für alle Elemente richtig gedruckt. – Viktor

+6

Ahh. Ich bemerkte ein anderes wahrscheinliches Problem. Sie müssen die gleiche IV für die Entschlüsselung verwenden, die während der Verschlüsselung verwendet wurde. Normalerweise wird die IV zusammen mit dem Chiffretext serialisiert, aber Sie speichern explizit nur den Chiffretext ohne die IV. Versuchen Sie 'chiffred.ciphertext.toString (CryptoJS.enc.Base64)' in 'encrypted.toString() 'zu ändern' –

+0

Oh, danke! Ich habe den 'ciphertext' und' Base64' entfernt und jetzt scheint es zu funktionieren. Jetzt habe ich mir eine ziemlich sichere Webseite mit nur JavaScript! Das ist schön, ziemlich cool. – Viktor