Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AES在.NET中加密并使用Node.js crypto解密?_C#_.net_Node.js_Cryptography_Aes - Fatal编程技术网

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

C# AES在.NET中加密并使用Node.js crypto解密?,c#,.net,node.js,cryptography,aes,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 += deciph

我试图在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中,我使用以下命令创建密码:

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

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

以下是指向.NET和Nodejs文档的链接:

您只需编写
new AesManaged()

您不需要调用
Create()


然后,您需要设置
密钥
IV
,然后调用
CreateDecryptor()
,并将其放入
加密流

,结果证明这是一个愚蠢的错误。我认为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);

此代码适用于我的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位的aka 32字符密钥,此算法才能工作


可能的.NET解决方案:这可能会帮助您

好吧,这样您就可以以不同的方式编写代码,但我知道如何使用密钥和IV进行加密。我的问题是如何选择AES风格,以便在Node.js中匹配它进行解密。或者我遗漏了什么?与此同时,我了解到数字是密钥大小,你可以从c#中的aes对象中查询它,使用KeySize,结果是256字节。但当我在nodejs中尝试“aes-256-cbc”或“aes-256”时,仍然会得到以下错误类型错误:错误:0606506D:数字信封例程:EVP\u decryptofinal\u ex:错误的最终块长度。要进一步调查…@0x80,您需要匹配操作模式和两侧的填充。它有助于显式地指定它们,以避免依赖于特定于实现的行为。
CryptoStream
仅适用于不希望整个输入/输出在单个数组中的大量数据。@ntoskrnl关于我可以在何处/如何指定填充和操作模式的提示?例如,NodeJS加密模块似乎没有引用它们。在什么情况下,您要保护什么?我认为在这种情况下,您最好使用TLS。因为您的问题似乎是.net,而不是js。如何从AES开始,然后在c#中使用HMac或AES-GCM,然后计算出您的JS。@ntoskrnl我将其用于许可证激活的质询-响应模式。@c#中的jbtule加密/解密与引用的示例代码配合得很好。所以我已经有了一个加密字符串,只是我不能在Node.js端解密它。太好了!我已经有一段时间没有试着这么做了,但我仍然需要回到这一点:)很高兴它帮助了你。