请教大家为什么我用TDES(3重DES加密算法)加密解密字符串后,该字符串少了一截?

stg609 2008-12-30 01:40:09
我用TripleDES加密一个字符串,且设置该算法的KEY和IV设置为固定值。
但是用这个加密一个字符串后生成字节数组。
然后对该字节数组用同样用TripleDES解密,却发现少了一截数据,不知道为什么,请大家帮忙看看。

代码如下:

/// <summary>
/// 3DES加密方法
/// </summary>
/// <param name="strPlain">明文</param>
/// <param name="strDESKey">密钥</param>
/// <param name="strDESIV">向量</param>
/// <param name="ReturnBytes">标志位,如果返回数组则填写标志位</param>
/// <returns>密文</returns>
public static byte[] TripleDESEncrypt(string strPlain, string strDESKey, string strDESIV, bool ReturnBytes)
{
//把密钥转换成字节数组
byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey);
//把向量转换成字节数组
byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV);
//声明1个新的3DES对象
TripleDESCryptoServiceProvider tripledesEncrypt = new TripleDESCryptoServiceProvider();
//开辟一块内存流
MemoryStream msEncrypt = new MemoryStream();
//把内存流对象包装成加密流对象
CryptoStream csEncrypt = new CryptoStream(msEncrypt, tripledesEncrypt.CreateEncryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Write);
//把加密流对象包装成写入流对象
StreamWriter swEncrypt = new StreamWriter(csEncrypt);
//写入流对象写入明文
swEncrypt.WriteLine(strPlain);
//写入流关闭
swEncrypt.Close();
//加密流关闭
csEncrypt.Close();
//把内存流转换成字节数组,内存流现在已经是密文了
byte[] bytesCipher = msEncrypt.ToArray();
//内存流关闭
msEncrypt.Close();
tripledesEncrypt.Clear();
return bytesCipher;
}

/// <summary>
/// 3DES解密方法
/// </summary>
/// <param name="bytes">包含密文的字节数组</param>
/// <param name="lenght">字节数组中需要加密的字节长度</param>
/// <param name="strDESKey">密钥</param>
/// <param name="strDESIV">向量</param>
/// <returns>明文</returns>
public static string TripleDESDecrypt(byte[] bytes, int lenght, string strDESKey, string strDESIV)
{
//把密钥转换成字节数组
byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(strDESKey);
//把向量转换成字节数组
byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(strDESIV);
byte[] bytesCipher = new byte[lenght];
Array.Copy(bytes, bytesCipher, lenght);
//声明1个新的3DES对象
TripleDESCryptoServiceProvider tripledesDecrypt = new TripleDESCryptoServiceProvider();
//开辟一块内存流,并存放密文字节数组
MemoryStream msDecrypt = new MemoryStream(bytesCipher);
//把内存流对象包装成解密流对象
CryptoStream csDecrypt = new CryptoStream(msDecrypt, tripledesDecrypt.CreateDecryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Read);
//把解密流对象包装成读出流对象
StreamReader srDecrypt = new StreamReader(csDecrypt);
//明文=读出流的读出内容
string strPlainText = srDecrypt.ReadLine();
//读出流关闭
srDecrypt.Close();
//解密流关闭
csDecrypt.Close();
//内存流关闭
msDecrypt.Close();
//返回明文
tripledesDecrypt.Clear();
return strPlainText;
}

//然后用这两个方法对字符串加密:
sMsg = "{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
\viewkind4\uc1\pard\lang2052\f0\fs18 1
}";
byte[] ByteData = Security.TripleDESEncrypt(sMsg, strKey,strIV, true);
//进行解密:
string s = TripleDESDecrypt(ByteData, ByteData.Length,strKey,strIV);
//解密后字符串为:{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
...全文
213 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lisa19910924 2011-03-07
  • 打赏
  • 举报
回复
谢谢2楼给的答案,我正好也需要
stg609 2008-12-30
  • 打赏
  • 举报
回复
不好意思,给错分了
gomoku 2008-12-30
  • 打赏
  • 举报
回复
几个建议,
一是不要对每行代码进行注释,善来注释用来解释你的意图。
二是对IDisposable要善于利用using模式 - 它更健壮而且可以省掉很多麻烦。


/// <summary>
/// 你的注释...
/// </summary>
public static string TripleDESDecrypt(byte[] bytes, int lenght, string DESKey, string DESIv)
{
byte[] bytesDESKey = ASCIIEncoding.ASCII.GetBytes(DESKey);
byte[] bytesDESIV = ASCIIEncoding.ASCII.GetBytes(DESIv);

// 为什么要拷贝...
byte[] bytesCipher = new byte[ Length ];
Array.Copy(bytes, bytesCipher, lenght);

using( TripleDESCryptoServiceProvider tripledes = new TripleDESCryptoServiceProvider())
using( MemoryStream ms = new MemoryStream(bytesCipher) )
using( CryptoStream cs = new CryptoStream(ms, tripledes.CreateDecryptor(bytesDESKey, bytesDESIV), CryptoStreamMode.Read) )
using (StreamReader sr = new StreamReader(cs))
{
return sr.ReadToEnd();
}
}
gomoku 2008-12-30
  • 打赏
  • 举报
回复
//明文=读出流的读出内容
string strPlainText = srDecrypt.ReadToEnd();
zhu4139365 2008-12-30
  • 打赏
  • 举报
回复
up
dayizhixiaotutu 2008-12-30
  • 打赏
  • 举报
回复
加密

string HOHO = "helloworldheheeh";
string oo = @"{\rtf1\ansi\ansicpg936\deff0\deflang1033\deflangfe2052{\fonttbl{\f0\fnil\fcharset134 \'cb\'ce\'cc\'e5;}}
\viewkind4\uc1\pard\lang2052\f0\fs18 1";
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(Encoding.UTF8.GetBytes(HOHO));
DES.Mode = CipherMode.ECB;

ICryptoTransform DESEncrypt = DES.CreateEncryptor();


byte[] Buffer = Encoding.UTF8.GetBytes(oo);
加密后的字串 string hehe=Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
MessageBox.Show(hehe);
Debug.WriteLine(hehe);

解密


string HOHO = "helloworldheheeh";
string hehe = 加密后的字串;
TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
MD5CryptoServiceProvider hashMD5 = new MD5CryptoServiceProvider();

DES.Key = hashMD5.ComputeHash(Encoding.UTF8.GetBytes(HOHO));
DES.Mode = CipherMode.ECB;

byte[] Buffer = Convert.FromBase64String(hehe);
ICryptoTransform DESDecrypt =DES.CreateDecryptor();
string lolo=Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer,0,Buffer.Length));
MessageBox.Show(lolo);
Debug.WriteLine(lolo);
stg609 2008-12-30
  • 打赏
  • 举报
回复
发现似乎是换行引起的,可我这个字符串数据是从其它地方读出来的,设置断点的时候显示成上述那样。该怎么解决换行的问题呢

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