DES加密解密报错【不正确的数据】急急急求大神帮助

碎碎0_o 2017-09-19 05:32:24
加密解密,有些能加密解密出来,有些报错说【不正确的数据。】,还有些加密解密出来是错的
例:textBox1中文本为【BLue@210896】时,就是不正确的数据,文本改成【BLue@210896 】(后面随便加空格什么的),就正常了。
private void button1_Click(object sender, EventArgs e)
{
this.textBox2.Text = EncryptorStr1(this.textBox1.Text, enckey, encIV);
this.textBox3.Text = DecryptorStr1(this.textBox2.Text, enckey, encIV);

}
Byte[] enckey = { 0x01, 0x11, 0x11, 0x11, 0x01, 0x01, 0x01, 0x01 };
Byte[] encIV = { 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
#region 加密
//加密后返回十六进制字符串
private string EncryptorStr1(string encyptstr, byte[] key, byte[] IV)
{
byte[] enbyte = Encoding.Unicode.GetBytes(encyptstr);//ConvertStringToByteArray(encyptstr);
MemoryStream fs = new MemoryStream(enbyte, 0, enbyte.Length);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform desencrypt = des.CreateEncryptor(key, IV);
CryptoStream cryptostream = new CryptoStream(fs, desencrypt, CryptoStreamMode.Read);
string str = (new StreamReader(cryptostream, new UnicodeEncoding())).ReadToEnd();
fs.Close();
cryptostream.Close();
//转换为十六进制
byte[] aa = Encoding.Unicode.GetBytes(str);
str = "";
for (int i = 0; i < aa.Length; i++)
{
if (aa[i].ToString("X").Length == 1)
str += "0";
str += aa[i].ToString("X");
}
return str;

}
#endregion
#region 解密
public string DecryptorStr1(string decryptstr, byte[] key, byte[] IV)
{
try
{
//先将十六进制转换为DES加密的字符串的原形
string str;
int len = decryptstr.Length / 2;
byte[] aa = new Byte[len];
int j; int k = 0;
for (int i = 0; i < decryptstr.Length; i++)
{
j = Uri.FromHex(Uri.HexUnescape(decryptstr, ref k));
i++;
j = j * 16 + Uri.FromHex(Uri.HexUnescape(decryptstr, ref k));
aa[i / 2] = Convert.ToByte(j);
}
decryptstr = Encoding.Unicode.GetString(aa, 0, aa.Length);

byte[] enbyte = ConvertStringToByteArray(decryptstr);
MemoryStream fsread = new MemoryStream(enbyte, 0, enbyte.Length);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform desdecrypt = des.CreateDecryptor(key, IV);
CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
str = (new StreamReader(cryptostreamDecr, new UnicodeEncoding())).ReadToEnd();
fsread.Close();
cryptostreamDecr.Close();
return str;
}
catch (Exception ex)
{
return ex.Message;
}
}
#endregion
...全文
712 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎碎0_o 2017-11-22
  • 打赏
  • 举报
回复
引用 9 楼 weixin_41140325 的回复:
这样试试 #region 加密解密 #region 加密 //加密后返回十六进制字符串 private string EncryptorStr(string encyptstr, byte[] key, byte[] IV) { #region DES加密 byte[] enbyte = ConvertStringToByteArray(encyptstr); MemoryStream fs = new MemoryStream(); byte[] bytearrayinput = (new UnicodeEncoding()).GetBytes(encyptstr); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); ICryptoTransform desencrypt = des.CreateEncryptor(key, IV); CryptoStream cryptostream = new CryptoStream(fs, desencrypt, CryptoStreamMode.Write); cryptostream.Write(enbyte, 0, enbyte.Length); cryptostream.FlushFinalBlock(); string str = Convert.ToBase64String(fs.ToArray()); fs.Close(); cryptostream.Close(); #endregion #region 转为十六进制字符串 //转换为十六进制 byte[] aa = Encoding.Unicode.GetBytes(str); str = ""; for (int i = 0; i < aa.Length; i++) { if (aa[i].ToString("X").Length == 1) str += "0"; str += aa[i].ToString("X"); } #endregion return str; } #endregion #region 解密 public string DecryptorStr(string decryptstr, byte[] key, byte[] IV) { try { #region 十六进制字符串转回字符串原形 //先将十六进制转换为DES加密的字符串的原形 string str; int len = decryptstr.Length / 2; byte[] aa = new Byte[len]; int j; int k = 0; for (int i = 0; i < decryptstr.Length; i++) { j = Uri.FromHex(Uri.HexUnescape(decryptstr, ref k)); i++; j = j * 16 + Uri.FromHex(Uri.HexUnescape(decryptstr, ref k)); aa[i / 2] = Convert.ToByte(j); } decryptstr = Encoding.Unicode.GetString(aa, 0, aa.Length); #endregion #region DES解密 byte[] enbyte = Convert.FromBase64String(decryptstr); MemoryStream fsread = new MemoryStream(); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); ICryptoTransform desdecrypt = des.CreateDecryptor(key, IV); CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Write); cryptostreamDecr.Write(enbyte, 0, enbyte.Length); cryptostreamDecr.FlushFinalBlock(); str = Encoding.Unicode.GetString(fsread.ToArray()); fsread.Close(); cryptostreamDecr.Close(); #endregion return str; } catch (Exception ex) { return ex.Message; } } #endregion #endregion
非常感谢
weixin_41140325 2017-11-22
  • 打赏
  • 举报
回复
这样试试 #region 加密解密 #region 加密 //加密后返回十六进制字符串 private string EncryptorStr(string encyptstr, byte[] key, byte[] IV) { #region DES加密 byte[] enbyte = ConvertStringToByteArray(encyptstr); MemoryStream fs = new MemoryStream(); byte[] bytearrayinput = (new UnicodeEncoding()).GetBytes(encyptstr); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); ICryptoTransform desencrypt = des.CreateEncryptor(key, IV); CryptoStream cryptostream = new CryptoStream(fs, desencrypt, CryptoStreamMode.Write); cryptostream.Write(enbyte, 0, enbyte.Length); cryptostream.FlushFinalBlock(); string str = Convert.ToBase64String(fs.ToArray()); fs.Close(); cryptostream.Close(); #endregion #region 转为十六进制字符串 //转换为十六进制 byte[] aa = Encoding.Unicode.GetBytes(str); str = ""; for (int i = 0; i < aa.Length; i++) { if (aa[i].ToString("X").Length == 1) str += "0"; str += aa[i].ToString("X"); } #endregion return str; } #endregion #region 解密 public string DecryptorStr(string decryptstr, byte[] key, byte[] IV) { try { #region 十六进制字符串转回字符串原形 //先将十六进制转换为DES加密的字符串的原形 string str; int len = decryptstr.Length / 2; byte[] aa = new Byte[len]; int j; int k = 0; for (int i = 0; i < decryptstr.Length; i++) { j = Uri.FromHex(Uri.HexUnescape(decryptstr, ref k)); i++; j = j * 16 + Uri.FromHex(Uri.HexUnescape(decryptstr, ref k)); aa[i / 2] = Convert.ToByte(j); } decryptstr = Encoding.Unicode.GetString(aa, 0, aa.Length); #endregion #region DES解密 byte[] enbyte = Convert.FromBase64String(decryptstr); MemoryStream fsread = new MemoryStream(); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); ICryptoTransform desdecrypt = des.CreateDecryptor(key, IV); CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Write); cryptostreamDecr.Write(enbyte, 0, enbyte.Length); cryptostreamDecr.FlushFinalBlock(); str = Encoding.Unicode.GetString(fsread.ToArray()); fsread.Close(); cryptostreamDecr.Close(); #endregion return str; } catch (Exception ex) { return ex.Message; } } #endregion #endregion
碎碎0_o 2017-11-22
  • 打赏
  • 举报
回复
没人答了,结贴散分
碎碎0_o 2017-09-25
  • 打赏
  • 举报
回复
有人吗有大神在吗
碎碎0_o 2017-09-20
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
ConvertStringToByteArray 呢?
啊啊啊,我都是复制一份出来改坏了又复制一份,然后有点乱,漏掉了这个,不好意思不好意思 private static Byte[] ConvertStringToByteArray(String s) { return (new UnicodeEncoding()).GetBytes(s); }
xuzuning 2017-09-20
  • 打赏
  • 举报
回复
ConvertStringToByteArray 呢?
碎碎0_o 2017-09-19
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
代码不全,无法测试!
form里就三个TextBox和一个Button,Button点击事件绑定到button1_Click,代码就没了呀
xuzuning 2017-09-19
  • 打赏
  • 举报
回复
代码不全,无法测试!
碎碎0_o 2017-09-19
  • 打赏
  • 举报
回复
引用 1 楼 qq_17486399 的回复:
代码那么长,懒得看,你看一下是不是你数据没有取全
大神,解密在byte[] enbyte = ConvertStringToByteArray(decryptstr);这里的时候,这个enbyte还是对的呀,而且加密的内容换一下又可以
大鱼> 2017-09-19
  • 打赏
  • 举报
回复
代码那么长,懒得看,你看一下是不是你数据没有取全

110,555

社区成员

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

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

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