我正在通过网络接收数据包。但是其中一些数据包具有动态长度,因此第二个字节有一个包含长度的 2 个字节长的 WORD。所以我先收到包号,然后按照长度全部接收。当没有加密时,这里一切都很好。如果我使用twofish或blowfish加密会一样吗?我的意思是,“A”被加密为“B”,但“AA”会被加密为“BB”吗?我可以从整个用 TF/BF 加密的数据包中提取一个字节并解密它吗?
3 回答
通常答案是填充加密数据。但是,在达到块长度之前,不要只是通过添加 0 来填充;填充可能会泄露太多信息。
至于提取一个字节,取决于所使用的密码模式 - 密码如何在块之间更改 - 你不应该能够做到这一点。您需要一直解密要读取的字节字节。加密是“透明”的一般做法 - 即您进行网络编程,然后在其上添加 SSL,以便 SSL 处理加密所有内容、处理可变长度等,而您只需处理普通的旧数据.
至于在你的设计中使用 SSL 是否是一个好主意,我不知道,但你可以使用这个概念。
Twofish 在其基础级别编码 16 字节块。所以你可以拥有的最小的 Twofish 加密数据是 16 字节长。如果您的数据包含长度,那么您可以对其进行解密,然后丢弃最后一个块中的任何额外字节。
因此,要加密“A”,您需要将它(不知何故 - 有多种方法 - 全零显然不是最好的方法)填充到 16 个字节,然后加密一个字节的数据和 15 个不需要的字节。你得到一个 16 字节的加密块。在解密时,您可以丢弃额外的字节。
我建议花半小时阅读这些维基百科文章:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
http://en.wikipedia.org/wiki/Padding_%28cryptography%29
他们俩都对我有帮助。