AES在.NET中加密,并使用Node.js加密进行解密
本文关键字:加密 js Node 解密 NET AES | 更新日期: 2023-09-27 18:19:56
我试图在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.aspxhttp://nodejs.org/api/crypto.html
这段代码适用于我的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解决方案:这可能会帮助您示例
您应该简单地编写new AesManaged()
您不需要呼叫Create()
。
然后需要设置Key
和IV
,然后调用CreateDecryptor()
并将其放入CryptoStream
中。
作为记录,您可以通过查看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);