Фрикер Клуб
 

Вернуться   Фрикер Клуб > Основной раздел > Статьи

Важная информация

Ответ
 
Опции темы Опции просмотра
Старый 28.09.2014, 00:11   #31
Lpa
Резидент клуба
 
Аватар для Lpa
 
Регистрация: 13.06.2012
Сообщений: 327
По умолчанию Re: Формат пакета KEELOQ

Доброго времени суток!
Прошу помочь, сделал я на основе исходников от Ruptor функции энкрипта и декрипта KeeLoq для PIC16F946(940 Брелок). Всё работает, но очень долго выполняется! Декрипт выполсяется за 900 мС, энкрипт примерно столько же. Тактовая частота 4 МГц, маловато, конечно, но даже при такой частоте не должно быть настолько долго
Вот сами функции:
Код:
#define KeeLoq_NLF 0x3A5C742E
#define bit(x,n) (((x)>>(n))&1)
#define g5(x,a,b,c,d,e) (bit(x,a)+(bit(x,b)<<1)+(bit(x,c)<<2)+(bit(x,d)<<3)+(bit(x,e)<<4))

unsigned long key[2];



unsigned long KeeLoq_Encrypt(unsigned long data)
{
  unsigned long x=data;
  unsigned int r;

  for(r=0; r<528; r++)
  {
    x=(x>>1)^((bit(x, 0)^ bit(x, 16)^(unsigned long)bit(key[(r&63)/32], ((r&63)%32))^bit(KeeLoq_NLF, g5(x, 1, 9, 20, 26, 31)))<<31);
  }

  return x;
}

//108.21ms@8MHz Mega16
unsigned long KeeLoq_Decrypt( unsigned long data)
{
  unsigned long x=data;
  unsigned int r;

  for(r=0; r<528; r++)
  {
    x=(x<<1)^bit(x, 31)^bit(x, 15)^(unsigned long)bit(key[((15-r)&63)/32], (((15-r)&63)%32))^bit(KeeLoq_NLF, g5(x, 0, 8, 19, 25, 30));
  }

  return x;
}

Последний раз редактировалось Lpa; 28.09.2014 в 00:17.
Lpa вне форума   Ответить с цитированием
Старый 28.09.2014, 07:31   #32
Paul74s
Резидент клуба
 
Аватар для Paul74s
 
Регистрация: 16.11.2012
Сообщений: 584
По умолчанию Re: Формат пакета KEELOQ

Я использовал те же функции, время выполнения около 80 мс на АТмега168 8МГц
Paul74s вне форума   Ответить с цитированием
Старый 28.09.2014, 08:33   #33
oleg
председатель клуба
 
Аватар для oleg
 
Регистрация: 01.01.2011
Сообщений: 678
По умолчанию Re: Формат пакета KEELOQ

У меня тоже декрипт шел долго, но я писал на асьме и не очень оптимально. Если ваяете на С-и, то может оптимизацию кода покрутить в компиляторе. Где-то на микрочипе были исходники декрипта, может оттуда передрать?
oleg вне форума   Ответить с цитированием
Старый 28.09.2014, 18:20   #34
TailsMD
Banned
 
Регистрация: 29.08.2014
Сообщений: 61
По умолчанию Re: Формат пакета KEELOQ

Передирал, так же работают
TailsMD вне форума   Ответить с цитированием
Старый 28.09.2014, 19:45   #35
Lpa
Резидент клуба
 
Аватар для Lpa
 
Регистрация: 13.06.2012
Сообщений: 327
По умолчанию Re: Формат пакета KEELOQ

Взял декрипт из аппноутов мелкочипа, стало гораздо лучше, 31мС , при этом нет никаких ассемблерных вставок!
Попробую на её основе сделать такой же хороший энкрипт...
Lpa вне форума   Ответить с цитированием
Старый 28.09.2014, 19:48   #36
TailsMD
Banned
 
Регистрация: 29.08.2014
Сообщений: 61
По умолчанию Re: Формат пакета KEELOQ

