这个C#encryption代码在NodeJS中看起来像什么?

三重数据encryption不会在PHP和C#中产生相同的结果

public static string Encrypt(string toEncrypt, string key, bool useHashing) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); if (useHashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; tdes.Mode = CipherMode.ECB; tdes.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = tdes.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } 

上面的post和代码有一些非常直接的(或者我认为)逻辑来使用3DES和私钥对string进行encryption/解密。

我已经find了一些如何在nodejs中使用crypt库实现类似的例子,但是到目前为止我所尝试过的所有东西都产生了垃圾(正确的)。

思考?

UPDATE1:

下面是一些C#代码来生成我正在使用的数据:

  String key = "abcdefghijklmnop"; String text = "12345"; String encrypted = Encrypt(text, key, false); //Returns "QI3I65+aWSk=" 

这里是我正在使用的nodejs代码的最新版本:

  var crypto = require('crypto'); var key = 'abcdefghijklmnop'; var encrypted = 'QI3I65+aWSk='; var expected = '12345'; var algs = [ 'des3', 'des-ede', 'des-ede3', 'des-ecb', 'aes-128-ecb']; for(var i in algs) { var decipher = crypto.createDecipher(algs[i], key); var result = '' result += decipher.update(encrypted, 'hex', 'binary'); result += decipher.final('binary'); console.log('Algorithm: ' + algs[i] + ', Matched Expected: ' + (result === expected)); } 

..哪个返回

  Algorithm: des3, Matched Expected: false Algorithm: des-ede, Matched Expected: false Algorithm: des-ede3, Matched Expected: false Algorithm: des-ecb, Matched Expected: false Algorithm: aes-128-ecb, Matched Expected: false 

我不清楚究竟使用哪种algorithm(我的列表在以前的尝试中显着更长)现在我确定要使用什么编码组合(二进制/hex)。

再次感谢。

UPDATE2:从引用的文章中通过encryption方法复制:

三重数据encryption不会在PHP和C#中产生相同的结果

那么,我花了一段时间才弄清楚这个问题。

首先关于DESalgorithm,DESalgorithm需要一个IV (初始向量)encryption,以及密钥System.Security.Cryptography DESalgorithm将在未指定时随机生成一个IV。 而解密时,你需要密钥IV

这就是为什么你的代码永远不会工作,因为你的解密程序只是不知道IV在encryption中使用了什么,而且会生成另一个IV本身,它与随机的IV本身不匹配。

其次你的JavaScript代码在很多地方是错误的:

 decipher.update(encrypted, 'hex', 'binary') 

其中encrypted不是以hex编码,而是以base64编码,并且需要输出结果为base64而不是二进制。 阅读文件 。

['des3','des-ede','des-ede3','des-ecb','aes-128-ecb']

所有这些algorithm都与您使用的encryptionalgorithm不同。 正如你指定使用CipherMode.ECB这是不build议和openssh根本不支持,所以它是不可能的解密。

所有加起来,你的代码将无法正常工作。

这是正确的做法:

 using System; using System.Text; using System.Security.Cryptography; public class Test { public static string Encrypt(string toEncrypt, string key, bool useHashing) { byte[] keyArray; byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt); if (useHashing) { MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider(); keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key)); } else keyArray = UTF8Encoding.UTF8.GetBytes(key); var tdes = new TripleDESCryptoServiceProvider(); tdes.Key = keyArray; // tdes.Mode = CipherMode.CBC; // which is default // tdes.Padding = PaddingMode.PKCS7; // which is default Console.WriteLine("iv: {0}", Convert.ToBase64String(tdes.IV)); ICryptoTransform cTransform = tdes.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } public static void Main() { Console.WriteLine("encrypted as: {0}", Encrypt("12345", "abcdefghijklmnop", false)); } } 

哪个输出

 iv: pdMBMjdeFdo= encrypted as: 3uDkdT6aQ3c= 

在node.js中使用正确的des-ede-cbcalgorithm:

 var crypto = require('crypto'); var alg = 'des-ede-cbc'; var key = new Buffer('abcdefghijklmnop', 'utf-8'); var iv = new Buffer('pdMBMjdeFdo=', 'base64'); var encrypted = new Buffer('3uDkdT6aQ3c=', 'base64'); var source = '12345'; var cipher = crypto.createCipheriv(alg, key, iv); var encoded = cipher.update(source, 'ascii', 'base64'); encoded += cipher.final('base64'); console.log(encoded, encrypted.toString('base64')); var decipher = crypto.createDecipheriv(alg, key, iv); var decoded = decipher.update(encrypted, 'binary', 'ascii'); decoded += decipher.final('ascii'); console.log(decoded, source); 

哪个输出

 3uDkdT6aQ3c= 3uDkdT6aQ3c= 12345 12345 

现在问题解决了。

你的input编码看起来应该是'base64'…值得注意的是,在你的链接问题中提到,填充技术也可能有所不同。