2

私は Windows Server 2k8 を実行しています (おそらくそれが問題の半分でしょうか?) とにかく、さまざまな言語のさまざまな Blowfish モジュールからさまざまな値を取得しています。標準として信頼できるものはありますか?

password次の例では、キーがで、プレーンテキストが であると想定しています12345678

を。アルゴリズムがモードに設定され、チェックされているオンライン暗号化ツールは、 . 私はこれを、賢明かどうかにかかわらず、私の基準点として使用してきました。BlowfishECBBase64 Encode the output2mADZkZR0VM=

b. 次の Perl コードではCrypt::ECB、 とMIME::Base64

use MIME::Base64;
use Crypt::ECB;
$crypt = Crypt::ECB->new;
$crypt->padding(PADDING_NONE);
$crypt->cipher('Blowfish') || die $crypt->errstring;
$crypt->key('password'); 
$enc = $crypt->encrypt("12345678");
print encode_base64($enc);

これ2mADZkZR0VM=は PADDING_NONE で出力されます (上記の「a.」とよく比較されます)。ただし、パディングが設定されてPADDING_AUTOいる場合2mADZkZR0VOZ5o+S6D3OZw==、少なくとも私の考えでは、平文の長さが8文字でパディングが不要なため、これはバグです。

c. Crypt::Blowfish以下のように使用する場合

#! c:\perl\bin 
use Crypt::Blowfish;
use MIME::Base64;

my $key;
my $plaintext;

$key = "password";
$plaintext = "12345678";

my $cipher = new Crypt::Blowfish $key; 
my $ciphertext = $cipher->encrypt($plaintext);
my $encoded = encode_base64( $ciphertext );
print $encoded;

次に、2mADZkZR0VM=「a」に一致するものを取得します。その上。ただし、このモジュールの問題点は、エンコードのために物事を 8 バイトのチャンクに分割する必要があることです。独自のチャンカーはありません。

d. http://linux.die.net/man/3/bf_ecb_encrypt (最近の PHP ext プロジェクトで使用したもの)のソースを使用すると、'a.' と同じ答えが得られます。SSLeay と OpenSSL で使用されているため、このコードを最も信頼する傾向があります。

e. BlowfishEx.EXEDI 管理のBlowfish :パディング付きの Visual Basic バージョンは、Crypt::ECB の結果と同じものを提供します。Padding を に設定すると、「a.」に一致するものを取得できます。PKCS#52mADZkZR0VOZ5o+S6D3OZw==PADDING_AUTONone2mADZkZR0VM=

私はこれを書いて私自身の質問に部分的に答えました.VB6プロジェクトのDI管理のコードを変更する必要があるようです. Crypt::ECB の作成者に同じことを提案するかもしれません。

しかし、疑問が残ります。信頼できるフグのリファレンス プラットフォームはありますか?

4

1 に答える 1

9

あなたの問題は、彼らが Blowfish アルゴリズムを正しく実装しているかどうかにあるようには見えません。「パディングなし」のバリアントでは、それらはすべて同じ結果を生成するように見えます。

これにより、8 バイトの入力をパディングする必要があるかどうかという問題が残ります。これに対する答えは非常に単純です。PKCS #7 では、入力に少なくとも 1 バイトのパディングが常に追加される必要があります。この理由は単純です。受信側で、パディングを削除するための明確な方法が必要です。PKCS#7 の場合、パディング バイトの値は常に、受信者が取り除く必要があるパディングのバイト数です。

したがって、PKCS7 でパディングされた素材を受け取ったら、ブロックを復号化し、復号化された出力の最後のバイトを見て、ブロックからそのバイト数を削除します。最後にパディングのブロックがなければ、受信者は通常、実際のデータの最後のバイトを見て、たまたまそのバイトに含まれていた値が何であれ、その多くのバイトを取り除きます (数値が8より大きい)。いずれにせよ、正しい操作を保証するために、常に少なくとも 1 バイトのパディングが必要です。あなたの場合、それは入力が8ではなく16バイトに拡張されることを意味します.

于 2010-09-25T16:22:33.857 に答える