Как я могу расшифровать зашифрованный текст Blowfish с соленым заголовком? - PullRequest
2 голосов
/ 04 июля 2011

У меня есть какой-то зашифрованный текст, который был зашифрован с помощью модуля Perl Crypt :: CBC , который я хочу расшифровать в другом месте.

Зашифрованный текст был создан с использованием «простой» версии *Конструктор 1005 *, то есть:

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

При чтении страницы MAN этот метод построения использует простой строковый ключ и случайную соль для генерации IV и литерального ключа, который используется для шифрования, а такжевставьте заголовок с солью.

"соль" - объедините кодовую фразу с 8-байтовым случайным значением, чтобы сгенерировать ключ блочного шифра и IV из предоставленной парольной фразы.Соль будет добавлена ​​в начало потока данных, что позволит дешифрованию восстановить ключ и IV при правильной парольной фразе.Этот метод совместим с текущими версиями OpenSSL.

Теперь мне нужно расшифровать зашифрованный текст на другой платформе, которая поддерживает только дешифрование CBC, учитывая зашифрованный текст, буквальный ключ и IV.Чтобы попытаться сгенерировать литеральный ключ, IV и соль, я использовал Crypt :: CBC для генерации таких значений:

my $crypt = new Crypt::CBC(-key => 'my secret key', -cipher => 'Blowfish');
my $out = $crypt->decrypt($ciphertext);
my $literal_key = $crypt->key();
my $iv = $crypt->iv();
my $salt = $crypt->salt();

Расшифровка здесь верна, но я не смог использовать сгенерированныйбуквальный ключ и IV для расшифровки шифра;это производит мусор:

my $crypt2 = new Crypt::CBC(
    -literal_key => 1,
    -key => $literal_key,
    -cipher => 'Blowfish',
    -iv => $iv,
    -header => 'none');
my $rubbish - $crypt2->decrypt($ciphertext);

Я не могу предоставить буквальный ключ и использовать соленый заголовок, поэтому я потерян в следующем шаге.

Как я могу расшифровать этот текст?

EDIT : целевая система не работает на Perl, но мне удалось сгенерировать то же значение, что и в $ rubbish выше, поэтому я уверен, что он использует тот же алгоритм (CBC, Blowfish) для расшифровки.

Ответы [ 3 ]

1 голос
/ 06 июля 2011

Чтобы расшифровать поток, сначала необходимо удалить заголовок, добавленный Crypt :: CBC в «солевой» режим.Заголовок состоит из 8 символов Salted__, за которыми следуют 8 байт солт-данных.

В perl примерно так должно быть:

my $crypt2 = new Crypt::CBC(
    -literal_key => 1,
    -key => $literal_key,
    -cipher => 'Blowfish',
    -iv => $iv,
    -header => 'none');
my $cleartext = $crypt2->decrypt(substr($ciphertext, 16));
1 голос
/ 02 февраля 2012

Если кому-то нужна функция _salted_key_and_iv в PHP - вот она:

function _salted_key_and_iv ($pass, $salt) {
        if(strlen($salt) != 8) {
            die("Salt must be 8 bytes long");
        }

        $key_len = 56;
        $iv_len  = 8;

        $desired_len = $key_len+$iv_len;

        $data  = '';
        $d = '';

        while (strlen($data) < $desired_len) {
            $d = pack("H*", md5($d . $pass . $salt));
            $data .= "$d";
        }

        return $data;
}
1 голос
/ 04 июля 2011

Это может сработать.Длина вашего ключа должна быть ровно 56 байт, а длина ключа должна быть ровно восемь байт:

#!/usr/bin/perl

use strict;
use warnings;

use Crypt::CBC;

my $key = "x" x 56;
my $iv  = "x" x 8;

my $plaintext  = "this is just some normal text\n";
my $ciphertext = Crypt::CBC->new(
    -cipher      => 'Blowfish',
    -header      => 'none',
    -literal_key => 1,
    -key         => $key,
    -iv          => $iv,
)->encrypt($plaintext);

print Crypt::CBC->new(
    -cipher      => 'Blowfish',
    -header      => 'none',
    -literal_key => 1,
    -key         => $key,
    -iv          => $iv,
)->decrypt($ciphertext);
...