我正在使用openssl库。在所有文档和网页中,代码块大小为128位(对于所有AES模式来说都是常见的)。但是我在openssl中观察到的是,对于CTR、CFB和OFB模式,块大小是1,只有CBC模式是128位。有人能澄清这一点吗?
谢谢。
发布于 2015-04-12 04:24:14
是的,这可以用这些模式的工作原理来解释。
注意:模式的输入必须是块大小的倍数。(这就是为什么对于128位密码来说,这个值可以低于128位)。
现在观察CBC是如何工作的:
NewBlock(LastCiphertextBlock,PlaintextBlock):=Encrypt(LastCiphertextBlock XOR PlaintextBlock)
如您所见,这只能加密密码的实际块大小的倍数。
现在让我们看看OFB是如何工作的:
NewBlock(State,Plaintext):=State=Encrypt(State);return State XOR Plaintext
所以你基本上是在一遍又一遍地加密一些状态,然后用这个状态作为垫子来加密明文。因此,您正在将块密码转换为流密码。由于应用程序现在可以存储状态,并且只在使用了每一个旧位时生成新的状态,因此可以加密任意数据大小。
现在让我们调查CTR:
NewBlock(Counter,Plaintext):=Counter++;return Encrypt(Counter) XOR Plaintext
正如您所看到的,这是与OFB完全相同的逻辑,您使用某种状态(计数器)生成衬垫。因为你可以存储这个垫直到下一个垫块是需要的,你可以加密数据逐位。
最后,让我们深入研究(n位)循环流化床:
NewBlock(LastCipherTextBlock,Plaintext):=Plaintext XOR Encrypt(LastCipherTextBlock)
因此,您再次将其转换为流密码,但这一次您使用了前面的密文块(已知),对其进行加密,并对明文进行XOR。由于您可以再次存储面板,并且不对纯文本执行任何块大小操作,因此可以使用任意明文大小。
https://security.stackexchange.com/questions/85814
复制