Люди, help
Срочно нужно перевести приведённый выше код на PHP. Вот сам модуль:
http://www.angelfire.com/ny5/consigl...lphacrypt.html
Вот код на JS:
c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''), l64 = {};
for (i=0; i<64; i++)
l64[c64[i]] = i;
function alphar(s) {
// I only pray--let me be ready.
var i;
// s must contain only base-64 characters!
s = s.replace(/[^0-9A-Za-z+\/]+/g, '');
s = s.split('');
// preparse k into n-series
for (i=0; i<s.length; i++)
s[i] = l64[s[i]];
return s;
}
// circular--acraw(acraw(a, k, r, sec), k, r, sec) == a
function acraw(s, k, r, seed) {
/* seed is a sec feature;
read some papers about non-repeated initializations */
var i;
s = s.split('');
// isn't it thrilling?
for (i=0; i<s.length; i++)
s[i] = c64[l64[s[i]] ^ k[i%k.length] ^ r[i%r.length] ^ seed];
return s.join(''); // yahoo!
}
function alphac(s, k, r, on) { /* encrypt = on | off */
// get read, get set
var d, i; k=alphar(k), r=alphar(r);
// dump empty stuff
if (r.length == 0 || k.length == 0 || s.length == 0) return s;
// split s into bunches of base-64/non-base-64
s = s.match(/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/g);
i = /[0-9A-Za-z+\/]/.test(s[0]) ? 0 : 1;
// give a 1-2 punch! go!
if (on)
for (; i<s.length; i+=2)
d = c64[Math.floor(Math.random()*64)],
s[i] = acraw(s[i], k, r, l64[d])+d; /* si + d, Sidney Hall */
else
for (; i<s.length; i+=2)
d = s[i].length-1,
s[i] = acraw(s[i].substring(0, d), k, r, l64[s[i].charAt(d)]);
// finished!
return s.join('');
}
Он прекрасно работает. А вот, то, что у меня получилось на PHP:
<?php
function alphar($s) {
$c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$l64 = array();
for ($i=0; $i<64; $i++)
$l64[$c64[$i]] = $i;
$s = preg_replace('/[^0-9A-Za-z+\/]+/', '', $s);
for ($i=0; $i<strlen($s); $i++)
$s[$i] = $l64[$s[$i]];
return $s;
}
// circular--acraw(acraw(a, k, r, sec), k, r, sec) == a
function acraw($s, $k, $r, $seed) {
$c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$l64 = array();
for ($i=0; $i<64; $i++)
$l64[$c64[$i]] = $i;
for ($i=0; $i<strlen($s); $i++)
$s[$i] = $c64[$l64[$s[$i]] ^ $k[$i%(int)strlen($k)] ^ $r[$i%(int)strlen($r)] ^ $seed];
return $s;
}
function alphac($s, $k, $r, $on) { /* encrypt = on | off */
$c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
$l64 = array();
for ($i=0; $i<64; $i++)
$l64[$c64[$i]] = $i;
$k=alphar($k); $r=alphar($r);
if (strlen($r) == 0 || strlen($k) == 0 || strlen($s) == 0) return $s;
// split s into bunches of base-64/non-base-64
preg_match_all('/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/', $s, $a);
$b = $a[0];
$i = preg_match('/[0-9A-Za-z+\/]/', $b[0]) ? 0 : 1;
if ($on) {
for (; $i<count($b); $i+=2) {
$d = $c64[floor(rand(0,63))];
$b[$i] = acraw($b[$i], $k, $r, $l64[$d])+$d; /* si + d, Sidney Hall */
}
} else {
for (; $i<count($b); $i+=2) {
$d = strlen($b[$i])-1;
$b[$i] = acraw(substr($b[$i], 0, $d), $k, $r, $l64[$b[$i][$d]]);
}
}
return implode('', $b);
}
?>
Причём, мне
пришлось скопировать одно и то же в каждую функцию, потому что иначе он ругался на неинициализированные переменные. Пробовал писать global - стал ругаться вообще непонятно на что
Сейчас ошибок интерпретатора нет (!), но в результате шифрования всегда получается строка, состоящая из нуля. Как отлаживать?