【问题标题】:AES encrypt in .NET and decrypt with Node.js crypto?AES 在 .NET 中加密并使用 Node.js 加密解密?
【发布时间】:2013-06-22 19:03:43
【问题描述】:

我正在尝试在 Mono C# 中加密一些数据,将其发送到 NodeJS 服务器并在那里解密。我正在尝试找出使用什么算法来匹配这两者。

我发送用 base64 编码的加密字符串。所以我在 Javascript 中做了类似的事情,我知道用于加密 C# 应用程序中数据的密钥:

var decipher = crypto.createDecipher('aes192',binkey, biniv);
var dec = decipher.update(crypted,'base64','utf8');
dec += decipher.final('utf8');
console.log("dec", dec);

在 Mono 中,我创建了我的 Cypher:

using System.Security.Cryptography;
using (Aes aesAlg = Aes.Create("aes192"))

我需要将正确的字符串传递给 Aes.Create() 以便让它使用相同的算法,但我找不到它应该是什么。 “aes192”似乎不正确。

我不需要 aes192 这只是一个试用。如果有意义,建议使用不同的加密方式。安全性不是什么大问题。

以下是 .NET 和 Nodejs 文档的链接: http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes.aspx http://nodejs.org/api/crypto.html

【问题讨论】:

  • 你在什么样的情况下保护什么?我认为在这种情况下使用 TLS 可能会更好。
  • 因为您的问题似乎是 .net,而不是 js。在 c#stackoverflow.com/a/10366194/637783 中从 AES 然后 HMac 或 AES-GCM 开始,然后计算出你的 JS。
  • @ntoskrnl 我将其用于质询响应模式以激活许可证。
  • @jbtule 在 c# 中的加密/解密对于引用的示例代码很好。所以我已经有了一个加密字符串,只是在Node.js端无法解密。

标签: c# .net node.js cryptography aes


【解决方案1】:

此代码适用于我的 Node.js 端,但请替换静态 iv,否则 aes 加密将无用。

var crypto = require('crypto');

function encrypt(data, key) {
    key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
        cipher = crypto.createCipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
    cipher.update(data.toString(), 'utf8', 'base64');
    return cipher.final('base64');
}

function decipher(data, key) {
    key = key || new Buffer(Core.config.crypto.cryptokey, 'binary'),
        decipher = crypto.createDecipheriv('aes-256-cbc', key.toString('binary'), str_repeat('\0', 16));
    decipher.update(data, 'base64', 'utf8');
    return decipher.final('utf8');
}

function str_repeat(input, multiplier) {
    var y = '';
    while (true) {
        if (multiplier & 1) {
            y += input;
        }
        multiplier >>= 1;
        if (multiplier) {
            input += input;
        } else {
            break;
        }
    }
    return y;
}

希望对你有帮助。

注意:您需要提供一个 265 位,即 32 个字符的密钥,该算法才能正常工作。

可能的 .NET 解决方案:这可能会对您有所帮助 Example

【讨论】:

  • 太棒了!自从我尝试这样做已经有一段时间了,但我仍然需要回到这个:)
  • 很高兴它帮助了你。
【解决方案2】:

事实证明这是一个愚蠢的错误。我认为 Node.js 中的 create 函数可以采用可变参数计数。原来你需要调用 createDecipheriv() 来代替。

仅作记录,您可以通过查看 Aes 对象中的这些属性轻松检查填充和模式。默认值为 CBC 和 PKCS7。该填充也用于 nodejs 加密。因此,对于 128 密钥大小,我解密 base64 编码字符串的代码将是:

var crypto = require('crypto');
var binkey = new Buffer(key, 'base64');
var biniv = new Buffer(iv, 'base64');
var decipher = crypto.createDecipheriv('aes-128-cbc', binkey, biniv);
var decrypted = decipher.update(crypted,'base64','utf8');
decrypted += decipher.final('utf8');
console.log("decrypted", decrypted);

【讨论】:

    【解决方案3】:

    你应该直接写new AesManaged()
    您无需致电Create()

    然后你需要设置KeyIV,然后调用CreateDecryptor()并将其放入CryptoStream中。

    【讨论】:

    • 好吧,你可以用不同的方式编写代码,但我知道如何使用密钥和 IV 进行加密。我的问题是如何选择 AES 风格,以便在 Node.js 中匹配它进行解密。还是我错过了什么?
    • 同时我了解到数字是密钥大小,你可以从c#中的aes对象中用KeySize查询它,结果是256字节。仍然当我在 nodejs 中尝试“aes-256-cbc”或“aes-256”时,我收到此错误 TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length。打算进一步调查...
    • @0x80 需要匹配操作方式和两边的padding。它有助于明确指定它们,以免依赖于实现特定的行为。
    • CryptoStream 仅适用于您不希望将整个输入/输出放在单个数组中的大量数据。
    • @ntoskrnl 关于我可以在哪里/如何指定填充和操作模式的任何提示?例如,NodeJS 加密模块似乎没有引用它们。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 2012-08-15
    • 2015-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多