AES CBC不生成正确的向量

时间:2013-05-21 03:57:34

标签: c# algorithm encryption aes

我在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;
    }

加密器只是我在ECB表单中的AES类。因此,所有这些方法都应该为CBC带来额外的XOR。任何人都可以告诉我,这似乎是错的吗?

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

1 个答案:

答案 0 :(得分: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);
    }