Сообщение от
Fliplab
Доброго времени суток. У кого есть класс реализующий алгоритм шифрования idea?Замечу что нужен алгоритм а не реализация на Mmcrypt
class idea
{
var $EK = array();
var $DK = array();
function MulInv($x)
{
if($x < 2) return $x;
$t1 = 0x10001 / $x;
$y = 0x10001 % $x;
if( $y == 1 ) return (1-$t1) & 0xffff;
$t0 = 1;
do
{
$q = $x / $y;
$x = $x % $y;
$t0 += $q * $t1;
if($x == 1) return $t0;
$q = $y / $x;
$y = $y % $x;
$t1 += $q * $t0;
} while($y != 1);
return (1-$t1) & 0xffff;
}
function mul($x, $y)
{
do
{
if(($_t16 = ($y)))
{
if(($x = ($x) & 0xffff))
{
$_t32 = $x * $_t16;
$x = $_t32 & 0xffff;
$_t16 = $_t32 >> 16;
$x = (($x)-$_t16) + ($x<$_t16?1:0);
}
else
{
$x = 1 - $_t16;
}
}
else
{
$x = 1 - $x;
}
} while(0);
return $x;
}
function init_key($key, $size)
{
for($i=0; $i < $size; $i++)
{
$this->EK[$i] = $key[$i];
}
for($i=0; $i < 8; $i++)
{
$this->EK[$i] = ($this->EK[$i] << 8) | ($this->EK[$i] >> 8);
}
for($i=1; $i < 6; $i++)
{
$this->EK[($i*8)+0] = ($this->EK[(($i-1)*8)+1] << 9) | ($this->EK[(($i-1)*8)+2] >> 7);
$this->EK[($i*8)+1] = ($this->EK[(($i-1)*8)+2] << 9) | ($this->EK[(($i-1)*8)+3] >> 7);
$this->EK[($i*8)+2] = ($this->EK[(($i-1)*8)+3] << 9) | ($this->EK[(($i-1)*8)+4] >> 7);
$this->EK[($i*8)+3] = ($this->EK[(($i-1)*8)+4] << 9) | ($this->EK[(($i-1)*8)+5] >> 7);
$this->EK[($i*8)+4] = ($this->EK[(($i-1)*8)+5] << 9) | ($this->EK[(($i-1)*8)+6] >> 7);
$this->EK[($i*8)+5] = ($this->EK[(($i-1)*8)+6] << 9) | ($this->EK[(($i-1)*8)+7] >> 7);
$this->EK[($i*8)+6] = ($this->EK[(($i-1)*8)+7] << 9) | ($this->EK[(($i-1)*8)+0] >> 7);
$this->EK[($i*8)+7] = ($this->EK[(($i-1)*8)+0] << 9) | ($this->EK[(($i-1)*8)+1] >> 7);
}
$this->EK[48] = ($this->EK[41] << 9) | ($this->EK[42] >> 7);
$this->EK[49] = ($this->EK[42] << 9) | ($this->EK[43] >> 7);
$this->EK[50] = ($this->EK[43] << 9) | ($this->EK[44] >> 7);
$this->EK[51] = ($this->EK[44] << 9) | ($this->EK[45] >> 7);
$this->DK[51] = $this->MulInv($this->EK[3]);
$this->DK[50] = -$this->EK[2];
$this->DK[49] = -$this->EK[1];
$this->DK[48] = $this->MulInv($this->EK[0]);
for($i=0; $i < 7; $i++)
{
$this->DK[47-$i*6] = $this->EK[$i*6+5];
$this->DK[46-$i*6] = $this->EK[$i*6+4];
$this->DK[45-$i*6] = $this->MulInv($this->EK[$i*6+9]);
$this->DK[43-$i*6] = -$this->EK[$i*6+8];
$this->DK[44-$i*6] = -$this->EK[$i*6+7];
$this->DK[42-$i*6] = $this->MulInv($this->EK[$i*6+6]);
}
$this->DK[5] = $this->EK[47];
$this->DK[4] = $this->EK[46];
$this->DK[3] = $this->MulInv($this->EK[51]);
$this->DK[2] = -$this->EK[50];
$this->DK[1] = -$this->EK[49];
$this->DK[0] = $this->MulInv($this->EK[48]);
}
function DecryptECB($inData)
{
// не знаю как реализовать этот кусок
// Пример на delphi
//PDword(@X[1])^:= PDword(@InData)^;
// PDword(@X[3])^:= PDword(dword(@InData)+4)^;
// пример на си
//in = (u16*)inData;
// x1 = *in++;
// x2 = *in++;
// x3 = *in++;
// x4 = *in;
$x1 = ($x1>>8) | ($x1<<8);
$x2 = ($x2>>8) | ($x2<<8);
$x3 = ($x3>>8) | ($x3<<8);
$x4 = ($x4>>8) | ($x4<<8);
for($i=0; $i < 7; $i++)
{
$x1 = $this->Mul($x1, $this->DK[($i*6)+0]);
$x2 += $this->DK[($i*6)+1];
$x3 += $this->DK[($i*6)+2];
$x4 = $this->Mul($x4, $this->DK[($i*6)+3]);
$s3 = $x3;
$x3 = $x3 ^ $x1;
$x3 = $this->Mul($x3, $this->DK[($i*6)+4]);
$s2 = $x2;
$x2 = $x2 ^ $x4;
$x2 += $x3;
$x2 = $this->Mul($x2, $this->DK[($i*6)+5]);
$x3 += $x2;
$x1 = $x1 ^ $x2;
$x4 = $x4 ^ $x3;
$x2 = $x2 ^ $s3;
$x3 = $x3 ^ $s2;
}
$x1 = $this->Mul($x1, $this->DK[48]);
$x3 += $this->DK[49];
$x2 += $this->DK[50];
$x4 = $this->Mul($x4, $this->DK[51]);
$x1 = ($x1 >> 8) | ($x1 << 8);
$s2 = ($x3 >> 8) | ($x3 << 8);
$x3 = ($x2 >> 8) | ($x2 << 8);
$x4 = ($x4 >> 8) | ($x4 << 8);
$x2 = $s2;
// и такой же как выше вывод
}
}