0

CBC モードでの暗号化と復号化には 2 つの方法があります。ECB メソッドをすべて検証する準備ができており、正しく機能しています。私の問題は、テスト ベクトルを使用して CBC で暗号化をテストすると、それらに合格することです。そして、同じベクトルで CBC 復号化をテストして、逆方向に進むことができることを確認すると、それらのテストにも合格しました。しかし、暗号化から復号化に移ると、同じベクトルは返されません。これは本当に意味がありません。

public byte[,] Encrypt(byte[,] dataToEncrypt, byte[] givenKey, byte[] initializationVector)
    {
        //XOR the data with the IV
        for (int row = 0; row < 4; row++)
        {
            dataToEncrypt[row,0] ^= initializationVector[4*row];
            dataToEncrypt[row, 1] ^= initializationVector[(4 * row) + 1];
            dataToEncrypt[row, 2] ^= initializationVector[(4 * row) + 2];
            dataToEncrypt[row, 3] ^= initializationVector[(4 * row) + 3];
        }

        ECB encryptor = new ECB();
        return encryptor.Encrypt(dataToEncrypt, givenKey);
    }

    public byte[,] Decrypt(byte[,] dataToDecrypt, byte[] givenKey, byte[] initializationVector)
    {
        ECB encryptor = new ECB();

        byte[,] plainText = encryptor.Decrypt(dataToDecrypt, givenKey);

        for (int row = 0; row < 4; row++)
        {
            plainText[row, 0] ^= initializationVector[4 * row];
            plainText[row, 1] ^= initializationVector[(4 * row) + 1];
            plainText[row, 2] ^= initializationVector[(4 * row) + 2];
            plainText[row, 3] ^= initializationVector[(4 * row) + 3];
        }

        return plainText;
    }

Encryptor は、ECB 形式の AES の私のクラスです。したがって、これらのメソッドはすべて、CBC の追加の XOR を取り込むことになっています。これが何か間違っているように思われる場合は、誰か教えてもらえますか?

これは、大量のデータではなく、テスト用の 1 つのデータ ブロック用です。

4

1 に答える 1

0

問題を修正しました。そこまでの暗号化には、単に値を等しくするのではなく、暗号化していたオブジェクト データへの参照があるという事実に問題がありました。私が犯していた愚かなエラーについて質問を投稿して申し訳ありません。コメントありがとうございます。そして、誰かが気になる場合に備えて、ここに新しい暗号化方法があります:

public byte[,] Encrypt(byte[,] dataToEncrypt, byte[] givenKey, byte[] initializationVector)
    {
        //Setup
        ECB encryptor = new ECB();
        byte[,] cypherText = new byte[4,4];

        //XOR the data with the IV
        for (int row = 0; row < 4; row++)
        {
            cypherText[row, 0] = (byte)(dataToEncrypt[row, 0] ^ initializationVector[4 * row]);
            cypherText[row, 1] = (byte)(dataToEncrypt[row, 1] ^ initializationVector[(4 * row) + 1]);
            cypherText[row, 2] = (byte)(dataToEncrypt[row, 2] ^ initializationVector[(4 * row) + 2]);
            cypherText[row, 3] = (byte)(dataToEncrypt[row, 3] ^ initializationVector[(4 * row) + 3]);
        }


        return encryptor.Encrypt(cypherText, givenKey);
    }
于 2013-05-22T05:58:17.153 に答える