【发布时间】: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