javascript - 使用两个不同的 key 加密/解密

标签 javascript encryption encoding cryptojs

我的代码

我正在使用 CryptoJS 使用两个不同的 key 加密一个字符串:

var password = "testpassword";
var serverkey = "randomkey";
var text = document.getElementById("new_note").value;
var encrypted1 = CryptoJS.AES.encrypt(text, password);
encrypted1 = encrypted1.toString();
var encrypted = CryptoJS.AES.encrypt(encrypted1,serverkey);

并尝试用这段代码解密:

var password = "testpassword";
var serverkey = "randomkey";
var encrypted_text = localStorage.getItem("encrypted");
var decrypted1 = CryptoJS.AES.decrypt(encrypted_text,serverkey);
decrypted1 = decrypted.toString();
var decrypted = CryptoJS.AES.decrypt(decrypted1,password);
decrypted = decrypted.toString(CryptoJS.enc.Utf8);
document.getElementById("decrypted").innerHTML = decrypted;

什么不起作用

虽然加密似乎工作正常,但当我尝试将 decrypted1 转换为字符串以便第二次解密时,我得到 Cannot read property 'toString' of undefined 在 chrome 控制台上。这应该意味着第一个解密过程返回一个空字符串。

我的问题

我该如何解决这个问题?

最佳答案

您的变量名有错别字。检查在哪里定义 decrypted 以及在哪里使用它。您打算使用 decrypted1

此外,您的编码有问题。第一个 decrypted1.toString(); 会将字符串编码为十六进制,但之前您调用的 encrypted1.toString(); 不会编码为十六进制,而是一个特殊的 Base64编码(与 OpenSSL 兼容)。您需要编码为 UTF-8,以便获得与之前加密时相同的编码。

这是工作代码:

document.getElementById("enc_button").onclick = function(){
  var password = "testpassword";
  var serverkey = "randomkey";
  var text = document.getElementById("new_note").value;
  var encrypted1 = CryptoJS.AES.encrypt(text, password);
  encrypted1 = encrypted1.toString();
  var encrypted = CryptoJS.AES.encrypt(encrypted1, serverkey);

  var decrypted1 = CryptoJS.AES.decrypt(encrypted,serverkey);
  decrypted1 = decrypted1.toString(CryptoJS.enc.Utf8);
  var decrypted = CryptoJS.AES.decrypt(decrypted1,password);
  decrypted = decrypted.toString(CryptoJS.enc.Utf8);
  document.getElementById("decrypted").innerHTML = decrypted;
}
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/aes.js"></script>
<div id="decrypted">Please wait...</div>
<div>
  Insert new note:
  <input type="text" id="new_note">
  <input type="button" id="enc_button" value="Encrypt & Decrypt">
</div>

关于javascript - 使用两个不同的 key 加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32500342/

相关文章:

c++ - 如何从 UTF-8 字符串的每个字符中获取 UNICODE 代码?

javascript - Angular 渐进式 Web 应用程序在本地主机上工作但不在 IP 上

javascript - SlideToggle 仅单击的元素

javascript - 简单的圆形动画仅在第一次显示

c - 用私钥加密,用公钥解密

c++ - 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

javascript - 在两个页面html之间传递参数

java - 附加到 CipherOutputStream - AES/CTR/NoPadding (Java)

php - android 中的 Base64 和 mcrypt_encrypt

audio - 确定音频文件是否以Apple Lossless(ALAC)编码