Ты прав, это был мой затуп) всё работает как положено. Я препутал с переделанными исходниками которые для ccs. Там просто считать 64 бит переменные нельзя, а 32 бита можжно, от алгоритма с трешгейта и была медленная скорость. А так работает всё отлично.
TailsMD вне форума   Ответить с цитированием
Старый 28.09.2014, 21:46   #37
russo_turisto
Резидент клуба
 
Аватар для russo_turisto
 
Регистрация: 21.08.2011
Сообщений: 1,158
По умолчанию Re: Формат пакета KEELOQ

Цитата:
Сообщение от Lpa
Взял декрипт из аппноутов мелкочипа, стало гораздо лучше, 31мС , при этом нет никаких ассемблерных вставок!
Попробую на её основе сделать такой же хороший энкрипт...

А если манов несколько десятков, как в брелковых грабах, как там идет поиск нужного мана?
Если 30 манов перебирать то уже около секунды нужно?
russo_turisto вне форума   Ответить с цитированием
Старый 28.09.2014, 22:32   #38
Lpa
Резидент клуба
 
Аватар для Lpa
 
Регистрация: 13.06.2012
Сообщений: 327
По умолчанию Re: Формат пакета KEELOQ

Так это при частоте 4МГц, если поставить 8, то в 2 раза быстрее будет, да и не факт, что это наиболее оптимальная функция. Может, у кого то и быстрее есть.
Мне то нужно всего лишь для 1-2 мануфактурников, так что пойдет.
А поиск нужного мана скорее всего перебором и идет, по очереди расшифровываем и сравниваем коды кнопок...

Добавлено через 4 минуты
P.S. Сама функция:
Код:
#define BIT_TEST( b, n) (( (b) & (1<<(n))) != 0)

volatile unsigned char DKEY[8];
volatile unsigned char Buffer[4];

void KeeLoq_Decrypt(void)
{
    unsigned char  i, j, key;
	signed char p;
	unsigned char keep, aux;		// temporarily hold nibble swap data

    p = 1;

    for (j=66; j>0; j--)     // was 66
    {
        key = DKEY[p--];
        if ( p < 0)
            p += 8;
        for (i=8; i>0; i--)
        {
            // NLF
            if ( BIT_TEST( Buffer[3],6))
            {
                if ( !BIT_TEST( Buffer[3],1))
                    aux = 0b00111010;   // 10
                else
                    aux = 0b01011100;   // 11
            }
            else
            {
                if ( !BIT_TEST( Buffer[3],1))
                    aux = 0b01110100;   // 00
                else
                    aux = 0b00101110;   // 01
            }


            // move bit in position 7
            if ( BIT_TEST( Buffer[2],3))
			{
//BB - avoiding inline asm if possible... swap low and high
//nibbles contained in aux.  There are probably lots of ways
//to do this.
//                asm("swapf _aux,f");

				// keep holds top 4 bits of aux
				keep = aux >> 4;
				// masks off top bits, which should be 0 anyway
				keep = keep & 0x0f;
				// aux now holds just the ls nibble
				aux = aux & 0x0f;
				// shift ls nibble to ms nibble
				aux = aux << 4;
				// completes the swap
				aux = aux | keep;
			}
            if ( BIT_TEST( Buffer[1],0))
                aux<<=2;
            if (BIT_TEST( Buffer[0],0))
                aux<<=1;

            // xor with Buffer and Dkey
            aux ^= Buffer[1] ^ Buffer[3] ^ key;

            // shift in buffer
		STATUS &= 0xFE;
		Buffer[3] <<= 1;
		if (BIT_TEST(Buffer[2],7))
			Buffer[3] |= 0x01;
		STATUS &= 0xFE;
		Buffer[2] <<=1;
		if (BIT_TEST(Buffer[1],7))
			Buffer[2] |= 0x01;
		STATUS &= 0xFE;
		Buffer[1] <<=1;
		if (BIT_TEST(Buffer[0],7))
			Buffer[1] |= 0x01;
		STATUS &= 0xFE;
		Buffer[0] <<=1;
		if (BIT_TEST(aux,7))
			Buffer[0] |= 0x01;

//  alternative assembly code
//            #asm
//            rlf _aux,w
//            rlf _Buffer,f
//            rlf _Buffer+1,f
//            rlf _Buffer+2,f
//            rlf _Buffer+3,F
//            #endasm

            // rotate Dkey
            key<<=1;
        } // for i
    } // for j
} // decrypt
Lpa вне форума   Ответить с цитированием
Старый 29.09.2014, 00:36   #39
Lpa
Резидент клуба
 
