DES解密时提示“要解密的数据的长度无效。”

王者coco 2010-01-06 05:54:25
用DES加解密,调试的过程中,在解密方法里面出现异常

///
/// DEC 加密过程
///
public string Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中

byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
//byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);

des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
MemoryStream ms = new MemoryStream();   //使得输入密码必须输入英文文本
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);

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();
}









///
/// DEC 解密过程
///
public string Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();

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 = ASCIIEncoding.ASCII.GetBytes(sKey);
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(); //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象

return System.Text.Encoding.Default.GetString(ms.ToArray());
}


请教各位,多谢!!!
...全文
1528 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
asd876566542 2012-05-23
  • 打赏
  • 举报
回复
- -楼主这个问题解决出来了没?我也跟你一样的问题
mail_ricklee 2010-01-07
  • 打赏
  • 举报
回复
可以采用3DES加密算法更好

可以参考FortuneBase中ezCrypt

参考地址www.cnblogs.com/mail-ricklee
Lovely_baby 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xuanwangasp 的回复:]
string pToDecrypt1 = pToDecrypt.Replace("+", "%2B");
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt1);//异常:Base-64 字符数组的无效长度。

这要怎么改啊?
[/Quote]
当Convert.FromBase64String方法的参数s的长度小于 4 或不是 4 的偶数倍时,将会抛出这个异常~
王者coco 2010-01-07
  • 打赏
  • 举报
回复
up
王者coco 2010-01-07
  • 打赏
  • 举报
回复
string pToDecrypt1 = pToDecrypt.Replace("+", "%2B");
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt1); //异常:Base-64 字符数组的无效长度。

这要怎么改啊?
王者coco 2010-01-07
  • 打赏
  • 举报
回复
up
王者coco 2010-01-07
  • 打赏
  • 举报
回复
现在我点第一个链接,参数是被加密了,但是点第二个链接,就报“要解密的数据的长度无效“,调试后发现原来点第二个链接时传的参数id是未加密的,还是原来的值,所以就报错了。
第二个链接传的参数id也加密了,但是为什么传过来的却是未加密的,搞不清楚哪出问题了。
王者coco 2010-01-06
  • 打赏
  • 举报
回复
我之前看过了,我的方法跟他的不一样,而且长度也没有减1
王者coco 2010-01-06
  • 打赏
  • 举报
回复
无法下载或查看附件
春天的气息 2010-01-06
  • 打赏
  • 举报
回复
参考一下这个实例。http://www.bbs180.com/showtopic-1359.aspx
wuyq11 2010-01-06
  • 打赏
  • 举报
回复
public static string DecryptString(string decryptStr)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] byteNotDecrypt = Convert.FromBase64String(decryptStr);
MemoryStream decryptMs = new MemoryStream(byteNotDecrypt);
CryptoStream decryptCs = new CryptoStream(decryptMs, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
byte[] b= new byte[1024];
int i = decryptCs.Read(b, 0, 1024);
decryptCs.Close();
string str= Encoding.UTF8.GetString(b, 0, i);
return str;
}
王者coco 2010-01-06
  • 打赏
  • 举报
回复
查了资料
当Convert.FromBase64String方法的参数s的长度小于4或不是4的偶数倍时,将会抛出FormatException。
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt); 参数pToDecrypt的长度确实小于4或不是4的偶数倍!
王者coco 2010-01-06
  • 打赏
  • 举报
回复
什么位数?
段传涛 2010-01-06
  • 打赏
  • 举报
回复
你定义一下,如果是位数的问题, 你把程序的位数修改一下。
ttg520 2010-01-06
  • 打赏
  • 举报
回复
密私的长度只能是8位的
王者coco 2010-01-06
  • 打赏
  • 举报
回复
用了楼上的方法,在解密方法里面
这一句byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
报错:Base-64 字符数组的无效长度。
段传涛 2010-01-06
  • 打赏
  • 举报
回复
我用的一直没有问题啊 参考
/// <summary>
/// 进行DES加密。
/// </summary>
/// <param name="pToEncrypt">要加密的字符串。</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>以Base64格式返回的加密字符串。</returns>
public string Encrypt(string pToEncrypt, string sKey)
{
using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
{
byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
cs.Close();
}
string str = Convert.ToBase64String(ms.ToArray());
ms.Close();
return str;
}
}

/**/
/// <summary>
/// 进行DES解密。
/// </summary>
/// <param name="pToDecrypt">要解密的以Base64</param>
/// <param name="sKey">密钥,且必须为8位。</param>
/// <returns>已解密的字符串。</returns>
//public string Decrypt(string pToDecrypt, string sKey)
//{
// byte[] inputByteArray = Convert.FromBase64String(pToDecrypt);
// using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
// {
// des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
// des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
// System.IO.MemoryStream ms = new System.IO.MemoryStream();
// using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
// {
// cs.Write(inputByteArray, 0, inputByteArray.Length);
// cs.FlushFinalBlock();
// cs.Close();
// }
// string str = Encoding.UTF8.GetString(ms.ToArray());
// ms.Close();
// return str;
// }
//}
王者coco 2010-01-06
  • 打赏
  • 举报
回复
加解密的是ID。你是说加密后字符变长,然后在解密的时候字符被截取吗?
Lovely_baby 2010-01-06
  • 打赏
  • 举报
回复
是不是由于数据库里的字段长度太小,导致字符被截取??

62,054

社区成员

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

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

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

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