Здравствуйте !
Пишу _собственную_ реализацию алгоритма шифрования 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
Здравствуйте, VetabetA, Вы писали:
VA> Пишу _собственную_ реализацию алгоритма шифрования TEA для CGI-скрипта. Почему-то работает неправильно. Прошу помощи у знатоков Perl !
http://search.cpan.org/perldoc?Crypt::Tea
Здравствуйте, 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