【问题标题】:AES CBC Not Producing Correct VectorsAES CBC 未生成正确的向量
【发布时间】:2013-05-22 13:58:17
【问题描述】:

我在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。谁能告诉我这是否有问题?

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

【问题讨论】:

  • 请用您使用的编程语言标记它。
  • 我似乎记得某个地方有人告诉我不要推出自己的加密货币。
  • 很抱歉,感谢您在其中添加语言。还有,我想你不记得他们为什么告诉你不要那样做吗?从我所看到的过程是如何工作的,重新写一遍没有任何意义,因为它是相同的过程......但我以前错了。
  • 请注意,您实际上并未在此处编写 CBC。您只在第一个区块中引入了 IV,其他区块未触及。您会注意到,加密和解密性能完美,但您仍然做错了事。这只是您不应该相信自己的例行程序的原因之一。至少要使用其他库和 NIST 测试向量来测试它们。但是你最好使用一个库并学习如何正确地做到这一点,这已经够难了。
  • 我更困惑的是为什么论坛上每个人的 cmets 都在帮助人们,“甚至不要尝试”。我知道它没有考虑更多的块。如果您查看我帖子的最后一行,它会说那是针对单个数据块-用于测试-。在处理大量数据之前,我想确保正确引入 IV。从那以后,我已经转移到更多数据上,并且我仍在进行大量测试以确保每个部分都正常运行。我会看看 NIST 测试向量,我以前没听说过,谢谢。

标签: c# algorithm encryption aes


【解决方案1】:

我解决了这个问题。这是一个问题,因为那里的加密引用了我正在加密的对象数据,而不是仅仅等于值。我很抱歉发布这个问题,因为我犯了一个愚蠢的错误。不过感谢cmets。这是新的加密方法,以防万一:

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

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2021-05-11
    • 2013-08-11
    • 2020-07-18
    • 2021-01-03
    • 2017-11-21
    相关资源
    最近更新 更多