0

我正在通过网络接收数据包。但是其中一些数据包具有动态长度,因此第二个字节有一个包含长度的 2 个字节长的 WORD。所以我先收到包号,然后按照长度全部接收。当没有加密时,这里一切都很好。如果我使用twofish或blowfish加密会一样吗?我的意思是,“A”被加密为“B”,但“AA”会被加密为“BB”吗?我可以从整个用 TF/BF 加密的数据包中提取一个字节并解密它吗?

4

3 回答 3

1

我的意思是,“A”被加密为“B”,但“AA”会被加密为“BB”吗?

一个明智的加密算法永远不会这样做,否则加密信息很容易被频率分析破解。(顺便说一下,这被称为替换密码)。这对于河豚双鱼来说当然是正确的* 。

即使要在中间提取一个字节,也必须先解密整个数据包。


*:除非您使用弱ECB 模式,这只会将两种加密算法减少为 64 位/128 位块上的替换密码)。

于 2012-08-12T19:17:47.367 回答
1

通常答案是填充加密数据。但是,在达到块长度之前,不要只是通过添加 0 来填充;填充可能会泄露太多信息。

至于提取一个字节,取决于所使用的密码模式 - 密码如何在块之间更改 - 你不应该能够做到这一点。您需要一直解密要读取的字节字节。加密是“透明”的一般做法 - 即您进行网络编程,然后在其上添加 SSL,以便 SSL 处理加密所有内容、处理可变长度等,而您只需处理普通的旧数据.

至于在你的设计中使用 SSL 是否是一个好主意,我不知道,但你可以使用这个概念。

于 2012-08-12T19:27:00.737 回答
1

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

他们俩都对我有帮助。

于 2012-08-29T21:59:05.453 回答