2009-07-01 4 views
1

Добрый день! У меня есть код здесь, который использует алгоритм blowfish_PP от Crypt::Blowfish_PP для шифрования пароля.Почему Blowfish :: 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"; 

$ciphertextBlock ВЫХОД ТОЛЬКО 5 символов. Когда я проверил encryptedpassword другой БД, используя MD5, он содержит несколько символов. Почему это? Что находится внутри encrypt() и decrypt() функции? Значение «ключа» имеет значение , как долго будет зашифрованный пароль?

Ответы будут высоко оценены. =)

ответ

3

Согласно Blowfish_PP documentation, encrypt и decrypt работают только на одном 8-байтовом блоке за раз. Поэтому, если вы шифруете более длинные строки, вам нужно повторно позвонить encrypt.

Почему он выводит только 5 символов, вероятно, потому, что зашифрованный текст содержит непечатаемые символы. Если вы хотите распечатать данные, преобразуйте их, например. шестнадцатеричный ASCII первая:

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

Как сказал laalto, Blowfish_PP (потому что это Blowfish, а не потому, что это _PP) работает на блоках.

Работа с ним, как правило, сложна, поэтому у вас есть модуль Crypt::CBC, который является оберткой (практически) любого модуля Crypt :: *, который обеспечивает блочный шифр и позволяет использовать его гораздо проще.

Например, код с 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 строки в коде (начиная с моего $ textual = $ ciphertext), чтобы показать зашифрованный текст более читаемым способом.

Дополнительное преимущество использования Crypt :: CBC заключается в том, что если вы когда-либо захотите переключиться на другой алгоритм - это всего лишь одно изменение в вызове Crypt :: CBC-> new().

Кстати, почему Crypt :: Blowfish_PP? Я имею в виду, почему бы не Crypt :: Blowfish? Версия _PP обычно просто медленнее.

Дополнительное примечание, прямо из Crypt::Blowfish, что мы можем предположить, что функционально эквивалентно Crypt :: Blowfish_PP:

Модуль способен быть использован с Crypt :: CBC. Вам рекомендуется прочитать perldoc для Crypt :: CBC, если вы намерены использовать этот модуль для Cipher .На самом деле, если у вас есть , есть какие-либо намерения шифровать больше , чем восемь байтов данных с этим или любого другого блочного шифрования, вы собираетесь нуждаться в некотором типе цепочки блоков help. Crypt :: CBC имеет тенденцию быть очень хорошо. Если вы не собираетесь использовать , то зашифруйте более восьми байтов, ваши данные должны быть ровно в восемь байтов. Если нужно, сделайте свое собственное заполнение. «\ 0» как нулевой байт отлично подходит для использования .

2

изменить $$ plaintextBlock на $ plaintextBlock, он будет работать для первых 8 байтов.