> Хотелось бы увидеть (псевдо-)код на C или другом языке > высокого уровня. И тестовые примеры тоже. Пишите имейл или мне и все вышлю вот основное
void decrypt(void)
{
byte index;
int count;
byte table[32] = /* a lookup table */
{ 0,1,1,1,0,1,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,1,0,0,1,0,1,1,1,0,0 };
for(count=0; count < (528+48); count++)
{
if (count>=528) goto rotate_key; /* last 48 rotates restore the key */
index = 0;
ifbit (shfreg[0],0) setbit(index,0);
ifbit (shfreg[1],0) setbit(index,1);
ifbit (shfreg[2],3) setbit(index,2);
ifbit (shfreg[3],1) setbit(index,3);
ifbit (shfreg[3],6) setbit(index,4); /* prepare for lookup table */
//
carry = getbit(shfreg[1],7) XOR getbit(shfreg[3],7) XOR
getbit(keyreg[1],7) XOR table[index];
left_shift_carry(shfreg[0]); /* shift in the new bit */
left_shift_carry(shfreg[1]);
left_shift_carry(shfreg[2]);
left_shift_carry(shfreg[3]);
rotate_key:
carry = getbit(keyreg[7],7); /* get the leftmost key bit */
left_shift_carry(keyreg[0]);
left_shift_carry(keyreg[1]);
left_shift_carry(keyreg[2]);
left_shift_carry(keyreg[3]);
left_shift_carry(keyreg[4]);
left_shift_carry(keyreg[5]);
left_shift_carry(keyreg[6]);
left_shift_carry(keyreg[7]); /* left-rotate the 64-bit key */
/* the key is rotated 576 times, which is a multiple of 64 */
/* the key therefore remains unchanged */
}
index = 0;
ifbit (shfreg[0],0) setbit(index,0);
ifbit (shfreg[1],0) setbit(index,1);
ifbit (shfreg[2],3) setbit(index,2);
ifbit (shfreg[3],1) setbit(index,3);
ifbit (shfreg[3],6) setbit(index,4); /* prepare for lookup table */
carry = getbit(shfreg[1],7) XOR getbit(shfreg[3],7) XOR
getbit(keyreg[1],7) XOR table[index];
}
|