web-dev-qa-db-ja.com

デコード/復号化中のBase-64文字配列の無効な長さ

Q:次の大きな問題に直面しています:

時々私は次の例外を見つけます:

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.
_

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

13

問題を解決するには、使用する場所に応じて、すべての準備ができている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));
}

ps私も同じ問題を抱えており、あなたが言うように「+」などを置き換えてみましたが、最後にこれが機能する理由です。

text = text.Replace( ""、 "+")とその他の暗号化操作をコードから削除することを忘れないでください。暗号化と復号化だけです。

19
Aristos