【问题标题】:Encrypt (cryptojs) - Decrypt (.NET)加密 (cryptojs) - 解密 (.NET)
【发布时间】:2014-02-27 15:47:54
【问题描述】:

密码将在 .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});

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

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

编辑: 在 alincnet 的推荐下,我现在得到了输出,但字符串与原始字符串“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});

【问题讨论】:

  • 请说明您是如何输出到文件的。
  • 这很难解释。所以我使用了一个用 Java 构建的单独的应用程序(它使用 Rhino 作为脚本引擎)。在这个应用程序中,他们使用了一个名为“File Writer”的选项,我给它一个字符串(SFTPPass),它会自动处理写入文件的细节。该程序称为 Mirth Connect。编辑:现在我想起来了,你的意思是我是如何从 .NET 输出的吗?
  • 我怀疑它正在做某事,但失败在于写入文件。有什么方法可以在这里注入自己的代码以输出到其他地方吗?或者您可以调试它并在断点处检查变量吗?
  • 你能澄清一下我们是在谈论来自 .NET 还是来自 JavaScript 的输出?
  • 在 JavaScript 中。可以直接查看SFTPPass的值吗?

标签: javascript .net cryptojs


【解决方案1】:

您的代码:

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=

祝你好运:)

【讨论】:

  • 是的,这对我来说是个愚蠢的错误。我更新了我的原始帖子,请随意尝试我发布的值,看看您是否仍然获得预期的输出。代替base64字符串,你能输出原始字符串,即“1234”吗?
  • 你可以new Buffer(bytes).toString(),但是当我这样做的时候,我开始胡言乱语了。这意味着值不正确,但代码有效。
  • 给你的老朋友一个向上箭头和一个绿色复选标记怎么样?我正在努力提高代表:)
  • 当我有足够的代表点数时,我肯定会回来并这样做,我只有 11 个。 :(
  • 耶,我终于受够了。
【解决方案2】:

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

玩过多个版本...

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

最终让它发挥作用的是:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2015-08-27
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多