我有一个C#应用程序,它使用以下方法加密和解密数据库中的密码:
public static string Encrypt(string input, string key)
{
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
tripleDES.Mode = CipherMode.ECB;
tripleDES.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tripleDES.CreateEncryptor();
byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input);
byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
tripleDES.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
public static string Decrypt(string input, string key)
{
byte[] inputArray = Convert.FromBase64String(input);
TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key);
tripleDES.Mode = CipherMode.ECB;
tripleDES.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tripleDES.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length);
tripleDES.Clear();
return UTF8Encoding.UTF8.GetString(resultArray);
}
因此,如果我使用密钥testing
加密密码0123456789012345
,则结果将为+dc6bsOFg00=
。
现在我必须从NodeJS应用程序(使用CryptoJS)读取这些密码,但我不知道该怎么做,因为在C#中加密是面向字节的(请注意在代码中,input
和key
都转换为byte[]
),而在CryptoJS中,它更多是字符串导向的。
我尝试使用此JavaScript函数但没有成功:
var CryptoJS = require("crypto-js");
function decrypt(input, key) {
var inputArray = new Buffer(input, 'base64');
var inputString = inputArray.toString();
var resultArray = CryptoJS.TripleDES.decrypt(inputString, key, {'mode': CryptoJS.mode.ECB, 'pad': CryptoJS.pad.Pkcs7});
return resultArray.toString();
}
console.log(decrypt("+dc6bsOFg00=", "0123456789012345"));
更新:我知道加密密码是一个坏主意, Triple DES 不是最佳算法,但C#应用程序无法修改(至少目前不是这样),所以我无法改变密码的加密方式,我必须按原样阅读。
答案 0 :(得分:-1)
(代表OP发布)。
感谢您的建议,但使用inputArray.toString('binary')
无效。
我最终解决了我的问题是使用Edge.js:因为我有用于加密和解密的C#方法的代码,所以我可以使用Edge.js从Node应用程序执行这些方法。 / p>