AES CBC不能产生正确的矢量

本文关键字:CBC 不能 AES | 更新日期: 2023-09-27 18:14:25

我在CBC模式下有两种加密和解密方法。我已经验证了我的欧洲央行方法,它们运行正常。我的问题是,当我用测试向量在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取额外的异或值。谁能告诉我,如果这看起来是错的吗?

这是用于测试的单个数据块,而不是用于大量数据。

AES CBC不能产生正确的矢量

我修复了这个问题。这是一个问题,上面的加密有一个对我正在加密的对象数据的引用,而不仅仅是等于这些值。我为自己犯的一个愚蠢的错误而道歉。谢谢你的评论。下面是新的加密方法,以防有人关心:

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);
    }