2

私は次のコードを使用していくつかのプレーンテキストを暗号化/復号化しています。

private static string EncryptionKey = "@#$%^&*()2343";    
private static byte[] Salt = Encoding.ASCII.GetBytes(EncryptionKey.Length.ToString()); 

public static string EncryptIt(string Input)    
{    
    RijndaelManaged Cipher = new RijndaelManaged();    
    byte[] TextByteArray = Encoding.Unicode.GetBytes(Input);    
    PasswordDeriveBytes Key = new PasswordDeriveBytes(EncryptionKey, Salt);    

    using (ICryptoTransform Transform = Cipher.CreateEncryptor(Key.GetBytes(32), Key.GetBytes(16)))    
    {        
        using (MemoryStream MS = new MemoryStream())    
        {    
            using (CryptoStream CS = new CryptoStream(MS, Transform, CryptoStreamMode.Write))    
            {    
                CS.Write(TextByteArray, 0, TextByteArray.Length);    
                CS.FlushFinalBlock();    
                return Convert.ToBase64String(MS.ToArray());    
            }    
        }    
    }    
}    

public static string DecryptIt(string Input)    
{    
    RijndaelManaged Cipher = new RijndaelManaged();    
    byte[] EncryptedByteArray = Convert.FromBase64String(Input);    
    PasswordDeriveBytes Key = new PasswordDeriveBytes(EncryptionKey, Salt);    

    using (ICryptoTransform Transform = Cipher.CreateDecryptor(Key.GetBytes(32), Key.GetBytes(16)))    
    {    
        using (MemoryStream MS = new MemoryStream(EncryptedByteArray))    
        {    
            using (CryptoStream cryptoStream = new CryptoStream(MS, Transform, CryptoStreamMode.Read))    
            {    
                byte[] TransformedText = new byte[EncryptedByteArray.Length];    
                int Count = cryptoStream.Read(TransformedText, 0, TransformedText.Length);    
                return Encoding.Unicode.GetString(TransformedText, 0, Count);    
            }    
        }    
    }    
}    

ほとんどの場合、このコードは正常に機能します。byte[] EncryptedByteArray = Convert.FromBase64String(Input)ただし、暗号化されたテキストを復号化しようとすると、メソッドで呼び出されたときに次の例外が発生する場合がありDecryptItます。

入力は、非Base 64文字、3つ以上のパディング文字、またはパディング文字の間に非空白文字が含まれているため、有効なBase-64文字列ではありません。

この例外の原因となる可能性のあるアイデア。私がもっと困惑しているのは、なぜこの例外がすべてのケースに投げられるのではなく、ほんのわずかなケースに投げられるのかということです。

編集: 例外をスローするDecryptItメソッドへのサンプル入力は以下のとおりです。上記のサンプルでEncryptionKey変数の値を変更したことに注意してください。

oaOQ6qWWDwWby3C04N7HJAiqQgILBifqdHq4OQ5KDDRA3F2ZlBITu31a8mJJQ8sKn4g3vODFEJbigtNZozv6ockAdsDChhHwaaLL4l8MJPKbV1EiUE3rL30y + xHz / S1a8mJJQ8sKn4g3vODFEJbigtNZozv6ockAdsDChhHwaaLL4l8MJPKbV1EiUE3rL30y +オンス/ eR9OzXn + 3Lepo0tRqH5BsfvEtJ / IcqRu3gJiIBTMAM0TmVxa2EZSj2mn6jZlgvlOEFCWzNKS3R9OzXn + In1br14venJmpApXyt930khz35UE5BtWn3Fq7jyer6mY2l60P / cI4z

4

1 に答える 1

1

サンプルは、最後に2つの余分な「=」を付けて完全に逆変換します。
だからどこかで彼らは輸送中に失われます。

暗号化されたテキストは、httpリンクで電子メールを介して送信されます。

それで、それはURLとHTMLエンコーディングの両方を含みますか?エラーの余地は十分にあります。

で終わる小さな文字列を使用してテストを実行します==

于 2012-10-01T18:36:54.647 に答える