2009-07-01 7 views
1

Guten Tag! Ich habe hier einen Code, der den blowfish_PP Algorithmus von Crypt::Blowfish_PP verwendet, um ein Passwort zu verschlüsseln.Warum werden bei Blowfish :: PPs nur fünf Zeichen verschlüsselt?

ich eine Probe „Schlüssel“ Variable für einen Start zur Verfügung gestellt haben (obwohl werde ich eine Funktion machen später die Taste jedes Mal erhöhen, werde ich es verwenden), aber dafür ist jetzt, was ich habe:

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

Diese $ciphertextBlock gibt NUR 5 Zeichen aus. Wenn ich die encryptedpassword anderer DB mit MD5 überprüft, enthält es mehrere Zeichen. Warum das? Was ist drin encrypt() und decrypt() Funktionen? Ist der Wert "Schlüssel" wichtig, wie lange das verschlüsselte Passwort sein wird?

Antworten werden sehr geschätzt. =)

Antwort

3

Nach Blowfish_PP documentation, encrypt und decrypt arbeiten nur auf einzelne 8-Byte-Block zu einem Zeitpunkt. Wenn Sie also längere Strings verschlüsseln, müssen Sie wiederholt encrypt aufrufen.

Warum es nur 5 "Zeichen" ausgibt, liegt wahrscheinlich daran, dass der Chiffretext nicht druckbare Zeichen enthält. Wenn Sie die Daten drucken möchten, konvertieren Sie sie in z. hex ascii zuerst:

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

Wie laalto sagte Blowfish_PP (weil es Blowfish, nicht weil es _PP) arbeitet an Blöcken.

Umgang mit ihm ist in der Regel komplex, deshalb haben Sie Crypt::CBC Modul, das ist ein Wrapper auf (praktisch) jedes Crypt :: * Modul, das Blockchiffre bietet, und ermöglicht es Ihnen, auf eine viel einfachere Weise zu verwenden.

Zum Beispiel Code mit Crypt :: CBC wäre:

#!/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"; 

Denken Sie daran, dass Chiffretext Strom von Bytes ist, so ist es nicht wirklich druckbar. Vielleicht möchten Sie 3 Zeilen im Code auflösen (beginnend mit meinem $ textual = $ ciphertext), um den Chiffretext etwas lesbarer darzustellen.

Zusätzlicher Vorteil der Verwendung von Crypt :: CBC ist, dass, wenn Sie jemals zu einem anderen Algorithmus wechseln möchten - es ist nur eine Änderung in Crypt :: CBC-> new() Anruf.

Übrigens - warum Crypt :: Blowfish_PP? Ich meine, warum nicht Crypt :: Blowfish? _PP-Version ist in der Regel einfach langsamer.

Zusätzlicher Hinweis, direkt aus Crypt::Blowfish, die wir funktional äquivalent zu sein annehmen kann Crypt :: Blowfish_PP:

Das Modul ist in der Lage mit Crypt :: CBC verwendet wird. Sie sind aufgefordert, lesen Sie die Perldoc für Crypt :: CBC, wenn Sie beabsichtigen, dieses Modul für Cipher Block Chaining-Modi zu verwenden.In der Tat, wenn Sie haben irgendwelche Absichten der Verschlüsselung mehr als acht Bytes Daten mit diesem oder andere Blockchiffre, gehen Sie , um eine Art von Block Verkettung Hilfe zu benötigen. Crypt :: CBC neigt dazu, sehr gut darin zu sein. Wenn Sie nicht zu verschlüsseln mehr als acht Bytes, müssen Ihre Daten genau acht Bytes lang sein. Wenn nötig, machen Sie Ihre eigene Polsterung. " als Nullbyte ist perfekt dafür geeignet".

2

Änderung $$ plaintextBlock zu $ ​​plaintextBlock, es wird für die ersten 8 Bytes funktionieren.

Verwandte Themen