![](/img/trans.png)
[英]getting different values when encrypting and decrypting values in crypto-js
[英]Crypto-js returns different values every time it's run when using AES
我正在尝试使用 crypto-js 和使用 AES 类型的加密来加密一些东西。
我遇到的问题是每次加密时我的加密值都不同。
在这个简单的例子中,我运行相同的加密 5 次,得到 5 种不同的结果。 这里发生了wtf?
任务.js
var AES = require('crypto-js/aes');
var key = "abc123";
var secret = "encryptThisWord";
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
console.log(AES.encrypt(secret, key).toString());
检查AES.encrypt(secret, key)
- 它是一个具有许多字段、特别感兴趣的iv
和salt
( jsFiddle ) 的对象。
每次运行AES.encrypt
crypto-js 时,都会选择新的 IV 和新的盐(顺便说一下,您可以提供自己的值)。 随机IV意味着即使使用相同的密钥输出也会不同,随机盐意味着实际的加密密钥也不同,因为它是从密码和盐派生出来的。
您可能(实际上,应该)问为什么在加密密钥和 IV 不同的情况下,前十个 Base64 输出字符是相同的? 那是因为在加密结果上调用toString()
会将其转换为“OpenSSL-compatible string”,基本上是Base64("Salted__" + salt + ciphertext)
,其中"Salted__"
是常量前缀,当然,导致Base64 输出中的相同前缀。
我遇到了同样的问题。 这仅仅是因为我们不知道算法的工作原理。 简单来说,加密方法每次调用的key和IV都是不同的,如上面的回答中提到的。
为确保每次迭代的值完全相同 - 您可以参考此答案https://stackoverflow.com/a/47096284/4098272
或者,您可以使用 SHA3 函数并比较两个哈希值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.