我正在通过网络接收数据包。但其中一些数据包具有动态长度,因此第二个字节具有包含长度的2字节长的字。所以我先接收包的编号,然后根据长度接收所有的包。当没有加密的时候,这里一切都好。如果我使用twofish或blowfish加密会是一样的吗?我的意思是,'A‘被加密为'B’,但'AA‘会被加密为'BB’吗?能否从使用TF/BF加密的数据包中提取一个字节并对其进行整体解密?
发布于 2012-08-13 03:17:47
我的意思是,'A‘被加密为'B’,但是'AA‘会被加密为'BB’吗?
明智的加密算法永远不会做到这一点,否则加密的信息很容易被频率分析破解。(顺便说一句,这被称为substitution cipher )。对于blowfish和twofish来说,这当然是真的。
即使你想提取中间的一个字节,你也必须首先解密整个包。
*:除非您使用弱ECB mode,它只将两种加密算法简化为64位/128位块的替换密码)。
发布于 2012-08-13 03:27:01
通常,答案是填充加密数据。然而,在达到块长度之前,不要仅仅通过添加0来填充;填充可能会泄露一些太多的信息。
至于提取一个字节,取决于所使用的密码模式-密码如何在块之间更改-您应该无法做到这一点。你需要解密所有你想要读取的字节。通常的做法是加密是“透明的”-即你做你的网络编程,然后在上面贴上SSL,这样SSL就可以处理所有的加密,处理可变长度等,而你只需要处理普通的旧数据。
至于在你的设计中使用SSL是否是一个好主意,我不知道,但你可以使用这个概念。
发布于 2012-08-30 05:59:05
Twofish在其基本级别上对16字节块进行编码。因此,您可以拥有的Twofish加密数据的最小长度为16字节。如果您的数据包含该长度,则可以对其进行解密,然后丢弃最后一个块中的任何额外字节。
因此,要加密'A‘,你需要将它填充到16字节(不知何故-有多种方式-全零显然不是最好的方式),然后加密你的1个字节的数据和15个不需要的字节。你会得到一个16字节的加密块。在解密时,您可以丢弃额外的字节。
我建议花半个小时阅读维基百科上的这些文章:
http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
http://en.wikipedia.org/wiki/Padding_%28cryptography%29
他们两个都对我有帮助。
https://stackoverflow.com/questions/11924926
复制相似问题