C# Net中的AES加密和节点JS中的解密

C# Net中的AES加密和节点JS中的解密,c#,node.js,.net,encryption,cryptojs,C#,Node.js,.net,Encryption,Cryptojs,我有一个简单的带有crypto js库的node js代码,通过它我解密一个json对象,我将从一个基于.net的桌面应用程序接收它,因此整个过程是跨平台的。为了进行测试,我可以使用crypto js库轻松加密并解密它生成的密文。但我怀疑这种方法是否能与.net中的加密兼容。由于我是新手,到目前为止我学到的是crypto js库生成一个随机积分向量(IV)值。如果一个IV也是由.net代码生成的,那么我是否也需要在节点js的解密过程中指定它?目前我只使用文档中给出的简单示例,没有指定IV或pad

我有一个简单的带有crypto js库的node js代码,通过它我解密一个json对象,我将从一个基于.net的桌面应用程序接收它,因此整个过程是跨平台的。为了进行测试,我可以使用crypto js库轻松加密并解密它生成的密文。但我怀疑这种方法是否能与.net中的加密兼容。由于我是新手,到目前为止我学到的是crypto js库生成一个随机积分向量(IV)值。如果一个IV也是由.net代码生成的,那么我是否也需要在节点js的解密过程中指定它?目前我只使用文档中给出的简单示例,没有指定IV或padding,我不确定这个库是否使用了任何默认规范。简言之,我只需要确保我做得正确,并且用于解密的方法不会对加密部分造成任何问题

var CryptoJS = require("crypto-js");

var aeskey = "bQeThWmZq4t7w!z%C*F-JaNcRfUjXn2r";
var cloudcreds = {
  accessKeyId: "abcdef",
  accessKeySecret: "zxywvt",
};

//Encryption - Tbd with .net
var encryptedData = CryptoJS.AES.encrypt(
  JSON.stringify(cloudcreds),
  aeskey
).toString();
console.log("Encrypted Cloud Creds =>", encryptedData);

//Decryption - With node js
var bytes = CryptoJS.AES.decrypt(encryptedData, aeskey);
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
console.log("Decrypted Cloud Creds => ", decryptedData);

对于加密模块,我现在正在使用我自己的IV,到目前为止,它似乎可以工作

var crypto = require("crypto");

var algorithm = "aes-256-cbc"; //algorithm to use
const key = "3zTvzr3p67VC61jmV54rIYu1545x4TlY"; //create key
var data = {
  name: "Catalin",
  surname: "Munteanu",
  address: "Romania",
};
data = JSON.stringify(data);
const iv = "0000000000000000"; // generate different ciphertext everytime

const cipher = crypto.createCipheriv(algorithm, key, iv);
var encrypted = cipher.update(data, "utf8", "base64") + cipher.final("base64"); // encrypted text
console.log(encrypted);

const decipher = crypto.createDecipheriv(algorithm, key, iv);
var decrypted = decipher.update(encrypted, "base64", "utf8") + decipher.final("utf8"); //deciphered text
console.log(JSON.parse(decrypted));

由于解密总是根据加密进行定制,因此还应该发布执行加密的.NET代码。解密需要加密中使用的IV(AES为16字节)。通常,在加密过程中会生成一个随机IV,它是与密文(通常为IV |密文顺序)进行二进制连接的。因为IV不是秘密,所以不需要加密。结果被发送给接收者,接收者可以分离这两部分并执行解密。关于CryptoJS,您必须记住密钥必须作为
WordArray
传递,否则它将被解释为密码,从中派生出实际密钥(32字节)和IV,就像您发布的示例代码一样。这可能不会发生在.NET端,因此您不应该使用此密钥派生,这可以通过将密钥和IV作为
WordArray
传递来实现。但正如我所说,这取决于你没有发布的加密。事实上,.net代码仍然落后了几个月,所以要先完成节点js的解密部分。我开始理解这些概念,但还没有完全理解。你认为我应该在node中使用内置的crypto库而不是crypto js并静态地传递IV吗?这能解决IV被随机分配的问题吗?不管你是从加密还是解密开始,双方最终都必须结合在一起。您使用哪个库取决于需求,但是AES/CBC/PKCS7(在您的CryptoJS代码中)可以处理任何现代对称库。如果您在NodeJS环境中,为什么不使用NodeJS的加密模块呢?关于IVs,有一条简单的规则:一对钥匙/IV只能使用一次。检查您的设计是否符合此规则。通常,为了防止多次使用(使用相同的密钥),每次加密都会生成一个新的随机IV。这是否意味着如果cryptoJs encryption随机分配一个IV,那么如果使用其他方法加密数据,即使密钥相同(即.net),也无法解密数据?仍然缺少的是随机IV生成,IV和密文的串联和分离,以避免多次使用密钥/IV对。是的,我想我将从.net应用程序接收随机生成的密钥和IV,以便在node js中间件中使用。