12

我正在尝试使用 CryptoJS 对数据进行编码/解码,作为我要开发的代码的初步测试。这是我用于加密的代码:

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<script>
var message = "Secret Message";
var key = CryptoJS.enc.Hex.parse('36ebe205bcdfc499a25e6923f4450fa8');
var iv  = CryptoJS.enc.Hex.parse('be410fea41df7162a679875ec131cf2c');

// Encription. Works ok
var encrypted = CryptoJS.AES.encrypt(
        message,key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    );
console.log('encrypted:'+encrypted.ciphertext.toString());
<script>

这是我用于解密的第一个测试。工作正常,返回3f0e590d2617dc7007b89350bd590409

// Decription. Works ok with "encrypted" parameter
var decrypted = CryptoJS.AES.decrypt(
        encrypted,key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    );
console.log('decrypted:'+decrypted.toString(CryptoJS.enc.Utf8));

让我们注意,encrypted参数是上一次调用的结果CryptoJS.AES.encrypt。它是一个对象。

我遇到的问题是当我尝试直接解密字符串时:

// Decription. It fails with manual data
var manual_data = CryptoJS.enc.Hex.parse('3f0e590d2617dc7007b89350bd590409');
var decrypted = CryptoJS.AES.decrypt(
        manual_data,key,
        {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }
    );
console.log('decrypted, by hand:'+decrypted.toString(CryptoJS.enc.Utf8));

它返回一个“空”对象(在上面的例子中是一个空字符串)。似乎有一些 CryptoJS.AES.decrypt 需要的数据存储在第一个示例的加密对象中,但从第二个示例的 wordarray 中丢失。

有谁知道为什么会这样?

4

1 回答 1

22

我已经搞砸了一段时间,我想我已经找到了你的问题。主要问题是这条线encrypted.ciphertext.toString()。你想要的只是encrypted.toString().

toString函数由 CryptoJS 为这个对象定义,它返回可以安全发送的加密消息。所以如果我们改变它,我们将有这样的东西:

var encrypted = CryptoJS.AES.encrypt(
  message,
  key,
  {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }
);
console.log('            encrypted: '+encrypted.toString());

这将输出Pw5ZDSYX3HAHuJNQvVkECQ==而不是3f0e590d2617dc7007b89350bd590409. 你的第二个函数工作的原因是因为它不使用encrypted.ciphertext.toString()它只是使用实际的对象,所以没有改变那个。对于最后一个,我们会将您使用的错误文本更改为不带该部分返回的新文本,ciphertext但我们还必须删除CryptoJS.enc.Hex.parse. 我真的不知道你在这里做什么,但我可以调查一下你是不是故意的。

var manual_data = 'Pw5ZDSYX3HAHuJNQvVkECQ==';
var decrypted = CryptoJS.AES.decrypt(
  manual_data,
  key,
  {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  }
);
console.log('   decrypted, by hand: '+decrypted.toString(CryptoJS.enc.Utf8));

这应该记录正确的东西。

我什至为此创建了一个JSBin。这是我第一次使用 JSBin,所以我希望我做得对。

于 2014-01-23T03:02:29.450 回答