您的位置:首页 > 编程语言 > C语言/C++

C语言的3des、java的3des、C#的3des。三种加密遇到的问题

2011-05-19 16:27 866 查看
今天疼的我蛋都碎了。

我用C#对一字符串进行加密。总是与C语音和java的加密结果不一致。最终还是因为填充模式和运算模式的问题。。

代码如下

public static string TripleDESEncrypt(string pToEncrypt, string sKey)
{
try
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = new Byte[] {0, 00, 00, 00, 00, 00, 00, 00, };// ASCIIEncoding.ASCII.GetBytes(sKey.Substring(0, 8));
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();;
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
///DES解密
public static string TripleDESDecrypt(string pToDecrypt, string sKey)
{
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.Zeros;
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = new Byte[] { 0, 00, 00, 00, 00, 00, 00, 00, };
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: