首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

DES解密时提示“要解密的数据的长度无效。”,该如何解决

2012-05-27 
DES解密时提示“要解密的数据的长度无效。”用DES加解密,调试的过程中,在解密方法里面出现异常////// DEC 加

DES解密时提示“要解密的数据的长度无效。”
用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());
  }

请教各位,多谢!!!

[解决办法]
是不是由于数据库里的字段长度太小,导致字符被截取??
[解决办法]
我用的一直没有问题啊 参考
/// <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;
// }
//}

[解决办法]
密私的长度只能是8位的
[解决办法]
你定义一下,如果是位数的问题, 你把程序的位数修改一下。
[解决办法]
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;
}

[解决办法]
参考一下这个实例。http://www.bbs180.com/showtopic-1359.aspx
[解决办法]
http://topic.csdn.net/u/20081003/15/9035baa0-f742-4595-a289-f7d02843a975.html
[解决办法]

探讨
string pToDecrypt1 = pToDecrypt.Replace("+", "%2B");
byte[] inputByteArray = Convert.FromBase64String(pToDecrypt1);//异常:Base-64 字符数组的无效长度。

这要怎么改啊?

[解决办法]
可以采用3DES加密算法更好

可以参考FortuneBase中ezCrypt

参考地址www.cnblogs.com/mail-ricklee

热点排行
Bad Request.