Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 01.09.2011, 11:45   #1
Новичок
 
Аватар для Marfey
 
Регистрация: 14.04.2008
Сообщений: 19
Сказал Спасибо: 7
Имеет 3 спасибок в 3 сообщенях
Marfey
Восклицание RSA шифрование на Perl

Если есть кто знает PERL помогите плиз. Вот код зашифровки Логина и пароля для отправки потом его серверу. (RSA key не стал писать как получаю так как и так все знают что он с пакета Init ).

Код:
#!/usr/bin/perl -w
use Crypt::OpenSSL::Bignum;
use Crypt::OpenSSL::RSA;

my $rsa="F735C7C2DF469CA4E09ABD36BD76A4F13CA6F9679A4156E1374B0BECBC7A6CD73D31A4C97816CE555ABA59AA2CF3D39C330DB2904EEFD15B0D70D9765A1F91C8";
my $login ="testlogin";
my $password ="testpass";

authlogin($login, $password, $rsa);

sub authlogin
{
    my ($login_LS,$password_LS, $rsa_key) = @_;
    my $str=('00' x 95).'200000';
    while (length($login_LS)<14){ $login_LS=$login_LS.pack("H*",'00')}
    while (length($password_LS)<16){ $password_LS=$password_LS.pack("H*",'00')}
    my $temp=pack("H*",$str).$login_LS.$password_LS;
    my $crypt_text = rsa_encrypt($temp,$rsa_key);

# тут дальше добавление чексуммы и т д в пакет и отправка его на сервер
}

sub rsa_encrypt { 
    my ($message, $rsakey) = @_;
    my $bn = Crypt::OpenSSL::Bignum->new_from_bin(RepairKey($rsakey));
    my $be = Crypt::OpenSSL::Bignum->new_from_word(65537);
    my $public_key = Crypt::OpenSSL::RSA->new_key_from_parameters($bn, $be);
    my $public = $public_key->get_public_key_string();
    my $rsa = Crypt::OpenSSL::RSA->new_public_key($public);
    $rsa->use_pkcs1_padding();
    my $crypt_message = $rsa->encrypt($message);
    return $crypt_message;
}

sub RepairKey{
    my $key1 = shift;

    my @key = split //, $key1;
    my $i;
    # step 4 xor last 0x40 bytes with first 0x40 bytes
    for( $i=0; $i<0x39; $i++ ) {
     $key[0x40 + $i] = $key[0x40 + $i] ^ $key[$i];
     }
    # step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
     for( $i=0; $i<3; $i++ ) {
     $key[0x0d + $i] = $key[0x0d + $i] ^ $key[0x34 + $i];
     }
     # step 2 xor first 0x40 bytes with last 0x40 bytes
     for( $i=0; $i<0x39; $i++ ) {
     $key[$i] = $key[$i] ^ $key[0x40 + $i];
     }
     for( $i=0; $i<3; $i++ ) {
     my $temp = $key[0x00 + $i];
     $key[0x00 + $i] = $key[0x4d + $i];
     $key[0x4d + $i] = $temp;
     }
     my $key2;
      for( $i=0; $i<length($key1); $i++ ) {
     $key2.=  join('', $key[$i]);
    }

     return($key2);
 }
