在ruby中解密河豚加密字符串只返回字符串的1/2

在ruby中解密河豚加密字符串只返回字符串的1/2,ruby,encryption,blowfish,Ruby,Encryption,Blowfish,这与我昨天的问题有关(得到了很好的结果): 现在我有一个我认为是相反方向的类似问题。我使用php加密字符串: php > require_once 'Crypt/Blowfish.php'; php > $input = "input string"; php > $key = "some key"; php > $crypt = new Crypt_Blowfish($key); php > echo bin2hex($crypt->encrypt($in

这与我昨天的问题有关(得到了很好的结果):

现在我有一个我认为是相反方向的类似问题。我使用php加密字符串:

php > require_once 'Crypt/Blowfish.php';
php > $input = "input string";
php > $key = "some key";
php > $crypt = new Crypt_Blowfish($key);
php > echo bin2hex($crypt->encrypt($input));
79af8c8ee9220bdec2d1c9cfca7b13c6
这正是预期的结果。但是,当我尝试在ruby中解密字符串时,它只提供输入的一个子集:

irb(main):001:0> require 'rubygems'
r=> true
irb(main):002:0> require 'crypt/blowfish'
=> true
irb(main):003:0> key = "some key"
=> "some key"
irb(main):004:0> input = "79af8c8ee9220bdec2d1c9cfca7b13c6"
=> "79af8c8ee9220bdec2d1c9cfca7b13c6"
irb(main):005:0> block = input.gsub(/../) { |match| match.hex.chr }
=> "y\257\214\216\351\"\v\336\302\321\311\317\312{\023\306"
irb(main):006:0> blowfish = Crypt::Blowfish.new(key)
=> #<Crypt::Blowfish:0xb73acbd8 @sBoxes=[[3156471959, 1769696695, 1443271708, 181204541, 
... 1894848609], @key="some key">
irb(main):008:0> blowfish.decrypt_block(block)
=> "input st"
irb(main):001:0>需要“rubygems”
r=>true
irb(主要):002:0>要求“地穴/河豚”
=>正确
irb(主):003:0>key=“一些键”
=>“一些关键点”
irb(主):004:0>input=“79af8c8ee9220bdec2d1c9cfca7b13c6”
=>“79af8c8ee9220bdec2d1c9cfca7b13c6”
irb(main):005:0>block=input.gsub(/../){| match | match.hex.chr}
=>“y\257\214\216\351\”\v\336\302\321\311\317\312{\023\306”
irb(main):006:0>blowfish=Crypt::blowfish.new(键)
=> #
irb(主):008:0>河豚。解密_块(块)
=>“输入st”
知道我现在在做什么蠢事吗?

河豚块就是。请注意,这正是你要求解密一个块时得到的字符数

必须有更多的代码才能获得最后一个块,否则您需要在接下来的8字节中再次调用decrypt_块

您可能希望尝试解密\u字符串,而不是调用decrypt\u块

从测试中可以看出:

userkey = "A BIG KEY"
bf = Crypt::Blowfish.new(userkey) 
string = "This is a string which is not a multiple of 8 characters long"
encryptedString = bf.encrypt_string(string)
decryptedString = bf.decrypt_string(encryptedString)
assert_equal(string, decryptedString)

离题,但你使用Blowfish的原因是什么?新的设计确实应该使用AES,更安全(开始时块的大小更长,而且研究得更好)并且获得越来越多的CPU硬件支持,这注定是每天在更多计算机上最快的解决方案。我有一个Java blowfish加密字符串,但在ruby中调用bf.decrypt_字符串后,我得到一个长字符串,如“\ve)\xC7\xBD\xB4\…”。因此,Java和ruby blowfish之间似乎有很大的区别