我认为我对CBC和CFB模式有所了解,以及CTS(密文窃取)如何工作。 CTS听起来非常适合我的需求(加密所有长度至少为16个字节的可变长度字节数组),唯一的问题是,完全没有明显的原因,.NET在CipherMode枚举中提供CTS但不允许我使用它AES !!!
经过多次调查,我发现CTS很简单"在CBC上面实现,但是除了最后一个阻塞通常的CBC方式之外,还是更容易处理所有块,如果它恰好小于16个字节长,则切换到最后一个块的CFB? / p>
e.g。加密35个字节:
第一个密文块:IV与明文字节0..15进行异或并加密。这是直接的CBC。
第二密文块:第一个密文块与明文字节16..31进行异或,并加密。这仍然是直接的CBC。
第三密文块:第二密文块被加密,并且三个高位字节与明文字节32..34进行异或,并形成最终的密文块。这在概念上与CFB模式相同,仅在最后一个块上使用。
当然,CFB模式完全符合我的要求并且有效,但当FeedbackSize = 8时,速度惊人地慢。
具体来说,将加密的70MB只读数据库加载到内存中(用户经常在一天内触发并且必须等到它完成的操作),在CBC模式下需要1.75秒,在CFB模式下需要2秒钟,而FeedbackSize = 128(即再次使用16字节密文增量),但在CFB模式下使用FeedbackSize = 8需要35秒。这样做会带来1500%的性能损失,而且我的用户坐在那里的时间太长了! !
你可能会说"嘿,对于这么大的文件,额外的最多7个字节的填充是无关紧要的 - 只需使用填充模式",也许这就是我应该做的但是,我似乎非常接近于得到我想要的东西,这是密文大小=明文大小。当FeedbackSize = 8时,CFB模式已经完全符合我的要求 - 它只是非常慢。 CTS模式是完美的,但无论出于何种荒谬的原因,微软都无法投入资源来实现它?!?虽然我可以将我自己的基于CBC模式的CTS模式的实现混合在一起,但是除了最后一个块之外的所有CBC模式然后切换到最后几个字节的CFS模式在概念上更简单了吗?
或者我错过了一些明显的东西?
全部谢谢!