这个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'…值得注意的是,在你的链接问题中提到,填充技术也可能有所不同。
- 如果node.js编译时没有使用openssl,可以在node.js上使用Socket.io吗?
- Nodejs createDecipher可以用两个不同的密钥解密相同的密文
- 如何处理Node.jsencryptionstream中的块长度
- 使用Diffie-Hellman密钥交换和AES进行客户端HTTPencryption
- 如何在节点js中生成和validationJWE?
- Node.js和密码安全性:三个问题
- 如何从nodejs中的守护进程产生gpgsubprocess?
- 麻烦encryption在iOS上和使用RAW RSA在Node.js解密
- NodeJS 6encryption在贬低消息抱怨摘要?