Алгоритм TEA на Perl - нужна помощь !
От: VetabetA  
Дата: 19.09.05 09:48
Оценка:
Здравствуйте !

Пишу _собственную_ реализацию алгоритма шифрования TEA для CGI-скрипта. Почему-то работает неправильно. Прошу помощи у знатоков Perl !

_________________________________

Для примера : функция дешифровки на C++, ПРАВИЛЬНО обрабатывающая два числа, закодированных при помощи TEA :

void TEA_Decoder(UINT* v, UINT* k)
{
UINT TEA_Keys[4] = {0x12345678,0x12345678,0x12345678,0x12345678} // 128-битный ключ
UINT y = v[0];
UINT z = v[1];
UINT sum = 0;
UINT delta=0x9e3779b9;
UINT n=32;

sum = delta << 5 ;

while (n-- > 0)
{
z -= (y << 4) + k[2] ^ y + sum ^ (y >> 5) + k[3];
y -= (z << 4) + k[0] ^ z + sum ^ (z >> 5) + k[1];
sum -= delta;
}

v[0]=y;
v[1]=z;
}

Вызывается так: TEA_Decoder(tea_numbers); где
@tea_numbers — массив из двух зашифрованных чисел.
_________________________________________

А вот та же самая функция, но переписанная для Perl, которая работает НЕВЕРНО :


sub TEA_Decoder

{
my @k = (0x12345678,0x12345678,0x12345678,0x12345678); # 128-битный ключ
my $y = $_[0];
my $z = $_[1];

my $sum = 0;
my $delta=0x9e3779b9;
my $n=32;

$sum = $delta << 5 ;
$sum = $sum|0;
while ($n-- > 0)
{
$z -= ($y << 4) + $k[2] ^ $y + $sum ^ ($y >> 5) + $k[3];
$z = $z|0;
$y -= ($z << 4) + $k[0] ^ $z + $sum ^ ($z >> 5) + $k[1];
$y = $y|0;
$sum -= $delta;
$sum = $sum|0;
}

$_[0]=$y;
$_[1]=$z;
}

Вызывается так : TEA_Decoder(@tea_numbers) , где
@tea_numbers — массив из двух зашифрованных чисел.

Ключ в обоих вариантах для простоты я сделал фиксированным. Почему на C++ это отлично работает, а на Perl практически тот же код возвращает другие значения — понять не никак не могу .

С уважением,
VetabetA
Re: Алгоритм TEA на Perl - нужна помощь !
От: anonymous Россия http://denis.ibaev.name/
Дата: 19.09.05 09:59
Оценка:
Здравствуйте, VetabetA, Вы писали:

VA> Пишу _собственную_ реализацию алгоритма шифрования TEA для CGI-скрипта. Почему-то работает неправильно. Прошу помощи у знатоков Perl !


http://search.cpan.org/perldoc?Crypt::Tea
Re[2]: Алгоритм TEA на Perl - нужна помощь !
От: VetabetA  
Дата: 19.09.05 15:58
Оценка:
Большое спасибо за подсказку, разобрался и нашел ошибку :

sub TEA_Decoder

{

use integer;

my @k = (0x12345678,0x12345678,0x12345678,0x12345678); # 128-битный ключ
my $y = $_[0];
my $z = $_[1];

my $sum = 0;
my $delta=0x9e3779b9;
my $n=32;

$sum = $delta << 5 ;
while ($n-- > 0)
{
$z -= (($y << 4) + $k[2]) ^ ($y + $sum) ^ ((0x07FFFFFF & ($y >> 5)) + $k[3]);
$y -= (($z << 4) + $k[0]) ^ ($z + $sum) ^ ((0x07FFFFFF & ($z >> 5)) + $k[1]);
$sum -= $delta;
}

$_[0]=$y;
$_[1]=$z;
}

Я так понял, что приоритет выполнения побитовых операций у C++ и у Perl различается. Поэтому надо было в опеределенных местах дополнительные скобки поставить...

С уважением,
VetabetA
Re[3]: Алгоритм TEA на Perl - нужна помощь !
От: anonymous Россия http://denis.ibaev.name/
Дата: 20.09.05 08:11
Оценка:
Здравствуйте, VetabetA, Вы писали:

VA>Я так понял, что приоритет выполнения побитовых операций у C++ и у Perl различается. Поэтому надо было в опеределенных местах дополнительные скобки поставить...


да, это так:
           left        terms and list operators (leftward)
           left        ->
           nonassoc    ++ --
           right       **
           right       ! ~ \ and unary + and -
           left        =~ !~
           left        * / % x
           left        + - .
           left        << >>
           nonassoc    named unary operators
           nonassoc    < > <= >= lt gt le ge
           nonassoc    == != <=> eq ne cmp
           left        &
           left        | ^
           left        &&
           left        ||
           nonassoc    ..  ...
           right       ?:
           right       = += -= *= etc.
           left        , =>
           nonassoc    list operators (rightward)
           right       not
           left        and
           left        or xor
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.