Недопустимая длина массива Base-64 char во время декодирования/дешифрования
Q: Я сталкиваюсь со следующей большой проблемой:
от времени к другому я нахожу следующее исключение:
Недопустимая длина для массива Base-64 char
Я использую шифрование и дешифрование:
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
пожалуйста, мне нужна помощь, чтобы исправить эту проблему.
ИЗМЕНИТЬ
- Если есть какие-либо изменения или
улучшения этого класса, чтобы сделать это
работать лучше или безопаснее или избегать
любые возможные проблемы, подобные этому, i
будем благодарны.
- Если вместо этого есть чередующиеся классы, больше
безопасны и не делают эти
проблемы, буду благодарен.
- Я использую этот класс в небольшом
приложение, используемое для проверки почты.
EDIT:
Decoding the querystring values is done already when it parsed into the Request.
qaru.site/info/428650/...
Ответы
Ответ 1
Чтобы решить проблемы, которые вам нужны, чтобы скопировать кодировку и затем декодировать всю готовую строку encode-base64, зависит от того, где вы ее используете.
Если, например, вы используете его на url (или запросе), где, вероятно, это место, которое вы собираетесь использовать, тогда вам нужно Кодировать URL-адрес, прежде чем использовать его, расшифруйте URL-адрес, прежде чем вы его вернете. Причина в том, что вам нужно избегать смешивания тех же символов, что и URL-адрес в качестве символа кода, с зашифрованными символами.
В любом случае, вот код, который решает вашу проблему (и я использую по той же причине):
public static string encodeSTROnUrl(string thisEncode)
{
if (null == thisEncode)
return string.Empty;
return HttpUtility.UrlEncode(Encrypt(thisEncode));
}
public static string decodeSTROnUrl(string thisDecode)
{
return Decrypt(HttpUtility.UrlDecode(thisDecode));
}
пс
У меня такая же проблема, и попробуйте, как вы говорите, замените "+" и другие, но в конце это то, что заставляет это работать.
Не забудьте удалить text = text.Replace("", "+" ) и другие манипуляции с шифрованием из вашего кода, просто зашифруйте и расшифруйте.
Ответ 2
string imag = img;
imag = imag.Replace("\", "");
int c = imag.Length % 4;
if ((c) != 0)
imag = imag.PadRight((imag.Length + (4 - c)), "=");
[] converted = Convert.FromBase64String(imag);
using (System.IO.MemoryStream vstream = new System.IO.MemoryStream(converted)) {
return Image.FromStream(vstream);
}