【问题标题】:AES decryption returns empty stringAES 解密返回空字符串
【发布时间】:2018-12-02 10:00:05
【问题描述】:

我已经开始学习一些加密的东西,并试图在 Angular 7 的一个辅助项目中实现 AES 加密。 加密返回一个密文,但是当我解密密码时它返回空字符串。 我尝试在互联网上搜索,但找不到任何解决方案,也许有人可以提供帮助。

 encryptPasswords(credentials: PasswordData) {

        const password = credentials.password;

        // msgString is expected to be Utf8 encoded
        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const iv = CryptoJS.lib.WordArray.random(16);
        const encrypted = CryptoJS.AES.encrypt(password, key, {
            iv: iv
        });
        return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
    }

    decryptPasswords(credentials: PasswordData) {
        /*
        * Decrypt payload
        * @param {string}  ciphertextStr - Encrypted Payload
        * @return {}
        */

        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const ciphertext = CryptoJS.enc.Base64.parse(credentials.password);

        // split IV and ciphertext
        const iv = ciphertext.clone();
        iv.sigBytes = 16;
        iv.clamp();
        ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
        ciphertext.sigBytes -= 16;

        // decryption
        const decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, key, {
            iv: iv
        });
        console.log(decrypted);
        return decrypted.toString(CryptoJS.enc.Utf8);
    }

PS:- 我还在学习,所以可能会有一些愚蠢的错误:P

提前致谢

【问题讨论】:

  • 理想的加密应该在服务器端完成。从这个角度来看,如果您想在 node.js 中执行此操作,您可能需要参考这个答案。看懂解释就可以自己调试了:stackoverflow.com/a/53573115/1235935

标签: javascript node.js angular encryption aes


【解决方案1】:

我将首先查看以下链接,请注意ciphertext = ....).toString()

  • 调用encrypt.toString() 输出加密已经base64 编码。

然后你会注意到他们立即将ciphertext = ....).toString() 的输出传递给解密。

https://github.com/brix/crypto-js#object-encryption


我不确定使用encrypt.ciphertext 的后果我个人不使用它,所以我无法对此发表评论......但我知道以下输出不一样...... . 这需要进一步调查。

console.log(encrypted.toString())
console.log(CryptoJS.enc.Base64.stringify(encrypted.ciphertext))

请注意:我相信解密期望密文是base64 字符串...至少在我的应用程序中是这样。


我怀疑 encrypt.toString()CryptoJS.enc.Base64.stringify(encrypted.ciphertext) 可能是您的问题的开始......但是看看您的连接过程,我怀疑那里也可能存在问题。

您正在为每个加密生成一个随机初始化向量,因此那里应该有一定的混淆层......我只需 base64IV 并将其与诸如 : 之类的定界字符连接起来。 .. 就隔离这两者而言,这样的事情会在解密阶段让生活变得更轻松...与您现在所做的相比,解决问题也会容易得多。

这将导致iv:ciphertext: 分隔符连接 base64...混淆。

btoa(iv)+':'+encrypted.toString()

我会说我认为拼接可能是个问题...查看控制台日志中的源和目标...我认为拼接可能需要为 splice(4,4) 因为这 4 个索引似乎是您的索引想要...但是我对您如何尝试这部分不太熟悉...所以我会推迟。

我知道这不是一个复制粘贴解决方案,但我希望这将是足够的信息,让你去你需要去的地方。


修订

希望这是复制和粘贴...如果是这样,它将是一个工作基线,您可以根据需要进行修改。

encryptPasswords(credentials: PasswordData) {

        const password = credentials.password;

        // msgString is expected to be Utf8 encoded
        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        const iv = CryptoJS.lib.WordArray.random(16);
        const encrypted = CryptoJS.AES.encrypt(password, key, {
            iv: iv
        });

        return btoa(btoa(iv)+':'+encrypted.toString())
        // return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
    }

    decryptPasswords(credentials: PasswordData) {
        /*
        * Decrypt payload
        * @param {string}  ciphertextStr - Encrypted Payload
        * @return {}
        */

        const key = CryptoJS.enc.Utf8.parse(utilities.localStorageHelper.LowLevelKey);
        // const ciphertext = CryptoJS.enc.Base64.parse(stringBase64);
        const ciphertextArray = atob(stringBase64).split(':');

        const iv = ciphertextArray[0];
        const ciphertext = ciphertextArray[1]

        // split IV and ciphertext
        // const iv = ciphertext.clone();
        // iv.sigBytes = 16;
        // iv.clamp();
        // ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
        // ciphertext.sigBytes -= 16;

        // decryption
        const decrypted = CryptoJS.AES.decrypt(ciphertext, key, {
            iv: iv
        });

        return decrypted.toString(CryptoJS.enc.Utf8);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多