这个被遗忘的CSDN号码今日起开始启用,希望借助CSDN这个强大的平台和大家一起交流学习!
以前参照网络上某仁兄的程序修改的滚动码解码程序,在VC上合C51上通过测试,贴一个和大家一起分享,请指教。
unsigned char idata C_F = 0;
/*
*********************************************************************************************************
** 函数名称 :SWAPF();
** 函数功能 :将NUM的高低字节互换;
** 入口参数 :num:待修改数据;
** 出口参数 :num;
*********************************************************************************************************
*/
unsigned char SWAPF(unsigned char num)
{
return (num>>4) | (num<<4) ;
}
/*
*********************************************************************************************************
** 函数名称 :RCL();
** 函数功能 :带进位左移;
** 入口参数 :num:带移数据,n:移动位数,C_F:进位标志位;
** 出口参数 :RCL:移位结果返回,C_F:本次移位进位标志;
*********************************************************************************************************
*/
unsigned char RCL ( unsigned char num ,unsigned char n)
{
unsigned char i = 0;
unsigned char temp = 0;
unsigned char cf1 = 0;//,cf2;
temp = num;
if ( n != 0 )
{
for(i = 0 ; i < n ; i++)
{
cf1 = temp & 0x80;
temp = ( temp << 1 ) | C_F;
C_F = cf1 >> 7;
}
}
return temp;
}
/*
*********************************************************************************************************
** 函数名称 :Decrypt();
** 函数功能 :keeloq解码子程序;
** 入口参数 :key[]:编解码厂商密码,hop[]:接收的滚动码;
** 出口参数 :hop[]:
*********************************************************************************************************
*/
void Decrypt(unsigned char key[], unsigned char hop[] )
{
unsigned char i = 0;
unsigned char j = 0;
unsigned char key1 = 0;
unsigned char aux = 0;
unsigned char temp = 0;
signed char p = 6;
for (j = 66; j > 0; j--)
{
key1 = key[p++];
if ( p > 7) p = 0;
for (i = 8; i > 0; i--)
{
if (hop[0] & (1 << 6))
{
if (!(hop[0] & (1 << 1)))
{
aux = 0x3a;
}
else
{
aux = 0x5c;
}
}
else
{
if (!(hop[0] & (1 << 1)))
{
aux = 0x74;
}
else
{
aux = 0x2e;
}
}
if (hop[1] & (1 << 3))
{
aux = SWAPF(aux);
}
if (hop[2] & (1 << 0))
{
aux <<= 2;
}
if (hop[3] & (1 << 0))
{
aux <<= 1;
}
aux ^= hop[2] ^ hop[0] ^ key1;
temp = RCL(aux,1);
hop[3] = RCL(hop[3], 1);
hop[2] = RCL(hop[2], 1);
hop[1] = RCL(hop[1], 1);
hop[0] = RCL(hop[0], 1);
key1 = key1<<1;
}
}
}