无法使用CryptoJS破译某些加密文本

问题描述 投票:0回答:1

我通过以下方式加密一组数据:

const dataToEncrypt = `${userId}-${unixTime}`;

const encryptedData = CryptoJS.AES.encrypt(dataToEncrypt, CryptoJS.enc.Utf8.parse("4v7KVa1U_>()7b[CI4IV+KRy<78h-@z5"), {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7,
});

问题是它无法解密!

我在 PHP 中尝试过,并且使用在线 AES 工具它可以工作:

但是使用 CryptoJS:

const data = req.query.data; //data received through express webapp api endpoint

const decryptedData = CryptoJS.AES.decrypt(data, "4v7KVa1U_>()7b[CI4IV+KRy<78h-@z5", {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7,
});

它不起作用并且不返回任何内容。我尝试将参数转换为 Utf8 或 Base64 或其他格式,尝试使用 toString 显示结果,仍然没有任何结果?

知道问题出在哪里吗?预先感谢!

node.js cryptography aes cryptojs
1个回答
0
投票

在CryptoJS加密代码中,使用Utf8编码器将密钥材料转换为WordArray。您的 CryptoJS 解密代码中缺少此转换。相反,您将密钥材料作为字符串传递,这意味着 CryptoJS 使用密钥派生函数来派生实际密钥 s。 密码输入。这会导致加密和解密时密钥不同,从而导致解密失败。

如果这个问题被修复,解密就可以工作。示例代码:

// Encryption
const dataToEncrypt = `The quick brown fox jumps over the lazy dog`;
const encryptedData = CryptoJS.AES.encrypt(
    dataToEncrypt, 
    CryptoJS.enc.Utf8.parse("4v7KVa1U_>()7b[CI4IV+KRy<78h-@z5"), 
    {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
    }
);
const data = encryptedData.toString();
console.log("Ciphertext: " + encryptedData);

// Decryption
const decryptedData = CryptoJS.AES.decrypt(
    data, 
    CryptoJS.enc.Utf8.parse("4v7KVa1U_>()7b[CI4IV+KRy<78h-@z5"), 
    {
          mode: CryptoJS.mode.ECB,
          padding: CryptoJS.pad.Pkcs7,
    }
);
console.log("Decrypted data: " + decryptedData.toString(CryptoJS.enc.Utf8));
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>

现在解密就像使用在线工具一样。


安全性:请注意,使用密码时,应使用密钥派生函数(例如 Argon2 或至少 PBKDF2)。此外,欧洲央行也不安全。使用带有 IV 的模式,最好是经过身份验证的加密,例如 GCM。
但是,CryptoJS 不支持 GCM。由于 CryptoJS 已停产并且不再维护,您应该考虑切换到另一个库,最好是支持像 GCM 这样的身份验证加密的库,例如 WebCrypto

© www.soinside.com 2019 - 2024. All rights reserved.