0

在CBC模式下,我有两种加密和解密方法。我已经准备好验证我的 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。谁能告诉我这是否有问题?

这是针对单个数据块进行测试,而不是针对大量数据。

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 回答