Alv*_*eda 11 javascript encryption 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>
Run Code Online (Sandbox Code Playgroud)
这是我用于解密的第一个测试.它工作正常,返回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));
Run Code Online (Sandbox Code Playgroud)
让我们注意到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));
Run Code Online (Sandbox Code Playgroud)
它返回一个"空"对象(上例中的空字符串).好像有一些CryptoJS.AES.decrypt需要的数据存储在第一个例子的加密对象中但是从第二个例子的wordarray中丢失了.
有人知道为什么会这样吗?
Dut*_*IFF 20
我一直在弄乱这一点,我想我已经找到了你的问题.主要问题是这一行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());
Run Code Online (Sandbox Code Playgroud)
这将输出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));
Run Code Online (Sandbox Code Playgroud)
这应该记录正确的东西.
我甚至为此创建了一个JSBin.这是我第一次使用JSBin,所以我希望我做得对.