我正在通过网络接收数据包。但是其中一些数据包具有动态长度,因此第二个字节具有2字节长的WORD,其中包含长度。所以我先收到包号,然后根据长度收到所有包号。当没有加密时,这里的一切都没问题。如果我使用twofish或blowfish加密,它会一样吗?我的意思是,' A'被加密为' B'但是会' AA'被加密为' BB' ?我可以提取一个字节并从整个TF / BF加密的数据包中解密吗?
答案 0 :(得分:1)
我的意思是,“A”加密为“B”,但“AA”会加密为“BB”吗?
合理的加密算法永远不会这样做,否则加密信息可以通过频率分析轻松破解。 (顺便说一句,这被称为substitution cipher)。对于blowfish和twofish,这当然是正确的*。
即使你想在中间提取一个字节,你也必须先解密整个数据包。
*:除非你使用弱ECB mode,它只将两个加密算法减少为64位/ 128位块上的替换密码。
答案 1 :(得分:1)
通常答案是填充加密数据。然而,不要只是通过添加0来填充,直到达到块长度;填充可以提供太多的信息。
就提取字节而言,取决于所使用的密码模式 - 如何在块之间更改密码 - 您应该无法执行此操作。您需要一直解密您想要读取的字节字节。通常的做法是加密是“透明的” - 即你进行网络编程,然后将SSL打到它上面,以便SSL处理加密所有内容,处理变量长度等等,你只需要处理普通的旧数据
关于在你的设计中使用SSL是否是一个好主意,我不知道,但你可以使用这个概念。
答案 2 :(得分: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
他们都对我很有帮助。