Аватар для Lpa
 
Регистрация: 13.06.2012
Сообщений: 327
По умолчанию Re: Формат пакета KEELOQ

Фуух, сделал энкрипт, работает
Время выполнения 96,7мС при чатоте 4МГц, дольше, чем декрипт, но приемлемо))
Может, кто нибудь подскажет, как сделать так, чтобы было 30мС?

Код:
void KeeLoq_Encrypt(void)
{
    unsigned char  i, j, key;
	signed char p;
	unsigned char keep, aux;		// temporarily hold nibble swap data

    p = 0;

    for (j=66; j>0; j--)     // was 66
    {
        key = DKEY[p++];
        if ( p > 7)
            p = 0;
        for (i=8; i>0; i--)
        {
            // NLF
            if ( BIT_TEST( Buffer[3],7))
            {
                if ( !BIT_TEST( Buffer[3],2))
                    aux = 0b00111010;   // 10
                else
                    aux = 0b01011100;   // 11
            }
            else
            {
                if ( !BIT_TEST( Buffer[3],2))
                    aux = 0b01110100;   // 00
                else
                    aux = 0b00101110;   // 01
            }


            // move bit in position 7
            if ( BIT_TEST( Buffer[2],4))
			{
//BB - avoiding inline asm if possible... swap low and high
//nibbles contained in aux.  There are probably lots of ways
//to do this.
//                asm("swapf _aux,f");

				// keep holds top 4 bits of aux
				keep = aux >> 4;
				// masks off top bits, which should be 0 anyway
				keep = keep & 0x0f;
				// aux now holds just the ls nibble
				aux = aux & 0x0f;
				// shift ls nibble to ms nibble
				aux = aux << 4;
				// completes the swap
				aux = aux | keep;
			}
            if ( BIT_TEST( Buffer[1],1))
                aux<<=2;
            if (BIT_TEST( Buffer[0],1))
                aux<<=1;

            // xor with Buffer and Dkey
            aux ^= (Buffer[2]<<7) ^ (Buffer[0]<<7) ^ (key<<7);

            // shift in buffer
		STATUS &= 0xFE;
		Buffer[0] >>= 1;
		if (BIT_TEST(Buffer[1],0))
			Buffer[0] |= 0x80;
		STATUS &= 0xFE;
		Buffer[1] >>=1;
		if (BIT_TEST(Buffer[2],0))
			Buffer[1] |= 0x80;
		STATUS &= 0xFE;
		Buffer[2] >>=1;
		if (BIT_TEST(Buffer[3],0))
			Buffer[2] |= 0x80;
		STATUS &= 0xFE;
		Buffer[3] >>=1;
		if (BIT_TEST(aux,7))
			Buffer[3] |= 0x80;

//  alternative assembly code
//            #asm
//            rlf _aux,w
//            rlf _Buffer,f
//            rlf _Buffer+1,f
//            rlf _Buffer+2,f
//            rlf _Buffer+3,F
//            #endasm

            // rotate Dkey
            key>>=1;
        } // for i
    } // for j
}
Lpa вне форума   Ответить с цитированием
Старый 29.09.2014, 19:11   #40
ark
Член клуба
 
Регистрация: 24.05.2011
Сообщений: 185
По умолчанию Re: Формат пакета KEELOQ

А как проверял время выполения?
ark вне форума   Ответить с цитированием
Ответ
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.



Текущее время: 07:18. Часовой пояс GMT +3.


vBulletin 4.1.0 Перевод: zCarot
(C) www.phreakerclub.com