每次使用CryptoJS加密相同的文本时,输出都是不同的

Jos*_*ita 4 javascript encryption cryptography aes cryptojs

对于使用CryptoJS加密某些东西浪费了很多时间,我感到非常沮丧,一段时间之后,我意识到每次使用相同的输入加密结果都是不同的!这怎么可能?

这是我的代码,您可以检查是否为真:https : //jsfiddle.net/z5dg623q/1/

<script>
    function encrypt() {
        document.getElementById("stringOutput").value = CryptoJS.AES.encrypt("lorem ipsum", "hAPgT2mj0ZzD1epO").toString();
    }
</script>

<textarea id="stringOutput" cols="100" rows="10"></textarea>
<button type="button" onClick="encrypt()">Encrypt that!</button>
Run Code Online (Sandbox Code Playgroud)

有谁能够帮助我?

Art*_* B. 5

当您将两个字符串传递给CryptoJS.<Cipher>.encrypt()您时,您告诉CryptoJS使用基于密码的加密。假定第一个字符串是UTF-8编码的数据,第二个字符串是密码,该密码将通过MD5发送以获取256位密钥和128位IV。这由所谓的EvpKDF(请参阅12)使用随机盐(请参见此处)完成。

这意味着在每次调用中,代码都将生成一个新的随机盐,该盐将每次用于导出不同的密钥和IV,从而每次均导致不同的密文。此属性称为语义安全性,它例如防止攻击者仅通过查看密文来确定明文是否相等。有时这是至关重要的安全属性。

当你调用toString()encrypt()结果,它会序列密文成OpenSSL兼容的格式,其中包括盐。因此,您只需要密码和该字符串即可对其进行解密。

当您尝试对其进行解密时,密文中的盐和密码将用于导出与加密时相同的密钥和IV。因此,它可以恢复原始的纯文本。如果使用了错误的密码,结果将为空或乱码。