2009-12-07 45 views
1

是否有支持48位数据块的Blowfish算法的实现(Java/C++/Ruby)?我有一个加密问题,输入和输出通道正好是48位。网上的所有实现都适用于64位块。48位blowfish

回答

3

这是因为Blowfish具有64位的设置块大小。您可以将两个随机字节填充到数据的末尾。

require 'rubygems' 
require 'crypt/blowfish' 
blowfish = Crypt::Blowfish.new("A key up to 56 bytes long") 
plain="123456" 
encryptedBlock = blowfish.encrypt_block(plain+(rand(250)+5).chr+(rand(250)+5).chr) 

,或者如果你plain可能小于6个字节/ 48位

encryptedBlock = blowfish.encrypt_block(plain.ljust(8)) 
+0

与添加额外的字节是生成的加密数据块将是64位的唯一问题。我不能截断它,而且这比我的数据通道可以支持的更多。 – 2009-12-07 12:43:31

+0

我从来没有听说过48位块密码。我知道有32位,但这对你也没有帮助。是否有可能拆分64位块并将其作为2x48位发送? – 2009-12-07 15:00:48

2

你可以使用​​与河豚。请记住,永远不要重用任何反击价值。

只需选择一个计数器(它将需要在所有加密中使用相同的密钥是唯一的),将计数器填充到64位并加密填充的计数器。然后将这个加密的前48位与你的明文进行XOR以获得密文。重复密文操作进行解密。

唯一的问题是找到合适的计数器。如果将它与密文一起包含,则需要超过48位。也许你有一个会话ID或可以使用的东西?

+0

块大小和模式是非常不同的。使用计数器模式不会解决问题。 – rook 2009-12-17 01:40:58

+1

当然会。 Counter-mode将河豚转换为流密码,因此您可以将流的第一个48位和xor与纯文本相结合以获得密文(就像您使用RC4-drop所做的那样)在你的回答中)。 – 2009-12-17 06:32:24

1

我建议使用RC4-drop 1024.RC4是一种流密码,因此如果消息少于48bytes,则可以加密任意大小,然后可以用空值填充。丢弃1024意味着丢弃PRNG流的前1024个字节,为此,您可以在首次使用时加密1024个字节的垃圾。

BitTorrent的消息流加密使用RC4降1024,这里是使用ARC4库Python实现:

http://google.com/codesearch/p?hl=en#4FSOSMZ6Pxc/distfiles/BitTorrent-5.0.7.tar.gz|eyN-AXYL_0E/BitTorrent-5.0.7/BitTorrent/Connector.py&q=lang:python%20%22ARC4.new%22