Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl & BlowFish, Проблема с декодированием 
:(
    Опции темы
Ky6uk
Дата 7.7.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Имеем пакет, считанный из сокета. Первые два байта пакета не шифруются и хранят в себе размер пакета. Почти всегда длина пакета равна 186 байт (первые два байта: BA 00). Остальные 184 байта шифруются по алгоритму blowfish блоками по 8 байт. То есть получается как раз 23 блока. Ключ шифрования так же известен: "6b 60 cb 5b 82 ce 90 b1 cc 2b 6c 55 6c 6c 6c 6c" (видимо это так же набор из 16 байт).

Необходимо дешифровать пакет, используя средства Perl. Использование библиотеки Crypt::Blowfish не приводит к желаемому результату.

Проверялось на рабочем алгоритме, написанном на С++. Результат должен получиться следующим:

Имеем пакет:
Код

BA 00 71 27 C3 51 3D 87 BF 55 0F 04 3D 49 E0 BF
7E EE BB A6 BB CD E8 91 0F 12 46 AB EA 67 6E DB
A5 F1 C9 34 32 F9 44 58 8F E1 F0 01 AB 38 52 03
3D 82 2A 89 09 62 10 81 52 B3 BE C2 73 7C EB A0
E2 6E A1 9F 5F 73 19 F0 31 0F 12 1B 6A F9 F7 B6
5F 1A 01 B2 41 A8 FA 4D 50 7D BB 8E 76 DD 88 EC
9F 96 63 C2 00 72 CD 52 21 53 5C E9 64 20 27 A0
29 CC C7 B5 B0 02 0F 91 1E D0 6D AF 96 D3 71 02
38 3C C2 E3 B1 EA 04 EE AF F9 4C A4 90 4E 99 0B
00 F0 34 07 CF 11 F9 37 4C 4B 5E 46 BF 1F 31 BF
FA 86 D6 EC 86 DF 97 6C F6 37 5E 00 38 98 02 3F
2C FF 69 7C 2A 17 A1 DB 6C 65


После дешифрования должно получиться:
Код

BA 00 00 68 70 B9 73 B9 AA 1B 2E 78 ED 27 6E B6
D1 BA 52 6A 69 B2 2C 44 04 11 CE BE 60 A0 DA 5D
5F 31 EE C0 BF 3C 8C D5 FD 52 60 EF 81 C1 9F 7D
C8 40 3D 98 C7 30 36 44 AA 09 0C 5B 26 D2 AE 5C
56 29 A8 EA A3 B7 87 B4 AB 39 6B 63 3B 4A F1 B0
02 B3 BA AA 06 55 E3 3F 8F 5E 95 71 E8 66 78 1B
F3 4C 69 0D 9A 5E B0 17 B4 BA E1 E5 C5 28 2C 82
8D 38 FB 4C 0D F8 28 28 3A 5D 7C B3 B5 79 87 D2
9B 9E 62 89 6E 8E DA 7E 2E D4 45 A1 3D FD 96 17
D9 27 41 2C 4A 3C 5A F4 3D F2 D3 05 27 50 5C 85
FA 77 BE F7 4D 2E 0C 6B 08 61 CF E6 61 E5 CA 6F
CD 8D 6F 3B 07 A1 E0 1F 1A 96


Подскажите, как можно реализовать данную затею на Perl.
PM MAIL ICQ Jabber   Вверх
Ky6uk
Дата 7.7.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Собственно сам код:
Код

#!/usr/bin/perl -w

use Crypt::Blowfish;
use strict;
use Data::Dumper;
use bytes;

my ($unblow);

sub dec2hex($) { return sprintf("%02X", $_[0]) }

my @bytes = map { chr hex "0x$_" } qw(BA 00 71 27 C3 51 3D 87 BF 55 0F 04 3D 49 E0 BF 7E EE BB A6 BB CD E8 91 0F 12 46 AB EA 67 6E DB A5 F1 C9 34 32 F9 44 58 8F E1 F0 01 AB 38 52 03 3D 82 2A 89 09 62 10 81 52 B3 BE C2 73 7C EB A0 E2 6E A1 9F 5F 73 19 F0 31 0F 12 1B 6A F9 F7 B6 5F 1A 01 B2 41 A8 FA 4D 50 7D BB 8E 76 DD 88 EC 9F 96 63 C2 00 72 CD 52 21 53 5C E9 64 20 27 A0 29 CC C7 B5 B0 02 0F 91 1E D0 6D AF 96 D3 71 02 38 3C C2 E3 B1 EA 04 EE AF F9 4C A4 90 4E 99 0B 00 F0 34 07 CF 11 F9 37 4C 4B 5E 46 BF 1F 31 BF FA 86 D6 EC 86 DF 97 6C F6 37 5E 00 38 98 02 3F 2C FF 69 7C 2A 17 A1 DB 6C 65);
my @dec_bytes = map { chr hex "0x$_" } qw(BA 00 00 68 70 B9 73 B9 AA 1B 2E 78 ED 27 6E B6 D1 BA 52 6A 69 B2 2C 44 04 11 CE BE 60 A0 DA 5D 5F 31 EE C0 BF 3C 8C D5 FD 52 60 EF 81 C1 9F 7D C8 40 3D 98 C7 30 36 44 AA 09 0C 5B 26 D2 AE 5C 56 29 A8 EA A3 B7 87 B4 AB 39 6B 63 3B 4A F1 B0 02 B3 BA AA 06 55 E3 3F 8F 5E 95 71 E8 66 78 1B F3 4C 69 0D 9A 5E B0 17 B4 BA E1 E5 C5 28 2C 82 8D 38 FB 4C 0D F8 28 28 3A 5D 7C B3 B5 79 87 D2 9B 9E 62 89 6E 8E DA 7E 2E D4 45 A1 3D FD 96 17 D9 27 41 2C 4A 3C 5A F4 3D F2 D3 05 27 50 5C 85 FA 77 BE F7 4D 2E 0C 6B 08 61 CF E6 61 E5 CA 6F CD 8D 6F 3B 07 A1 E0 1F 1A 96);
 
print "RAW:\n";
print join(' ', map { &dec2hex(ord $_) } @bytes), "\n";

my $len = ord($bytes[0]) + 256 * ord($bytes[1]);
print "Длина пакета: $len байт.\n";

my $key = pack("H32", "6b60cb5b82ce90b1cc2b6c556c6c6c6c");
print "Dump key: ".Dumper($key);
my $crypter = new Crypt::Blowfish( $key );
for (my $i=2; $i<$len; $i+=8) {
    $unblow = $crypter->decrypt(join('', @bytes[$i..$i+7]));
    print join(' ', map { &dec2hex(ord $_) } @bytes[$i..$i+7]), " -> ", join(' ', map { &dec2hex(ord $_) } split(//, $unblow)), "\n";
}


Это сообщение отредактировал(а) Ky6uk - 7.7.2008, 19:39
PM MAIL ICQ Jabber   Вверх
n4n0bit
Дата 7.7.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.6.2008

Репутация: нет
Всего: 1



Зашифруй одно и тож слово модулем  Crypt::Blowfish и средствами с++ а потом сравни (plain text не используя сеть ) если все верно, значит при чтениии из сокета где та может один символ или лишний или не хватает, например '\n' ( в perl реализации ) или еще что.

Это сообщение отредактировал(а) n4n0bit - 7.7.2008, 17:43
PM MAIL WWW Jabber   Вверх
Ky6uk
Дата 7.7.2008, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Дело в том, что из сокета читается верное количество байт. 186 как в случае с С++ и Perl. Выше в коде я уже оперирую со статичным пакетом, без использования сети (получен средствами С++). Но все равно что-то где-то не так. Может быть реализации blowfish в openssl для C++ отличаются от реализации Crypt::Blowfish на Perl?
PM MAIL ICQ Jabber   Вверх
Ky6uk
Дата 7.7.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Продолжительные ковыряния привели еще к одной мысли, что в Crypt::Blowfish и в простейшей OpenSSL-функции void BF_decrypt(BF_LONG *data,const BF_KEY *key); используются разные алгоритмы. (в OpenSSL есть еще bf-cbc, bf-cfb, bf-ecb и bf-ofb помимо обычного bf)

Пытался шифровать и дешифровать обычный текст, результаты с программой на С++ так же несовпадают с результатами на Perl. Причем на C++ результат верный (нужный мне).
PM MAIL ICQ Jabber   Вверх
Ky6uk
Дата 8.7.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 22.6.2007

Репутация: нет
Всего: нет



Не без добрых людей проблема решена inline модулем:
Код

#!/usr/bin/perl -w

use strict;
use Data::Dumper;
use Inline (
    C        =>    'DATA',
    LIBS    =>    '-lcrypto',
    ENABLE    =>    'XSMODE',
    NAME    =>    'xsmode',
    CLEAN_AFTER_BUILD    =>    0
);

sub dec2hex($) { return sprintf("%02X", $_[0]) }

my @bytes = split //, pack("H*", "ba007127c3513d87bf550f043d49e0bf7eeebba6bbcde8910f1246abea676edba5f1c93432f944588fe1f001ab3852033d822a890962108152b3bec2737ceba0e26ea19f5f7319f0310f121b6af9f7b65f1a01b241a8fa4d507dbb8e76dd88ec9f9663c20072cd5221535ce9642027a029ccc7b5b0020f911ed06daf96d37102383cc2e3b1ea04eeaff94ca4904e990b00f03407cf11f9374c4b5e46bf1f31bffa86d6ec86df976cf6375e003898023f2cff697c2a17a1db6c65");


print "Снимаем Blowfish...\n";

print "------------ Make encoder ------------\n";
my $key_str = '6b 60 cb 5b 82 ce 90 b1 cc 2b 6c 55 6c 6c 6c 6c';
($key_str = $key_str) =~ s/ //g;
print "key: $key_str\n";
my $len = length($key_str);
print "len key: $len\n";
my $key = pack("H$len", $key_str);  # min. 8 bytes
print "Dump key: ".Dumper($key)."\n";

print "------------------------- Phase init key -------------------------\n";
#typedef struct bf_key_st
#        {
#        BF_LONG P[BF_ROUNDS+2];
#        BF_LONG S[4*256];
#        } BF_KEY;
#define BF_ROUNDS       16
#define BF_BLOCK        8

my $len_bf_key = (4*(16+2)+4*256*4);
my $BF_key = "\x00" x $len_bf_key;
MY_BF_set_key($BF_key, length($key), $key);

print "------------ Worked decoder ------------\n";
my $len_packet = length(join('', map { $_ } @bytes));
my $enc_packet;
for (my $i=2; $i < $len_packet; $i+=8) {
    my $cur_slice = join('', @bytes[$i..$i+7]);
    print "Step:\n";
    MY_BF_decrypt($cur_slice, $BF_key);
    $enc_packet .= $cur_slice;
}

my @dec_bytes = ($bytes[0], $bytes[1], split(//, $enc_packet));

print map { &dec2hex( ord $_ ), " " } @dec_bytes;

exit(0);

__END__
__C__
#include <openssl/blowfish.h>

#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

void prn_dump(unsigned char *t, int len) {
    unsigned char *start = t;
    unsigned char *end   = start+len;
    while(t < end){
        printf("%02x", *t);
        t++;
    }
    printf("\n");
}

MODULE = xsmode      PACKAGE = main

void MY_BF_set_key(key, len, data)
    unsigned char *key
    int len
    unsigned char *data
    CODE:
        printf("Init key data:\n");
        prn_dump(data, len);
    BF_set_key((BF_KEY *)key, len, data);

void MY_BF_decrypt(data, key)
    unsigned char *key
    unsigned char *data
    CODE:
        printf("Recive: ");
        prn_dump(data, 8);
        BF_decrypt((BF_LONG *)data, (BF_KEY *)key);
        printf("Output: ");
        prn_dump(data, 8);


Но вопрос о различном результате при использовании "родных" модулей шифрования blowfish остается открытым.
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.