Stu*_*orn 7 javascript encryption cryptography cryptojs
我有以下代码:
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script>
<div id="decrypted">Please wait...</div>
Insert new note:<input type="text" id="new_note"><input type="button" id="enc_button" value="Save">
<script>
var password = "testpassword";
var encrypted_text = localStorage.getItem("encrypted");
var rawData = atob(encrypted_text);
var iv = rawData.substring(0,16);
var crypttext = rawData.substring(16);
var plaintextArray = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Latin1.parse(crypttext) },
CryptoJS.enc.Hex.parse(password),
{ iv: CryptoJS.enc.Latin1.parse(iv) }
);
var decrypted = CryptoJS.enc.Latin1.stringify(plaintextArray);
document.getElementById("decrypted").innerHTML = decrypted;
document.getElementById("enc_button").onclick = function(){
var text = document.getElementById("new_note").value;
var encrypted = CryptoJS.AES.encrypt(text, password);
localStorage.setItem("encrypted",encrypted);
}
</script>Run Code Online (Sandbox Code Playgroud)
使用CryptoJS使用AES加密字符串; 解密保存在本地存储中的加密文本,并将结果显示在div中
虽然字符串似乎已加密,但变量decrypt为空.Chrome控制台中未触发任何错误.
如何成功加密和解密我的文本?
CryptoJS有两种略有不同的加密/解密类型.
当你使用
var encrypted = CryptoJS.AES.encrypt(text, password);
Run Code Online (Sandbox Code Playgroud)
那么你使用的是基于密码的加密,这与基于纯密钥/ IV的加密不同.这意味着密码和随机生成的盐通过一次MD5调用运行,以生成实际加密的密钥和IV.这是一种OpenSSL兼容的加密方式.该encrypted对象存储用于生成密钥和IV的随机盐.
当您强制encrypted转换为字符串(如将其添加到localStorage)时,它将转换为包含salt的OpenSSL兼容字符串编码.为了再次解密它,您不需要自己处理密钥,IV或盐,因为CryptoJS会自动为您执行此操作:
var decrypted = CryptoJS.AES.decrypt(encrypted, password);
Run Code Online (Sandbox Code Playgroud)
请记住,这decrypted是一个WordArray对象,当您强制将其转换为字符串时,它会默认将内容编码为十六进制.如果您不想这样,那么您需要自己指定UTF-8等编码.
当解密因某些原因(例如错误的密钥,错误的密文或错误的编码)而失败时,通常会返回空白值.CryptoJS不会抛出自定义错误消息,但会尝试继续,因为您应该知道自己在做什么.
完整代码:
var password = "testpassword";
document.getElementById("enc_button").onclick = function(){
var text = document.getElementById("new_note").value;
var encrypted = CryptoJS.AES.encrypt(text, password);
encrypted = encrypted.toString();
var decrypted = CryptoJS.AES.decrypt(encrypted, password);
decrypted = decrypted.toString(CryptoJS.enc.Utf8)
document.getElementById("decrypted").innerHTML = decrypted;
}Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
<div id="decrypted">Please wait...</div>
Insert new note:<input type="text" id="new_note"><input type="button" id="enc_button" value="Encrypt & Decrypt">Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6049 次 |
| 最近记录: |