4

このサイトからベクターを取得しましたhttp://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors#aes-ecb-128

javascript(sjcl)でも同じ結果になります

var key = [0x2b7e1516,0x28aed2a6,0xabf71588,0x09cf4f3c];
var test  = [0x6bc1bee2,0x2e409f96,0xe93d7e11,0x7393172a];
aes = new sjcl.cipher.aes(key);
r = aes.encrypt(test);
console.log(r);

しかし、C#では到達できません

    [TestMethod]
    public void EncryptIntsToInts()
    {
        Int32[] key = { unchecked((Int32)0x2b7e1516), 0x28aed2a6, unchecked((Int32)0xabf71588), 0x09cf4f3c };
        Int32[] test = { 0x6bc1bee2,0x2e409f96,unchecked((Int32)0xe93d7e11),0x7393172a };
        Int32[] answer = { 0x3ad77bb4, 0x0d7a3660, unchecked((Int32)0xa89ecaf3), 0x2466ef97 };

        var r = AES.EncryptIntsToInts(test, key.ToByteArray());

        Assert.IsTrue(r.SequenceEqual(answer));
    }


    static byte[] zeroIV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    public static Int32[] EncryptIntsToInts(Int32[] input, byte[] key)
    {
        // Check arguments.
        if (input == null || input.Length <= 0)
            throw new ArgumentNullException("input");
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException("key");

        // Declare the RijndaelManaged object
        // used to encrypt the data.
        RijndaelManaged aesAlg = null;
        byte[] bResult;
        try
        {
            aesAlg = new RijndaelManaged
                         {
                             Key = key,
                             Mode = CipherMode.ECB,
                             Padding = PaddingMode.None,
                             KeySize = 128,
                             BlockSize = 128,
                             IV = zeroIV
                         };
            ICryptoTransform encryptor = aesAlg.CreateEncryptor();

            byte[] bInput = new byte[input.Length * sizeof(int)];
            Buffer.BlockCopy(input, 0, bInput, 0, bInput.Length);

            bResult = encryptor.TransformFinalBlock(bInput, 0, input.Length);
        }
        finally
        {
            if (aesAlg != null)
                aesAlg.Clear();
        }

        int[] iResult = new int[bResult.Length / sizeof(int)];
        Buffer.BlockCopy(bResult, 0, iResult, 0, bResult.Length);
        return iResult;
    }

私のエラーは何ですか?

================================================== ======

編集を開始

バイトの正しい順序であるが、機能しない新しいコード

    [TestMethod]
    public void EncryptIntsToInts()
    {
        byte[] key =     "2b7e151628aed2a6abf7158809cf4f3c".HEX2Bytes();
        byte[] test =    "6bc1bee22e409f96e93d7e117393172a".HEX2Bytes();
        byte[] answer =  "3ad77bb40d7a3660a89ecaf32466ef97".HEX2Bytes();

        RijndaelManaged aesAlg = new RijndaelManaged
        {
            Key = key,
            Mode = CipherMode.ECB,
            Padding = PaddingMode.PKCS7,
            KeySize = 128,
            BlockSize = 128,
            IV = zeroIV
        };
        ICryptoTransform encryptor = aesAlg.CreateEncryptor();

        var r = encryptor.TransformFinalBlock(test, 0, test.Length);

        Assert.IsTrue(r.SequenceEqual(answer));
    }

    public static byte[] HEX2Bytes(this string hex)
    {
        if (hex.Length%2 != 0)
        {
            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture,
                                                      "The binary key cannot have an odd number of digits: {0}", hex));
        }

        byte[] HexAsBytes = new byte[hex.Length/2];
        for (int index = 0; index < HexAsBytes.Length; index++)
        {
            string byteValue = hex.Substring(index*2, 2);
            HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
        }

        return HexAsBytes;
    }

    static byte[] zeroIV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
4

2 に答える 2

5

正しいコード( try / usingを追加するだけです):

        [TestMethod]
        public void EncryptIntsToInts()
        {    
            byte[] key =     "2b7e151628aed2a6abf7158809cf4f3c".HEX2Bytes();
            byte[] test =    "6bc1bee22e409f96e93d7e117393172a".HEX2Bytes();
            byte[] answer =  "3ad77bb40d7a3660a89ecaf32466ef97".HEX2Bytes();

            var r = AES.Encrypt(test, key);

            Assert.IsTrue(answer.SequenceEqual(r));
        }

public static byte[] Encrypt(byte[] input, byte[] key)
{
    var aesAlg = new AesManaged
                     {
                         KeySize = 128,
                         Key = key,
                         BlockSize = 128,
                         Mode = CipherMode.ECB,
                         Padding = PaddingMode.Zeros,
                         IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
                     };

    ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
    return encryptor.TransformFinalBlock(input, 0, input.Length);
}
于 2013-01-25T14:38:07.140 に答える
1

キーを定義するには、32ビット整数を使用します。それらをバイトに変換するときは、ネイティブエンディアンを使用します。これは通常、リトルエンディアンです。つまり、あなたの鍵はであり、では16157e2b a6...ありません2b7e1516 28...

intそもそもキーを表すためにsを使用することはありません。ただし、本当に必要な場合は、ビッグエンディアン変換関数を記述してください。

また、ECBモードを強くお勧めします。CBCをHMACと一緒に(暗号化してからmac構造で)使用するか、サードパーティのlibを使用してGCMを実装することができます。

于 2013-01-25T10:01:42.160 に答える