高分救急,要解密的数据的长度无效!

feihu_02 2007-10-15 04:12:35
好久没提问了,今天在做加解密时,解密时出现错误:要解密的数据的长度无效,找了一天,都没有找到原因。不知为何?以下是加解密的代码
//加密
public string DesEncrypt(string strText, string strEncrKey)
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());


}
catch (System.Exception error)
{
return "error:" + error.Message + "\r";
}
}
//解密
public string DesDecrypt(string strText, string sDecrKey)
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
byte[] inputByteArray = new Byte[strText.Length];
try
{
byKey = System.Text.Encoding.Default.GetBytes(sDecrKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
//System.Text.Encoding encoding = new System.Text.UTF8Encoding();
//return encoding.GetString(ms.ToArray());
return Encoding.UTF8.GetString(ms.ToArray());
}
catch (System.Exception error)
{
return "error:" + error.Message + "\r";
}

}
...全文
1484 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
feihu_02 2007-11-21
  • 打赏
  • 举报
回复
谢谢大家.原来犯了一个低级错误,是由于数据库里的字段长度太小,导致字符被截取所致.
JGood 2007-10-15
  • 打赏
  • 举报
回复
有这么几个错误:
一:
加密时:byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey);
解密时:byKey = System.Text.Encoding.Default.GetBytes(sDecrKey);
两者的编码方式不一样

二:
在解密时:byte[] inputByteArray = new Byte[strText.Length];
在加密时是使用:Convert.ToBase64String把byte[]转换成string的,那么在解密的时候当然也应该是将string转换成byte[]


修改后的代码(在本机上通过):

public string DesEncrypt(string strText, string strEncrKey)
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
try
{
byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
return Convert.ToBase64String(ms.ToArray());


}
catch (System.Exception error)
{
return "error:" + error.Message + "\r";
}
}

//解密
public string DesDecrypt(string strText, string sDecrKey)
{
byte[] byKey = null;
byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
//byte[] inputByteArray = new Byte[strText.Length];
byte[] inputByteArray = Convert.FromBase64String(strText);
try
{
//byKey = System.Text.Encoding.Default.GetBytes(sDecrKey);
byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
inputByteArray = Convert.FromBase64String(strText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
//System.Text.Encoding encoding = new System.Text.UTF8Encoding();
//return encoding.GetString(ms.ToArray());
return Encoding.UTF8.GetString(ms.ToArray());
}
catch (System.Exception error)
{
return "error:" + error.Message + "\r";
}

}
sanlng 2007-10-15
  • 打赏
  • 举报
回复
可能原因为:在原字符串加密后产生的新字符串其长度是固定的,如果改变了这个加密后的字符串的长度,可能就会出现这个问题。
feihu_02 2007-10-15
  • 打赏
  • 举报
回复
注:如果只是对文本进行操作,是不会出现错误的,但加密到数据库到从数据库读出来解密时,就出现上述的错误。

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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