PDA

Просмотр полной версии : RSA шифрование на Perl


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


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

my $rsa="F735C7C2DF469CA4E09ABD36BD76A4F13CA6F9679A4156E137 4B0BECBC7A6CD73D31A4C97816CE555ABA59AA2CF3D39C330D B2904EEFD15B0D70D9765A1F91C8";
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 байт.
Суть наверное не в этом, а в самих параметрах создания ключа, но вот не могу понять что там не правильно(((

xkor
01.09.2011, 19:25
Marfey, я перл знаю очень плохо но функция:
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 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 байт?

Marfey
02.09.2011, 04:40
Marfey,
ЗЫ и ты уверен что RepairKey возвращает 128 байт?
Исправил (чет тупанул в переборе масива 127 байт прилетало)

Marfey,
по моему должна выглядеть так:
Уже другая ошибка в той же строке ( my $crypt_message = $rsa->encrypt($message); )

RSA.xs:202: OpenSSL error: no inverse


Добавлено через 1 час 17 минут
Алексей огромное спасибо
Проблему вроде решил (ошибок не выходит, строка зашифровываеться). Сейчас отправлю на сервер пакет если все ок значит точно решилась проблема.

xkor
02.09.2011, 07:01
Marfey, не забудь отписаться как решил проблему (если решил конечно), любопытно ведь)

Marfey
02.09.2011, 12:29
Не правильная функция RepairKey была (помимо того что 127 байт прилетало с нее)
Вот рабочий код (На сервер отослал все работаeт)
Были еще грабли со снятием XOR, но теперь все норм.)

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

my $rsa="F735C7C2DF469CA4E09ABD36BD76A4F13CA6F9679A4156E137 4B0BECBC7A6CD73D31A4C97816CE555ABA59AA2CF3D39C330D B2904EEFD15B0D70D9765A1F91C8";
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);
}