Неверная длина для массива Base-64 во время декодирования / дешифрования - PullRequest
12 голосов
/ 29 декабря 2010

В: Я сталкиваюсь со следующей большой проблемой:

время от времени я нахожу следующее исключение:

Недопустимая длина для массива символов 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 пожалуйста, мне нужна помощь, чтобы решить эту проблему.

EDIT

  • Если есть какие-либо модификации или улучшения этого класса, чтобы сделать его работать лучше или безопаснее или избегать любые возможные проблемы, как это, я буду благодарен.
  • Если вместо этого есть чередующиеся классы, более безопасно и не делает это проблемы, буду благодарен.
  • Я использую этот класс в небольшом приложение для проверки почты.

EDIT:

Decoding the querystring values is done already when it's parsed into the Request.

https://stackoverflow.com/a/10879400/418343

Ответы [ 2 ]

18 голосов
/ 29 декабря 2010

Чтобы решить проблемы, вам нужно сначала выполнить Encode, а затем декодировать полностью готовую строку 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 ("", "+") и другие манипуляции с шифрованием из вашего кода, просто зашифруйте и расшифруйте.

0 голосов
/ 15 мая 2013
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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...