本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
近年微芯在官网上已经提供了解码C代码。我测试过比我早前(08年初)从汇编上翻译过来的速度更快。
#define setbit( b, n)   ((b) |= ( 1 << (n)))
#define getbit( b, n)   (((b) & ((u4t)1<<n)) ? 1 : 0)
#define ifbit(x,y)      if (getbit(x,y))
/* 64bits decryption key */
u4t mpik; /* high double word */
u4t mpin; /* low double word */
/* 
exampe: 
decryption key: 123456789abcdef0
mpik: 0x12345678
mpin: 0x9abcdef0
*/
u4t Keeloq_decode(u4t csr)
{
  u4t 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   */
  u4t pik,pin,bitin,keybit,keybit2;
  u2t bitlu;
  u2t ix;
  // Load Key
  pik = mpik;
  pin = mpin;  
  for(ix=0; ix < 528; ix++)
  {
    // Rotate Code Shift Register
    bitin = getbit(csr,31);
    csr<<=1;
    // Get Key Bit
    keybit2=getbit(pin,15);
    // Rotate Key Right
    keybit=getbit(pik,31);
    pik=(pik<<1)|getbit(pin,31);
    pin=(pin<<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) ^ lut[bitlu] ^ keybit2;
  }
  return csr;
} |