========== C#代码 ==========
private static byte[] KEY = { 1, 2, 3, 4, 5, 6, 7, 8 };
private static byte[] IV = { 1, 2, 3, 4, 5, 6, 7, 8 };
public static string EncryptDes(string input)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
MemoryStream ms = null;
CryptoStream encStream = null;
StreamWriter sw = null;
string result = String.Empty;
try
{
ms = new MemoryStream();
encStream = new CryptoStream(ms, des.CreateEncryptor(KEY, IV), CryptoStreamMode.Write);
// Create a StreamWriter to write a string
// to the stream.
sw = new StreamWriter(encStream);
// Write the plaintext to the stream.
sw.WriteLine(input);
sw.Flush();
encStream.FlushFinalBlock();
ms.Flush();
byte[] bytes = ms.GetBuffer();
Console.WriteLine(BitConverter.ToString(bytes, 0, 24));
result = Convert.ToBase64String(bytes, 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));
}
finally
{
//close objects
}
return result;
}
========== Node.js代码 ==========
var crypto = require(‘crypto’); var KEY = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; var IV = [ 1, 2, 3, 4, 5, 6, 7, 8 ]; exports.encryptDes = function(input){ var cipher = crypto.createCipheriv(‘des’, new Buffer(KEY), new Buffer(IV)); var buf1 = cipher.update(input, ‘utf8’); var buf2 = cipher.final(); var result = new Buffer(buf1.length + buf2.length); buf1.copy(result); buf2.copy(result, buf1.length);
return result.toString('base64');
};
我也碰到过类似的,我当时是用C加密,node解密,C加密的时候是没有IV这个参数的,node解密的时候IV向量用的是16字节的0,结果和C保持一致了。只知道这么解决了,资料比较少,当时没有搞懂,现在同求大神解答。 ps:C不是很懂,依样画葫芦,使用的时候只需要传一个key参数就可以了,而node是有两种方法的,当时我就混乱了
主要是以前C#的系统中使用了 IV 这个变量来加密,所以Node这边要解密C#那边遗留下的数据的话,按理说两边是需要使用相同的 IV 向量的。问题是现在两边都用同一个 IV,但是出来的结果却不一样。网上相关的资料也很少,只能等大神来解答~
每个加密算法的实现都是有差异的,网上找找跨语言的加密库。
哈哈,刚刚把问题解决了。原来上面C#代码在使用StreamWriter写加密流的时候使用了 sw.WriteLine(input) 这个方法,导致了最后多了两个字节(0D, 0A),而Node那边因为少了这两个字节,所以加密出来的结果不一样。 刚刚我手动给Node的数据加上0D, 0A两个字节后,加密出来的结果是一样的。所以我想Node和.NET在对DES加密算法的实现应该是一样的吧。不过还是谢谢你的热心回答~