Какой алгоритм Blowfish является наиболее «правильным»?

StackOverflow https://stackoverflow.com/questions/3794439

  •  05-10-2019
  •  | 
  •  

Вопрос

Я использую Windows Server 2k8 (может быть, это половина проблемы?). В любом случае, я получаю разные значения от разных модулей Blowfish на разных языках.Есть ли тот, на который можно положиться как на стандарт?

В следующих примерах предположим, что ключ password и открытый текст 12345678.

а.Тем Онлайн-инструмент шифрования с установленным алгоритмом Blowfish режим ECB и Base64 Encode the output проверено дает 2mADZkZR0VM=.Я использовал это в качестве ориентира, мудро или нет.

б.Следующий код 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 символов и не нуждается в дополнении.

в.Если я использую 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= который соответствует букве «А.» выше.Однако проблема с этим модулем заключается в том, что для кодирования необходимо сегментировать данные на 8-байтовые фрагменты;у него нет собственного чанка.

д.Если я использую источник по адресу http://linux.die.net/man/3/bf_ecb_encrypt (что я и сделал для недавнего проекта PHP ext), то получаю тот же ответ, что и «a.».Я склонен доверять этому коду больше всего, поскольку он используется в SSLeay и OpenSSL.

е.Тем BlowfishEx.EXE в DI Management Иглобрюхая рыба:версия Visual Basic с PKCS#5 отступы дают 2mADZkZR0VOZ5o+S6D3OZw== что совпадает с результатами Crypt::ECB с PADDING_AUTO.Если параметр Padding установлен на None я получил 2mADZkZR0VM= что соответствует 'a.'

Я частично ответил на свой вопрос, написав это:похоже, мне просто нужно изменить код DI Management для проекта VB6.И, возможно, предложите то же самое автору Crypt::ECB.

Но остается вопрос:Существует ли надежная справочная платформа для иглобрюхих рыб?

Это было полезно?

Решение

Ваша проблема, похоже, не в том, правильно ли они реализуют алгоритм Blowfish.В варианте «без заполнения» все они дают одинаковые результаты.

Это оставляет вопрос о том, следует ли вообще дополнять 8-байтовый ввод.Ответ на это довольно прост:PKCS #7 требует, чтобы к входным данным всегда добавлялся хотя бы один байт заполнения.Причина этого проста:на принимающей стороне должен быть однозначный способ удаления отступов.В случае PKCS#7 значение байтов заполнения всегда равно количеству байтов заполнения, которое получатель должен удалить.

Итак, когда вы получаете материал, дополненный PKCS7, вы расшифровываете блок, затем просматриваете последний байт расшифрованного вывода и удаляете это количество байтов из блока.Без блока заполнения в конце получатель обычно просматривает последний байт фактических данных, и какое бы значение этот байт ни содержал, он удаляет это количество байтов (хотя, вероятно, это должно сказать вам, что есть проблема, если число больше 8).В любом случае, чтобы обеспечить правильную работу, всегда должен быть хотя бы один байт заполнения.В вашем случае это означает, что входные данные расширяются до 16 байт вместо 8.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top