2

Rijndael とそれらの値を使用して文字列を復号化する必要があります。

キーサイズ - 192

ブロックサイズ - 128

キー - cmdAj45F37I5ud2134FDg2fF

以下のコードを使用するとエラーが発生します: string size illigle, can help me?

public static string DecryptRijndael(string value, string encryptionKey)
    {

            var key = Encoding.UTF8.GetBytes(encryptionKey); //must be 16 chars 
            var rijndael = new RijndaelManaged
            {
                BlockSize = 128,
                IV = key,
                KeySize = 192,
                Key = key
            };

            var buffer = Convert.FromBase64String(value);
            var transform = rijndael.CreateDecryptor();
            string decrypted;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
                {
                    cs.Write(buffer, 0, buffer.Length);
                    cs.FlushFinalBlock();
                    decrypted = Encoding.UTF8.GetString(ms.ToArray());
                    cs.Close();
                }
                ms.Close();
            }

            return decrypted;

    }
4

3 に答える 3

3

1 つの (大きな) 問題は、 UTF8.GetBytes()文字列から byte[] を取得するために使用することです。バイト数を制御するのは難しく、あまり安全ではありません。

Rfc2898DeriveBytes.GetBytes()代わりに使用してください。そして、希望の長さを指定できます。

もちろん、暗号化中にもそれを行う必要があります。
そして、IVに関するルークの発言に同意します

于 2010-07-22T07:43:16.227 に答える
2

キーが「16 文字でなければならない」というコードのコメントを確認できますか? あなたのキーは私には 24 文字のように見えます!

この場合、キーを IV として再利用していますが (いずれにしても推奨されるベスト プラクティスではありません)、IV のサイズは 128 ビット/16 バイトに設定されているブロック サイズと一致する必要があります。

そうは言っても、今説明した問題では、「指定された初期化ベクトル (IV) がこのアルゴリズムのブロック サイズと一致しません」というエラーが表示されるはずです。「string size illigle」ではありません。

于 2010-07-22T06:00:25.847 に答える
1

エラーは、入力が 64 ビットでエンコードされているためです。

IVとキーは同じではありません。IVは塩漬け用です。とにかく、あなたが得ているエラーは、入力が64ビットでエンコードされているためです。これを行うと、エラーが発生します。

var decodedEncryptionKey= Base64Decode(encryptionKey);

var key = Encoding.UTF8.GetBytes(decodedEncryptionKey);

完全なコードは次のとおりです。

 private string decyptInit(string toBeDecrypted, string key, string initVector)
    {
        var keyByte = Encoding.Default.GetBytes(key);
        var decodedIV = Base64Decode(initVector);
        var iv = Encoding.Default.GetBytes(decodedIV);

        var rijndael = new RijndaelManaged
        {
            BlockSize = 128,
            IV = iv,
            KeySize = 192,
            Key = keyByte
        };

        var buffer = Convert.FromBase64String(toBeDecrypted);
        var transform = rijndael.CreateDecryptor();
        string decrypted;
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
            {
                cs.Write(buffer, 0, buffer.Length);
                cs.FlushFinalBlock();
                decrypted = Encoding.UTF8.GetString(ms.ToArray());
                cs.Close();
            }
            ms.Close();
        }

        return decrypted;
    } public static string Base64Decode(string base64EncodedData)
    {
        var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
        return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
    }
于 2015-07-30T11:38:18.003 に答える