|
发表于 2021-1-21 16:33:43
|
显示全部楼层
纯C语言,不嵌入汇编,是stm8上的代码
//********************************解码位判断*********************************//
#define BIT_TEST(x, y) (((x)&(1<<(y)))!= 0)
void Keeloq_Decrypt(void) //函数解码
{
unsigned char i,j,key;
signed char p;
uint32_t temp[4]; //
uint32_t Sum=0;
uint8_t Aux_temp;
p = 1;
for (j=66; j>0; j--)
{
key = KEY_D[p--];
if (p < 0)
p += 8;
for (i=8; i>0; i--)
{
if ( BIT_TEST( Buffer[3],6))
{
if (!BIT_TEST( Buffer[3],1))
aux = 0x3a; // 10
else
aux = 0x5c; // 11
}
else
{
if (!BIT_TEST( Buffer[3],1))
aux = 0x74; // 00
else
aux = 0x2e; // 01
}
if (BIT_TEST( Buffer[2],3))
aux=((aux&0x0f)<<4)|(aux>>4);
if (BIT_TEST( Buffer[1],0)) aux <<= 2;
if (BIT_TEST( Buffer[0],0)) aux <<= 1;
aux ^= Buffer[1] ^ Buffer[3] ^ key;
temp[0]=Buffer[0];
temp[1]=Buffer[1];
temp[2]=Buffer[2];
temp[3]=Buffer[3];
Aux_temp=aux;
temp[1]=temp[1]<<8;
temp[2]=temp[2]<<16;
temp[3]=temp[3]<<24;
Sum=temp[0]+temp[1]+temp[2]+temp[3];
Sum=(Sum<<1)&0xfffffffe;
Aux_temp=Aux_temp&0x80;
Aux_temp=Aux_temp>>7;
Sum=Sum+Aux_temp;
Buffer[0]=(uint8_t) (Sum&0x000000ff);
Buffer[1]=(uint8_t) ((Sum&0x0000ff00)>>8);
Buffer[2]=(uint8_t) ((Sum&0x00ff0000)>>16);
Buffer[3]=(uint8_t) ((Sum&0xff000000)>>24);
key <<= 1;
}
}
} |
|