AES解密返回空字符串

时间:2018-12-01 15:32:20

标签: javascript node.js angular encryption aes

我已经开始学习一些加密技术,并试图在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

预先感谢

1 个答案:

答案 0 :(得分:0)

我将首先查看以下链接,请注意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)可能是您问题的开始...但是从您的连接过程来看,我怀疑那里也可能存在问题。

您每次加密都会生成一个随机的初始化向量,因此应该在其中进行一定的混淆处理...我只需要base64 IV并将其与诸如{{例如1}} ...这样的事情会使解密阶段的生活变得更轻松,因为将两者隔离开来...与您现在做的事情相比,解决问题也容易得多。

  

这将导致:iv:ciphertext分隔符连接   两者: ...如果您有疑虑,则可以base64将其输出,然后再通过电线进行传输...不是说这样可以确保它的安全性...但是至少成为另一层迷惑。

base64

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

我知道这不是复制粘贴解决方案,但我希望这将为您提供足够的信息,使您可以到达所需的位置。


修订

希望这是复制和粘贴...如果可以的话,您可以根据需要进行修改。

splice(4,4)