59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
/*
|
|
Keeloq.cpp - Keeloq encryption/decryption
|
|
Written by Frank Kienast in November, 2010
|
|
*/
|
|
|
|
#include "KeeloqLib.h"
|
|
|
|
#define KeeLoq_NLF (0x3A5C742EUL)
|
|
|
|
Keeloq::Keeloq(const unsigned long keyHigh, const unsigned long keyLow) :
|
|
_keyHigh( keyHigh ),
|
|
_keyLow( keyLow )
|
|
{
|
|
}
|
|
|
|
unsigned long Keeloq::encrypt( const unsigned long data )
|
|
{
|
|
unsigned long x = data;
|
|
unsigned long r;
|
|
int keyBitNo, index;
|
|
unsigned long keyBitVal,bitVal;
|
|
|
|
for ( r = 0; r < 528; r++ )
|
|
{
|
|
keyBitNo = r & 63;
|
|
if(keyBitNo < 32)
|
|
keyBitVal = bitRead(_keyLow,keyBitNo);
|
|
else
|
|
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
|
|
index = 1 * bitRead(x,1) + 2 * bitRead(x,9) + 4 * bitRead(x,20) + 8 * bitRead(x,26) + 16 * bitRead(x,31);
|
|
bitVal = bitRead(x,0) ^ bitRead(x, 16) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
|
|
x = (x>>1) ^ bitVal<<31;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
unsigned long Keeloq::decrypt( const unsigned long data )
|
|
{
|
|
unsigned long x = data;
|
|
unsigned long r;
|
|
int keyBitNo, index;
|
|
unsigned long keyBitVal,bitVal;
|
|
|
|
for (r = 0; r < 528; r++)
|
|
{
|
|
keyBitNo = (15-r) & 63;
|
|
if(keyBitNo < 32)
|
|
keyBitVal = bitRead(_keyLow,keyBitNo);
|
|
else
|
|
keyBitVal = bitRead(_keyHigh, keyBitNo - 32);
|
|
index = 1 * bitRead(x,0) + 2 * bitRead(x,8) + 4 * bitRead(x,19) + 8 * bitRead(x,25) + 16 * bitRead(x,30);
|
|
bitVal = bitRead(x,31) ^ bitRead(x, 15) ^ bitRead(KeeLoq_NLF,index) ^ keyBitVal;
|
|
x = (x<<1) ^ bitVal;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
|