密码将使用AES在.NET中加密并存储在数据库中。在另一个应用程序中,使用javascript(在Rhino引擎上)和cryptojs库,我需要解密密码然后使用它。
解决方案不需要复杂,我所寻求的只是一个简单的实现,我可以让这两个人一起工作。
在.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”不匹配。所以我按照上面链接中的指南使用相同的关键短语和输入字符串向下连线。捕获了钥匙和钥匙的十六进制iv在.NET中使用BitConverter.toString。
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});
答案 0 :(得分:2)
您的代码:
var SFTPPass = CryptoJS.AES.decrypt(encryptedPass, 'Key', key, {iv: iv});
'Key'
是一个意外的参数,应该删除。
我将您的代码移植到Node:
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=
答案 1 :(得分:0)
我想通了,这是我输出解密字符串的格式。
玩了多个版本......
FileWrite(decryptedString);
FileWrite(decryptedString.toString());
最终让它发挥作用的是:
FileWrite(decryptedString.toString(CryptoJS.enc.Utf8));
请注意“t”和“f”的小写,尝试做“UTF8”,它也给了我完全不同的输出。
再次感谢alancnet指出我在尝试使用无效参数时所犯的主要错误,我可能不会注意到直到当天晚些时候。