2011-03-29 24 views
2

這是記者從昨天與我的問題(這得到了很大的成績): Encrypting a string with Blowfish in ruby returns a shorter string than the same process in php解密紅寶石河豚加密的字符串,只返回1/2字符串

現在我有什麼,我認爲是在一個類似的問題相反的方向。我使用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 

而這正是預期的結果。然而,當我試圖解密紅寶石字符串,它只是給了我輸入的一個子集:

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" 

任何想法愚蠢的事情,我現在在做什麼?

+0

題外話,但使用的是河豚的任何原因?新的設計真的應該使用AES,更安全(開始時更長的塊大小以及更好的研究方法),並獲得越來越多的CPU硬件支持,因此必將成爲每天更多計算機上最快的解決方案。 – 2011-03-29 14:47:41

回答

6

河豚塊是8-bytes long。請注意,這正是您要求解密一個塊時返回的字符數。

必須有更多的代碼來獲得最後的塊,或者你需要在接下來的8個字節再次調用decrypt_block。

而不是調用decrypt_block你可能想嘗試decrypt_string。

從測試:

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) 
+0

我有一個Java blowfish加密的字符串,但在調用bf.decrypt_string後,我得到一個長字符串像「」\ ve)\ xC7 \ xBD \ xB4 \ ....「。所以它似乎有e差異Java和紅寶石河豚 – KullDox 2016-07-04 04:53:08