使用CryptoJS库进行AES时,解密输出不正确

时间:2017-10-11 02:42:19

标签: javascript encryption cryptography

我正在尝试使用AES加密和解密一些随机数据。我可以使用以下代码

成功加密数据
function padString(source) {
  var paddingChar = 'x';
  var size = 16;
  var padLength = size - source.length;

  for (var i = 0; i < padLength; i++) source += paddingChar;

  return source;
}

var key = CryptoJS.enc.Hex.parse('dassdadsasad');
var iv = CryptoJS.enc.Hex.parse('fedcba9876543210');
var message = "0x72648174091c3f7cd41773f636ca9a15756798";
var padMsg = padString(message);

var encrypted = CryptoJS.AES.encrypt(padMsg, key, {
  iv: iv,
  padding: CryptoJS.pad.NoPadding,
  mode: CryptoJS.mode.CBC
});

但是当我尝试解密时,

var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
  iv: iv,
  padding: CryptoJS.pad.NoPadding,
  mode: CryptoJS.mode.CBC
});

我得到了不正确的解密输出,而不是取回我的纯文本。 例如,这是输出,

Message: "0x72648174091c3f7cd41773f636ca9a15756798" 40

Padded message: "0x72648174091c3f7cd41773f636ca9a15756798" 40

Encrypted: 8qCjEtSLhchErbhJu8jo/xy8T5T1eSAFazuWLKwKdAW9F0ZUjJLlZw==

Encrypted text: f2a0a312d48b85c844adb849bbc8e8ff1cbc4f94f57920056b3b962cac0a7405bd1746548c92e567

Decrypted c748c55c0212d1688e79de5f00379eb0d802789501e6cbab3e6255b902eaa528a40d32123bcd0ce1

有人可以告诉我,我做错了什么,或者我错过了什么?

以下是现场演示https://jsfiddle.net/4zb9hrxb/267/

2 个答案:

答案 0 :(得分:1)

您的密钥无效:

var key = CryptoJS.enc.Hex.parse('dassdadsasad');

首先没有多大意义,因为s不存在于十六进制表示法中。将256位密钥指定为十六进制,如下所示:

key = CryptoJS.enc.Hex.parse("123456789012345678901234567890ab");

(注意:只有十六进制字符)或让CryptoJS从密码短语中派生出密钥:

var key = 'dassdadsasad';

答案 1 :(得分:0)

要么遵循phihag所说的,要么你可以使用一些密钥派生函数,例如PBKDF2来从密码中导出密钥(如phihag建议的那样)。

考虑这个例子,

导入pbkdf2

  <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/pbkdf2.js"></script>

并生成密钥如下,

  var passphrase = "dassdadsasad"
  var keySize = 256;
  var iterations = 100;
  var salt = CryptoJS.lib.WordArray.random(128/8);
  var key = CryptoJS.PBKDF2(passphrase, salt, {
      keySize: keySize/32,
      iterations: iterations
    });

这里有一个很好的例子,

http://www.adonespitogo.com/articles/encrypting-data-with-cryptojs-aes/