2016-08-15 3 views
2

Я новичок в шифровании. То, что я пытаюсь сделать, - это расшифровать шифрованный текст с использованием библиотеки javascript, CryptoJS. Этот пример кода отлично работает. Часть шифрования возвращает зашифрованный текст «ae06b481cecfa67c98c125» (который является правильным), а дешифрование того же объекта возвращает исходную строку «Hello World».Невозможно расшифровать сообщение с использованием Crypto-Js

var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d"); 
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d"); 
var encrypted = CryptoJS.AES.encrypt("Hello World", key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding }); 
alert(encrypted.ciphertext); 

var decryptedData = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding }); 
originalData = decryptedData.toString(CryptoJS.enc.Utf8); 
alert(originalData); 

Ну эта часть работает отлично, но когда я пытаюсь этот кусок кода, передавая зашифрованный текст в виде строки независимо друг от друга, я не получаю расшифрованного сообщения.

var key = CryptoJS.enc.Latin1.parse("bad8deadcafef00d"); 
var iv = CryptoJS.enc.Latin1.parse("bad8deadcafef00d"); 
var ciphertext = "ae06b481cecfa67c98c125"; 
// raw = CryptoJS.enc.Base64.parse(cipher); 
var decryptedData = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv, mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding }); 
originalData = decryptedData.toString(CryptoJS.enc.Utf8); 
alert(originalData); 
console.log(originalData); 

Может кто-нибудь указать, почему?

У меня есть следующие библиотеки, включенные в html-файл.

<script src="js/rollups/aes.js"></script> 
<script src="js/components/mode-ctr.js"></script> 
<script src="js/components/pad-nopadding.js"></script> 

ответ

0

CryptoJS.AES.decrypt ожидает либо CipherParams объекта или OpenSSL-отформатированную строку. Если переданный ключ является строкой, то ожидается строка в формате OpenSSL, а в противном случае - объект CipherParams.

Поскольку ключ не является строкой, то это нужно:

var decryptedData = CryptoJS.AES.decrypt({ 
    ciphertext: CryptoJS.enc.Hex.parse("ae06b481cecfa67c98c125") 
}, key, { 
    iv: iv, 
    mode: CryptoJS.mode.CTR, 
    padding: CryptoJS.pad.NoPadding 
}); 

Если ключ является строкой, то это на самом деле не является ключевым, но предполагается, что пароль и ключ будет полученный из этого пароля со случайной 8-байтовой солью. Это было бы сопоставимо с функцией OpenSSL EVP_BytesToKey.