3

密码将在 .NET 中使用 AES 加密并存储在数据库中。在另一个应用程序中,使用 javascript(在 Rhino 引擎之上)和 cryptojs 库,我需要解密密码然后使用它。

解决方案不需要很复杂,我所寻求的只是一个简单的实现,我可以让这两个人一起工作。

遵循本指南:http ://www.aspsnippets.com/Articles/AES-Encryption-Decryption-Cryptography-Tutorial-with-example-in-ASPNet-using-C-and-VBNet.aspx

在.NET中使用(“Key”)的密钥成功加密了一个简单的字符串(“SFTPPass”),但是一旦我用javascript解密不知道该怎么做。

这就是我在 javascript 中所拥有的:

var encryptedPass = 'StrmZO1Vjd8noHYzXs8hiQQBQDJZA5Bpg3t4BcmrViU=';

var iv = CryptoJS.enc.Base64.parse('1Ph1oX+N+q/kzpdyaIKBpA==');
var key = CryptoJS.enc.Base64.parse('k/W+Xeenh3kSLneZ/DYXVpvshGbsFVdyfOFdFTJb1yE=');

var SFTPPass = CryptoJS.AES.decrypt(encryptedPass, 'Key', key, {iv: iv});

但是,当我将输出写入文件时,它是空的。

非常欢迎任何建议或替代解决方案!

编辑:根据 alancnet 的建议,我现在得到输出,但字符串与原始字符串“1234”不匹配。所以我按照上面链接中的指南使用相同的关键短语和输入字符串。在 .NET 中使用 BitConverter.toString 捕获了密钥和 iv 的十六进制。

key = "752DA9F0D612540EEF1DE07A144781261A3D604DE339174ADAC5D5D6A695ABFF"
iv = "9714413594225F1D14FA02101C0D584D"

我的 javascript 现在的样子:

var encryptedPass = 'Ao5ZnFYo344iWqv/Jr9euw==';

var iv = CryptoJS.enc.Hex.parse('9714413594225F1D14FA02101C0D584D');
var key = CryptoJS.enc.Hex.parse('752DA9F0D612540EEF1DE07A144781261A3D604DE339174ADAC5D5D6A695ABFF');

var decryptedString = CryptoJS.AES.decrypt(encryptedPass, key, {iv: iv});
4

2 回答 2

3

你的代码:

var SFTPPass = CryptoJS.AES.decrypt(encryptedPass, 'Key', key, {iv: iv});

'Key'是一个意外参数,应该删除。

我将您的代码移植到节点:

var CryptoJS = new require("cryptojs").Crypto;

var encryptedPass = 'StrmZO1Vjd8noHYzXs8hiQQBQDJZA5Bpg3t4BcmrViU=';

var iv = CryptoJS.util.base64ToBytes('1Ph1oX+N+q/kzpdyaIKBpA==');
var key = CryptoJS.util.base64ToBytes('k/W+Xeenh3kSLneZ/DYXVpvshGbsFVdyfOFdFTJb1yE=');

var SFTPPass = CryptoJS.util.bytesToBase64(
        CryptoJS.AES.decrypt(
            encryptedPass, 
            key, 
            {
                iv: iv, 
                asBytes: true
            }
        )
    );

console.log(SFTPPass);

它输出:UABfRxZLApVrt/t8JtoHMhCxfYUPWDwMLuBmWe50tDw=

祝你好运 :)

于 2014-02-27T17:01:21.233 回答
0

我想通了,这是我输出解密字符串的格式。

玩过多个版本...

 FileWrite(decryptedString);
 FileWrite(decryptedString.toString());

最终让它发挥作用的是:

 FileWrite(decryptedString.toString(CryptoJS.enc.Utf8));

请注意“t”和“f”的小写字母,尝试执行“UTF8”,它也给了我完全不同的输出。

再次感谢 alincnet 指出我在尝试使用无效参数时所犯的主要错误,我可能直到当天晚些时候才注意到这一点。

于 2014-02-27T18:20:33.563 回答