2

これは昨日の私の質問に関連しています(素晴らしい結果が得られました): rubyでBlowfishを使用して文字列を暗号化すると、phpの同じプロセスよりも短い文字列が返されます

今、私は反対方向に同様の問題であると私が信じているものを持っています。私は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"

私が今している愚かなことは何ですか?

4

1 に答える 1

6

フグのブロックの長さは8バイトです。これは、1つのブロックを復号化するように要求したときに返される文字数とまったく同じであることに注意してください。

最後のブロックを取得するには、さらに多くのコードが必要です。そうでない場合は、次の8バイトでdecrypt_blockを再度呼び出す必要があります。

復号化ブロックを呼び出す代わりに、復号化文字列を試してみることをお勧めします。

テストから:

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)
于 2011-03-29T14:41:36.387 に答える