1

良い一日!ここに、 Crypt::Blowfish_PPblowfish_PPのアルゴリズムを使用してパスワードを暗号化するコードがあります。

最初にサンプルの「キー」変数を提供しました (ただし、使用するたびにキーをインクリメントする関数を後で作成します)。

use Crypt::Blowfish_PP;

$key = "12345678";
$$plaintextBlock = "mystringhere";

$blowfish=new Crypt::Blowfish_PP($key);

$ciphertextBlock=$blowfish->encrypt($plaintextBlock);

$plaintextBlock=$blowfish->decrypt($ciphertextBlock);

print "\n";
print $ciphertextBlock."\n";
print $plaintextBlock."\n";

これは$ciphertextBlock5文字のみを出力します。encryptedpasswordMD5を使って他のDBを確認したところ、数文字入っていました。何故ですか?中身 encrypt()decrypt()機能は?「キー」の値は、暗号化されたパスワードの長さに関係しますか?

回答をいただければ幸いです。=)

4

3 に答える 3

2

$$plaintextBlock を $plaintextBlock に変更すると、最初の 8 バイトで機能します。

于 2012-12-05T15:18:47.943 に答える
2

laalto が言ったように、Blowfish_PP (_PP だからではなく、Blowfish だから) はブロックに取り組んでいます。

それを扱うのは通常複雑です。そのため、ブロック暗号を提供する Crypt::* モジュールのラッパーであるCrypt::CBCモジュールがあり、より簡単な方法でそれを使用できます。

たとえば、Crypt::CBC を使用したコードは次のようになります。

#!/usr/bin/perl -w
use strict;
use Crypt::CBC;

my $key = "12345678";
my $plaintextBlock = "mystringhere";

my $cipher = Crypt::CBC->new(
    -key    => $key,
    -cipher => 'Blowfish_PP'
);

my $ciphertext = $cipher->encrypt($plaintextBlock);
# my $textual = $ciphertext;
# $textual =~ s/([^a-zA-Z0-9])/sprintf "\\x%02x", ord $1/ge;
# print "ciphertext: [$textual]\n";
print "ciphertext: [$ciphertext]\n";

my $plaintext  = $cipher->decrypt($ciphertext);
print "plaintext: [$plaintext]\n";

暗号文はバイトのストリームであるため、実際には印刷できないことに注意してください。コード内の 3 行 (my $textual = $ciphertext で始まる) のハッシュを解除して、暗号文をもう少し読みやすい方法で表示することをお勧めします。

Crypt::CBC を使用するもう 1 つの利点は、別のアルゴリズムに切り替えたい場合に、Crypt::CBC->new() 呼び出しを 1 つ変更するだけで済むことです。

ところで、なぜ Crypt::Blowfish_PP なのですか? つまり、Crypt::フグではないのですか? _PP バージョンは一般的に単純に遅いです。

Crypt::Blowfishからの追加の注記。機能的には Crypt::Blowfish_PP と同等であると想定できます。

このモジュールは Crypt::CBC で使用できます。このモジュールを暗号ブロック連鎖モードに使用する場合は、Crypt::CBC の perldoc を読むことをお勧めします。実際、これまたは他のブロック暗号で 8 バイトを超えるデータを暗号化する意図がある場合は、何らかのブロック連鎖の助けが必要になります。Crypt::CBC はこれが得意な傾向があります。8 バイトを超えて暗号化しない場合、データの長さはちょうど 8 バイトでなければなりません。必要に応じて、独自のパディングを行ってください。null バイトとしての "\0" は、これに使用するのに完全に有効です。

于 2009-07-01T10:45:43.543 に答える