0

特定の暗号を返す必要がある結果を返すために、次のテストを実行しようとしています。以下に示すように、キー、IV、およびプレーンテキスト文字列を提供します。

しかし、「指定された初期化ベクトル (IV) がこのアルゴリズムのブロック サイズと一致しません」というメッセージが表示されます。

私はしばらくこれに固執しており、良い単純な例を見つけることができず、物事を組み合わせてみました。

以下は私のC#コードです。とてもシンプルにしようとしました。

 string AesPlainText = "1654001d3e1e9bbd036a2f26d9a77b7f"; 
        string AesKey = "3ccb6039c354c9de72adc9ffe9f719c2c8257446c1eb4b86f2a5b981713cf998";
        string AesIV = "ce7d4f9679dfc3930bc79aab81e11723";

        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.KeySize = 256;
        aes.IV = HexToByteArray(AesIV);
        aes.Key = HexToByteArray(AesKey);
        aes.Mode = CipherMode.CBC;

        // Convert string to byte array
        byte[] src = Encoding.Unicode.GetBytes(AesPlainText);

        // encryption
        using (ICryptoTransform encrypt = aes.CreateEncryptor())
        {
            byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

            // Convert byte array to Base64 strings
            Console.WriteLine(Convert.ToBase64String(dest));
        }

回答ごとに更新:

ありがとう、素晴らしい観察。上記の例で Encoding.UTF8.GetBytes を HexToByteArray を使用するように変更したところ、動作するようになりました。

public static byte[] HexToByteArray(String hex)
{
    int NumberChars = hex.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
    return bytes;
}
4

1 に答える 1

3

プレーンテキスト、キー、および IV は 16 進数で指定されているように見えるため、UTF8 エンコードを実行する代わりに、16 進数をデコードして基になるバイトを取得する必要があります。

ここで 16 進数からバイト配列を取得できます。メソッドの名前には 16 進数が含まれている必要があることに注意してください。それを呼び出しStringToByteArrayたりatoi、そのようなばかげたことをしたりしないでください。

于 2014-11-22T21:33:06.143 に答える