В результате выполнения кода выходит ошибка в строке 29 (my $crypt_message = $rsa->encrypt($message); )
Код:
RSA.xs:202: OpenSSL error: data too large for key size
Я так понимаю что $message для зашифровки велико. размер его 128 байта. Если бить по блокам, то каждый блок будет после зашифровки 128 байт. А мне в итоге всего нужно получить зашифрованое $message равное 128 байт.
Суть наверное не в этом, а в самих параметрах создания ключа, но вот не могу понять что там не правильно(((

Последний раз редактировалось Marfey, 02.09.2011 в 08:43.
Marfey вне форума   Ответить с цитированием
Старый 01.09.2011, 19:25   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Marfey, я перл знаю очень плохо но функция:
perl Код:
sub rsa_encrypt {     my ($message, $rsakey) = @_;     my $bn = Crypt::OpenSSL::Bignum->new_from_bin(RepairKey($rsakey));     my $be = Crypt::OpenSSL::Bignum->new_from_word(65537);     my $public_key = Crypt::OpenSSL::RSA->new_key_from_parameters($bn, $be);     my $public = $public_key->get_public_key_string();     my $rsa = Crypt::OpenSSL::RSA->new_public_key($public);     $rsa->use_pkcs1_padding();     my $crypt_message = $rsa->encrypt($message);     return $crypt_message; }
по моему должна выглядеть так:
perl Код:
sub rsa_encrypt {     my ($message, $rsakey) = @_;     my $bn = Crypt::OpenSSL::Bignum->new_from_bin(RepairKey($rsakey));     my $be = Crypt::OpenSSL::Bignum->new_from_word(65537);     my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($bn, $be);     $rsa->use_no_padding();     my $crypt_message = $rsa->encrypt($message);     return $crypt_message; }
ЗЫ и ты уверен что RepairKey возвращает 128 байт?
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился спасибкой от:
Старый 02.09.2011, 04:40   #3
Новичок
 
Аватар для Marfey
 
Регистрация: 14.04.2008
Сообщений: 19
Сказал Спасибо: 7
Имеет 3 спасибок в 3 сообщенях
Marfey
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
Marfey,
ЗЫ и ты уверен что RepairKey возвращает 128 байт?
Исправил (чет тупанул в переборе масива 127 байт прилетало)

Цитата:
Сообщение от xkor Посмотреть сообщение
Marfey,
по моему должна выглядеть так:
Уже другая ошибка в той же строке ( my $crypt_message = $rsa->encrypt($message); )
Код:
RSA.xs:202: OpenSSL error: no inverse
Добавлено через 1 час 17 минут
Алексей огромное спасибо
Проблему вроде решил (ошибок не выходит, строка зашифровываеться). Сейчас отправлю на сервер пакет если все ок значит точно решилась проблема.

Последний раз редактировалось Marfey, 02.09.2011 в 04:40. Причина: Добавлено сообщение
Marfey вне форума   Ответить с цитированием
Старый 02.09.2011, 07:01   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Marfey, не забудь отписаться как решил проблему (если решил конечно), любопытно ведь)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 02.09.2011, 12:29   #5
Новичок
 
Аватар для Marfey
 
Регистрация: 14.04.2008
Сообщений: 19
Сказал Спасибо: 7
Имеет 3 спасибок в 3 сообщенях
Marfey
По умолчанию

Не правильная функция RepairKey была (помимо того что 127 байт прилетало с нее)
Вот рабочий код (На сервер отослал все работаeт)
Были еще грабли со снятием XOR, но теперь все норм.)
Код:
#!/usr/bin/perl -w
use Crypt::OpenSSL::Bignum;
use Crypt::OpenSSL::RSA;

my $rsa="F735C7C2DF469CA4E09ABD36BD76A4F13CA6F9679A4156E1374B0BECBC7A6CD73D31A4C97816CE555ABA59AA2CF3D39C330DB2904EEFD15B0D70D9765A1F91C8";
my $login ="testlogin";
my $password ="testpass";

authlogin($login, $password, $rsa);

sub rsa_encrypt {
   my ($message, $rsakey) = @_;
   my $bn = Crypt::OpenSSL::Bignum->new_from_bin(RepairKey($rsakey));
   my $be = Crypt::OpenSSL::Bignum->new_from_word(65537);
   my $rsa = Crypt::OpenSSL::RSA->new_key_from_parameters($bn, $be);
   $rsa->use_no_padding();.
   my $crypt_message = $rsa->encrypt($message);
   return $crypt_message;
}

sub RepairKey {
    my $key1 = shift;
    my @key = split //, $key1;
    my $i;
    # step 4 xor last 0x40 bytes with first 0x40 bytes
    for( $i=0; $i<0x40; $i++ ) {
    $key[0x40 + $i] = $key[0x40 + $i] ^ $key[$i];
    }
    # step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
     for( $i=0; $i<4; $i++ ) {
    $key[0x0d + $i] = $key[0x0d + $i] ^ $key[0x34 + $i];
     }
    # step 2 xor first 0x40 bytes with last 0x40 bytes
    for( $i=0; $i<0x40; $i++ ) {
    $key[$i] = $key[$i] ^ $key[0x40 + $i];
    }
    for( $i=0; $i<4; $i++ ) {
    my $temp = $key[0x00 + $i];
    $key[0x00 + $i] = $key[0x4d + $i];
    $key[0x4d + $i] = $temp;
     }
     my $key2;
    for( $i=0; $i<length($key1); $i++ ) {
    $key2.=  join('', $key[$i]);
    }
   return($key2);
 }

Последний раз редактировалось Marfey, 03.09.2011 в 09:03. Причина: Добавлено сообщение
Marfey вне форума   Ответить с цитированием
За это сообщение Marfey нажился спасибкой от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:20.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!