【发布时间】:2010-12-29 15:13:45
【问题描述】:
问:我面临以下大问题:
我不时发现以下异常:
Base-64 字符数组的长度无效
我用的是加解密:
public static string Encrypt(string text)
{
try
{
key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
Byte[] byteArray = Encoding.UTF8.GetBytes(text);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
cryptoStream.Write(byteArray, 0, byteArray.Length);
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(memoryStream.ToArray());
}
catch (Exception ex)
{
string message = ex.Message;
}
return string.Empty;
}
public static string Decrypt(string text)
{
try
{
key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8));
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
text = text.Replace(" ", "+")
Byte[] byteArray = Convert.FromBase64String(text);
MemoryStream memoryStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(memoryStream,
des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
cryptoStream.Write(byteArray, 0, byteArray.Length);
cryptoStream.FlushFinalBlock();
return Encoding.UTF8.GetString(memoryStream.ToArray());
}
catch (Exception ex)
{
string message = ex.Message;
}
我阅读了很多关于这个问题的文章 一些谈论解决方案的帖子是:
text = text.Replace(" ", "+")
这根本不能解决我的问题
我的字符串是:3DZF/NZpp0yuQ=3D
请问我需要帮助来解决这个问题。
编辑
- 如果有任何修改或 对此类的增强以使其成为 工作得更好或更安全或避免 像这样的任何可能的问题,我 将不胜感激。
- 如果有交替类而不是这个,更多 安全且不会使这些 问题,我将不胜感激。
- 我用这个类在一个小 用于验证邮件的应用程序。
编辑:
Decoding the querystring values is done already when it's parsed into the Request.
【问题讨论】:
-
一个常见的问题是错误地从字符串末尾剥离填充(尾随等号)。在您的情况下,“=3d”可能应该只是“=”或者“==”
-
没有回答你的问题,但这是一种非常糟糕的加密方式 - 听起来你和 gawker 做同样的事情。您仅使用前 8 个字符作为密钥,并使用 DES(过时的加密标准)请参阅 codinghorror.com/blog/2010/12/…
-
附注:
Encoding.UTF8.GetBytes是从密码中获取密钥的一种非常糟糕且不安全的方式。 -
看起来@EricLaw 是正确的,因为它应该是
==。这个 base64 字符串是从查询字符串中收集的吗?%3D是=的 URL 编码形式,所以看起来你的问题在于 URL 编码 -
看看stackoverflow.com/questions/2925729/…。对于 Base64,该值应该是 4 的倍数
标签: c# .net asp.net encryption