Javascript 使用CryptoJS使用密码进行AES解密返回空值 脚本

Javascript 使用CryptoJS使用密码进行AES解密返回空值 脚本,javascript,encryption,cryptography,cryptojs,Javascript,Encryption,Cryptography,Cryptojs,我有以下代码: 请稍候。。。 插入新注释: var password=“testpassword”; var encrypted_text=localStorage.getItem(“加密”); var rawData=atob(加密文本); var iv=原始数据子串(0,16); var crypttext=rawData.substring(16); var plaintextArray=CryptoJS.AES.decrypt( {ciphertext:CryptoJS.enc.La

我有以下代码:


请稍候。。。
插入新注释:
var password=“testpassword”;
var encrypted_text=localStorage.getItem(“加密”);
var rawData=atob(加密文本);
var iv=原始数据子串(0,16);
var crypttext=rawData.substring(16);
var plaintextArray=CryptoJS.AES.decrypt(
{ciphertext:CryptoJS.enc.Latin1.parse(cryptotext)},
CryptoJS.enc.Hex.parse(密码),
{iv:CryptoJS.enc.Latin1.parse(iv)}
);
var decrypted=CryptoJS.enc.Latin1.stringify(明文数组);
document.getElementById(“已解密”).innerHTML=已解密;
document.getElementById(“enc_按钮”).onclick=function(){
var text=document.getElementById(“新注释”).value;
var encrypted=CryptoJS.AES.encrypt(文本、密码);
setItem(“加密的”,加密的);
}

CryptoJS有两种稍有不同的加密/解密类型

当你使用

var encrypted = CryptoJS.AES.encrypt(text, password);
然后,您使用的是基于密码的加密,这与基于纯密钥/IV的加密不同。这意味着密码和随机生成的salt将通过一次MD5调用运行,以生成实际加密的密钥和IV。这是一种与OpenSSL兼容的加密方式。
encrypted
对象存储用于生成密钥和IV的随机salt

当您强制将
encrypted
转换为字符串(如将其添加到localStorage)时,它将转换为包含salt的与OpenSSL兼容的字符串编码。为了再次解密它,您不需要自己乱动密钥、IV或salt,因为CryptoJS会自动为您执行此操作:

var decrypted = CryptoJS.AES.decrypt(encrypted, password);
请记住,
decrypted
是一个
WordArray
对象,当您强制将其转换为字符串时,默认情况下会将内容编码为十六进制。如果您不希望这样,那么您需要自己指定编码,例如UTF-8

由于某些原因(如错误的密钥、错误的密文或错误的编码)解密失败时,通常会返回空白值。CryptoJS不会抛出自定义错误消息,但会尝试继续,因为您应该知道自己在做什么

完整代码:

var password=“testpassword”;
document.getElementById(“enc_按钮”).onclick=function(){
var text=document.getElementById(“新注释”).value;
var encrypted=CryptoJS.AES.encrypt(文本、密码);
加密=加密的.toString();
var decrypted=CryptoJS.AES.decrypt(加密,密码);
decrypted=decrypted.toString(CryptoJS.enc.Utf8)
document.getElementById(“已解密”).innerHTML=已解密;
}

请稍候。。。

插入新注释:
我厌倦了将脚本放在try-catch中调试代码,看起来像document.getElementById未定义返回。这是因为方法是在创建元素之前调用的。以下步骤可实现此功能:

负责人:

正文:


请稍候。。。
插入新注释:

您可以检查源代码。。。有一些例子。
任何方法都是使其从密码短语生成密钥、iv和salt的最简单方法,
是加密js.AES.encrypt(“黎明时攻击!”,“密码短语”)的正常方式。
但是您可以在之前设置参数,例如:

CryptoJS.algo.AES.keySize=32
CryptoJS.algo.AES.blockSize=8
CryptoJS.algo.AES.ivSize=16
CryptoJS.algo.EvpKDF.cfg.iterations=100
CryptoJS.algo.EvpKDF.cfg.keySize=32

etc等

谢谢你的回答,但问题是Artjom B.foundI删除了本地存储代码,因为它只会混淆问题。
CryptoJS.algo.AES.blockSize=8
是错误的,AES的块大小始终为16字节。此外,IV大小与块大小相同,始终为16字节,无需为AES设置这两个值。EvpKDF.cfg.iterations的100次迭代可能正确,也可能不正确,瞄准点是100毫秒的CPU时间。
<body onload="setComponents()">
<div id="decrypted">Please wait...</div>
Insert new note:<input type="text" id="new_note"/><input type="button" id="enc_button" value="Save"/>
</body>
CryptoJS.algo.AES.keySize=32
CryptoJS.algo.AES.blockSize=8
CryptoJS.algo.AES.ivSize=16
CryptoJS.algo.EvpKDF.cfg.iterations=100
CryptoJS.algo.EvpKDF.cfg.keySize=32