2009-07-01 14 views
1

おやすみ! パスワードを暗号化するためにCrypt::Blowfish_PPblowfish_PPアルゴリズムを使用するコードをここに用意しました。なぜBlowfish :: PPの暗号化で5文字しか印刷できないのですか?

私が開始するためのサンプル「キー」変数を(私はそれを使用する たびにキーインクリメントするその関数以降のようになります が)提供してきましたが、今のところ、これは私が持っているものです。

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"; 

この$ciphertextBlockは、5文字しか出力しません。 MD5を使用して他のDBのencryptedpasswordを確認したところ、 複数の文字が含まれています。何故ですか?内部には encrypt()decrypt()の機能はありますか?暗号化されたパスワードの長さについては、「キー」の値が に影響しますか?

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

答えて

3

によると、encryptdecryptは、一度に1つの8バイトブロックでのみ動作します。したがって、長い文字列を暗号化する場合は、encryptを繰り返し呼び出す必要があります。

なぜ5文字しか出力しないのは、おそらく、暗号文に印刷できない文字が含まれているからです。データを印刷する場合は、データをたとえばに変換します。最初進アスキー:laaltoが言ったように

print sprintf("%02x"x8, unpack("C8", $ciphertextBlock)), "\n"; 
2

、Blowfish_PPは(それが_PPだではないので、Blowfishのだから)ブロックに取り組んでいます。

これを扱うことは通常複雑です。そのため、ブロック暗号を提供するCrypt :: *モジュールをラッパー(実質的に)にして、はるかに単純な方法で使用できるようにするためのモジュールであるCrypt::CBCです。

は例えば、墓所:: 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を使用することの他の利点は、他のアルゴリズムに切り替えることができれば、Crypt :: CBC-> new()呼び出しの1つの変更だということです。

ところで - なぜCrypt :: Blowfish_PPですか?私は、なぜCrypt :: Blowfishを意味しないのですか? _PPのバージョンは一般に単に遅いです。我々は墓所:: Blowfish_PPと機能的に同等であると仮定することができまっすぐCrypt::Blowfishから

追加のノート、、:

モジュールは墓所:: CBCで を使用することが可能です。もし がこのモジュールをCipher ブロック連鎖モードに使用しようとするなら、 はCrypt :: CBCのperldocを読むことをお勧めします。実際には、 の場合、これ以上のデータを8バイト以上、または 他のブロック暗号を で暗号化する意図があれば、 には のブロックチェーンが必要です。 Crypt :: CBCはこれでよく になる傾向があります。 に8バイト以上を暗号化しない場合は、 のデータは正確に8バイトの長さでなければなりません。 必要がある場合は、独自のパディングを行います。 "\ 0" はヌルバイトとして完全に有効です これに使用します。

2

change $$ plaintextBlock to $ plaintextBlockは、最初の8バイトで動作します。

関連する問題