可以't使用CryptoJS解密字符串
Can't decrypt string with CryptoJS
我正在尝试使用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需要存储到第一示例的加密对象中但从第二示例的字数组中丢失的。
有人知道为什么会发生这种事吗?
我已经处理了一段时间,我想我发现了你的问题。主要问题是这条线路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,所以我希望我做得对。
如果您仍然喜欢使用密文,默认情况下,当没有编码传递到ciphertext.toString()
时,它将在密文WordArray
上返回CryptoJS.enc.Hex.stringify
。
由于decrypt将文本作为base64字符串接收,因此在将其传递回decrypt之前,您需要对密文十六进制串调用以下命令。
CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encrypted.ciphertext.toString()))
所以在这种情况下,
var manual_data = '3f0e590d2617dc7007b89350bd590409';
var base64_data = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(manual_data))
var decrypted = CryptoJS.AES.decrypt(
base64_data,
key,
{
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}
);
console.log('decrypted by hand: '+decrypted.toString(CryptoJS.enc.Utf8));
- AES-CTR 在 Go 中加密,在 CryptoJS 中解密
- 使用CryptoJS进行渐进式AES解密
- 可以't使用CryptoJS解密字符串
- 如何在CryptoJS(nodejs/web浏览器)中解密AES 128
- 创建 CryptoJS AES 密码加密器以在 .NET 中解密
- 使用CryptoJS解密图片并将其插入页面
- 如何使用 CryptoJS 解密加密字符串 (SHA512)
- CryptoJS AES CBC 256 解密在明文中间添加了额外的字节
- 填充无效,无法使用CryptoJS 3.1加密和服务器端AesCryptoServiceProvider解密来删除
- 如何在MVC中使用cryptoJs解密代码背后的加密值
- CryptoJS中的加密和mCrypt中的解密工作不正常
- CryptoJS使用密码短语加密AES,但PHP解密需要密钥
- 使用cryptojs解密不起作用
- PHP加密和CryptoJS解密
- CryptoJS解密C#DES加密文件失败
- CryptoJS AES加密和JAVA AES解密值不匹配
- 使用CryptoJS加密和从Objective-C解密
- 使用CryptoJS在Javascript中加密,在Java中解密
- 使用CryptoJS解密文件会产生随机结果
- 使用 PHP 加密;使用 CryptoJS 解密