|
楼主 |
发表于 2011-9-17 08:01:11
|
显示全部楼层
unsigned char lut[32] =
{ 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 };
// E 2 4 7 C 5 A 3 //
/*********************************************************************************************************
** Function name: Decode
** Descriptions: 滚动码解码核心程序
** input parameters: 解密原码 KEY高四位 KEY低四位
** output parameters: 解码后的数据
** Returned value: 无
*********************************************************************************************************/
void Decrypt(void)
{
// uint32 lut[32] =
//{ 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 };
// E 2 4 7 C 5 A 3 //
uint32 KEY_H,KEY_L,bitin,keybit,keybit2;
uint16 bitlu;
int ix;
uint32 csr;
csr=Buff[3];
csr=csr<<8;
csr+=Buff[2];
csr=csr<<8;
csr+=Buff[1];
csr=csr<<8;
csr+=Buff[0];
KEY_H=DKEY[7];
KEY_H=KEY_H<<8;
KEY_H+=DKEY[6];
KEY_H=KEY_H<<8;
KEY_H+=DKEY[5];
KEY_H=KEY_H<<8;
KEY_H+=DKEY[4];
KEY_L=DKEY[3];
KEY_L=KEY_L<<8;
KEY_L+=DKEY[2];
KEY_L=KEY_L<<8;
KEY_L+=DKEY[1];
KEY_L=KEY_L<<8;
KEY_L+=DKEY[0];
for(ix=0; ix < 528; ix++)
{
//Rotate Code Shift Register
bitin = getbit(csr,31);
csr<<=1;
// Get Key Bit
keybit2=getbit(KEY_L,15);
// Rotate Key Right
keybit=getbit(KEY_H,31);
KEY_H=(KEY_H<<1) | getbit(KEY_L,31);
KEY_L=(KEY_L<<1) | keybit; // 64-bit left rotate //
// Get result from Non-Linear Lookup Table
bitlu = 0;
ifbit (csr, 1) setbit(bitlu,0);
ifbit (csr, 9) setbit(bitlu,1);
ifbit (csr,20) setbit(bitlu,2);
ifbit (csr,26) setbit(bitlu,3);
ifbit (csr,31) setbit(bitlu,4);
// Calculate Result of XOR and shift in
csr = csr ^ bitin ^ ((csr&0x10000L)>>16) ^ ((uint32)lut[bitlu]) ^ keybit2;
}
Buff[0]= (unsigned char)(csr&0x000000FF);
Buff[1]= (unsigned char)((csr>>8)&0x000000FF);
Buff[2]= (unsigned char)((csr>>16)&0x000000FF);
Buff[3]= (unsigned char)((csr>>24)&0x000000FF);
} |
|