AES在.NET中加密并使用Node.js加密解密?

时间:2013-06-25 20:09:00

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

我正在尝试加密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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您应该只写new AesManaged() 您无需致电Create()

然后,您需要设置KeyIV,然后拨打CreateDecryptor()并将其放入CryptoStream

答案 2 :(得分:0)

原来这是一个愚蠢的错误。我认为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);