3

これは私を混乱させます。

次の入力を使用して、Blowfish で文字列を暗号化しようとすると: key = "some key" input = "input string"

次の結果が得られます。

ruby: ["79af8c8ee9220bde"]
php: 79af8c8ee9220bdec2d1c9cfca7b13c6

私はphpアプリケーションから文字列を受け取るつもりなので、これら2つを同期させる必要がありますが、なぜ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

ルビーコード:

irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'crypt/blowfish'
=> true
irb(main):003:0> input = "input string"
=> "input string"
irb(main):004:0> key = "some key"
=> "some key"
irb(main):005:0> blowfish = Crypt::Blowfish.new(key)
=> #<Crypt::Blowfish:0xb74b10c4 @sBoxes=[[3156471959, 1769696695, 1443271708, 181204541, 
...... 1894848609], @key="some key">
irb(main):006:0> blowfish.encrypt_block(input)
=> "y\257\214\216\351\"\v\336"
irb(main):007:0> blowfish.encrypt_block(input).unpack("H*")
=> ["79af8c8ee9220bde"]
4

6 に答える 6

4

ちょっと待って、あなたの Ruby 出力は 8 バイトですか? 入力は 12 です。ここでエラーになっているのは Ruby コードです。

私は Crypt::Blowfish を使用したことがありません (そしてドキュメントが不足しています) が、いずれにせよ、入力を 64 ビットの倍数にパディングする必要があるかもしれません。

于 2011-03-28T22:04:49.787 に答える
3

Crypt_Blowfishそれを使用するか、それと同じように動作すると仮定するとmcrypt、パディングの問題が発生します。特に、文字列は、ブロック サイズの倍数になるまで、ヌル バイトで右側がパディングされます。PHP インタラクティブ シェルから:

php > $bf = mcrypt_module_open('blowfish', '', 'ecb', '');
php > $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($bf), MCRYPT_DEV_RANDOM);
php > $key = 'some key';
php > mcrypt_generic_init($bf, $key, $iv);
php > echo mcrypt_enc_get_block_size($td);
8
php > echo bin2hex(mcrypt_generic($bf, 'input string'));
79af8c8ee9220bdec2d1c9cfca7b13c6
php > echo bin2hex(mcrypt_generic($td, "input string\0\0\0\0"));
79af8c8ee9220bdec2d1c9cfca7b13c6

でパディング モードを変更する明確な方法はないようmcryptです。使用しているライブラリを誰が作成したのかわかりません。モジュールのドキュメントでパディング モードを確認してください。

運が良ければ、代わりに Ruby のパディング モードを設定するか、単に Ruby 側で文字列を null で埋めることができます。

于 2011-03-28T21:33:01.697 に答える
1

Blowfishは64ビットのブロック暗号であるため、データをパディングする必要があり、Rubyの実装では自動的にパディングされません。

s = "input string"
len = s.length
mod = 8-len%8
padded = s.ljust(len+mod, "\0")

私は私の最初の試みを示さなければなりません...

暗号化=blowfish.encrypt_block(input。each_char。each_slice(8)。map{|スライス|slice.count== 8?slice.join:slice.join.ljust(8、 "\ 0")}。join

PHPが使用しているように見えるので\0を使用しました。

于 2011-03-28T21:46:17.290 に答える
0

Crypt/Blowfish.php が何であるか、または ->encrypt() メソッドが何をするかはわかりませんが、文字列の違いは、crypt() を呼び出すときにソルトを使用する php である可能性があります。

于 2011-03-28T21:30:57.517 に答える
0

PHP カスタム Blowfish スクリプトが正しく暗号化していないようです。

PHP4 と PHP5 では、組み込みcrypt関数を使用して Blowfish で暗号化できます。

PHP crypt() .

CRYPT_BLOWFISH - 次のようなソルトを使用したフグのハッシュ: "$2a$"、2 桁のコスト パラメータ、"$"、およびアルファベットの 22 基数 64 桁の "./0-9A-Za-z"。この範囲外の文字をソルトで使用すると、crypt() は長さ 0 の文字列を返します。2 桁のコスト パラメータは、基盤となる Blowfish ベースのハッシュ アルゴリズムの反復回数の 2 を底とする対数であり、04 ~ 31 の範囲内である必要があります。この範囲外の値を指定すると、crypt() が失敗します。

$hash = crypt($yourString, '$2a$07$'.$aSalt)したがって、Blowfish を使用して暗号化を呼び出すことができます。

PHP コードにアクセスできない場合は、この回答を完全に無視してください。

于 2011-03-28T21:39:48.790 に答える
0

blowfish.encrypt_string代わりに試してくださいencrypt_block

于 2012-02-21T06:20:58.557 に答える