【问题标题】:React Native CryptoJS giving empty value for AES-256-CBC decryptionReact Native CryptoJS 为 AES-256-CBC 解密提供空值
【发布时间】:2021-04-13 02:19:36
【问题描述】:

我正在为 React Native CryptoJS 使用这个 https://github.com/imchintan/react-native-crypto-js 包,并且我使用这个在线工具 https://www.javainuse.com/aesgenerator 来生成这个示例数据:

    const encryptedData = {
        cipher: "OuCmv1nXCzfy+529oeJU8g==",
        iv: "1234123412341234",
        key: "56785678567856785678567856785678"
    }

虽然选择的加密模式是CBC,但密钥大小是256 位,输出格式是base64 in react native,这就是我解密它的方式:

    let bytes = CryptoJS.AES.decrypt(encryptedData.cipher, encryptedData.key);
    let originalText = bytes.toString(CryptoJS.enc.Utf8);

    console.log("Text is: " + originalText);

但我得到的只是Text is:

【问题讨论】:

    标签: reactjs react-native encryption cryptojs


    【解决方案1】:

    当您为 CryptoJS Cipher 提供一个实际上是字符串的“密钥”时,它会将其视为密码并使用与 OpenSSL enc 兼容的基于密码的密钥派生,如指定​​的 in the documentation。您需要将密钥和 iv 转换为 WordArrays,如 just above that 所示,另外我找不到如何使“可配置”解析工作,所以我也显式解析,如下所示。

    const CryptoJS = require('crypto-js');
    var key = CryptoJS.enc.Latin1.parse("56785678567856785678567856785678")
    var iv = CryptoJS.enc.Latin1.parse("1234123412341234")
    var ctx = CryptoJS.enc.Base64.parse("OuCmv1nXCzfy+529oeJU8g==")
    var enc = CryptoJS.lib.CipherParams.create({ciphertext:ctx})
    console.log( CryptoJS.AES.decrypt (enc,key,{iv:iv}) .toString(CryptoJS.enc.Utf8) )
    ->
    Talha
    

    从技术上讲,decrypt 的结果与parse 一样,是WordArray,因此称其为bytes 有点误导和混淆。

    【讨论】:

    • 您好,谢谢您的回答。这适用于这个特定的示例,但我没有意识到的是,我在解密时点击 API 后得到的 base64 对象会给我一个字符串。我必须将其解析为 JSON 数据。当数据被加密为 JSON.stringify(data) 开发人员给了我这个要点作为他如何加密数据的参考gist.github.com/siwalikm/8311cf0a287b98ef67c73c1b03b47154 这是我第一次使用 AES,所以我不确定去哪里,但是如果可能的话,您能否更新您的答案以说明如何处理?
    • ^^ 添加到上面我做了一些更改,比如我直接添加了response.data 并添加了KEYIV 作为字符串我得到这么长的{"sigBytes": 26848, "words":... 打印在日志中。
    • decrypt 的结果是一个 WordArray,正如我所说,如果你输出那个 object 你会得到你显示的结果;这就是为什么您需要调用.toString(encoder) 将其设为字符串的原因,正如我所展示的。一旦你有一个字符串处理它,因为 JSON 是一个完全独立的问题,与 AES 无关,不在你的问题中,我没有经验可以帮助,但我确定 Stack 已经涵盖数百或数千次。
    • 知道了!谢谢你。我认为我最后的编码器给了我Malformed UTF-8 data,这意味着在加密期间,支持的人没有正确加密它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多