roboforum.ru

Технический форум по робототехнике.


Автомобильные брелки Keeloq с пользой для дела :)

Модераторы: 1970DenisT, Dmitry__

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Dmitry__ » 11 ноя 2015, 16:23

HEMETC писал(а):Для чего: к декодеру ехать далеко (ну или в лом), прописанный ранее брелок утерян/ушатан, пользователю дается новый брелок с нужным ману-кодом и сообщается инструкция по прописке (самовывоз типа)

Ну, убедительно. Уж не на коммерцию ставите? :)
Но ТЗ пока сырое, нужно хорошо проанализировать, виртуально пожить с этим алгоритмом. Например, не будут слетать все брелки при включении питания и шаловливых ручках? Добавление такого функционала - не пора переходить на пики с большим колич. пинов? Или есть какая-то привязка к текущей печатной плате?

HEMETC писал(а):Правда, если никому, кроме меня, не нать, то и ладно, переживем.
Мож на чо-нить более полезное та треть флэша сгодится

Да неееее, намана, пиар наше фффсе!. За пиар можно даже на жену с ребенком забить на пару дней :crazy:
Я уже так сто раз делал :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение HEMETC » 11 ноя 2015, 23:09

До коммерции еще как до луны :) Да друган в области живет, просит иногда тех. помощи электронной...
В общем, тож пиар наверно :)))) Штучно пока, но на всякий назад в будущее гляжу, а то не наездишься туда, если чо.
Кнопка в моем представлении где-то внутри конечного дивайса, "в случае аварии разбить стекло молотком".
Привязка, в основном, к магазину местному, да и подсел что ли на этот ширпотреб осьминогий...
С утюгом вроде подружился - плата не проблема, но нога-то незаюзанная :)
На данном этапе моего творчества реализованный декодер - идеальный законченный модуль, который присобачивается хоть к чему (грю же - шедевр!)
Само главно - к собственносочиненным поделкам :) Многопин же все равно черным ящиком останется небось, куды их, ноги эти, девать-то, пока не придумал.
Ну лан, пожуем пока виртуально, согласен.
HEMETC
 
Сообщения: 3
Зарегистрирован: 09 ноя 2015, 10:15

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Andrey_T » 27 янв 2016, 12:24

Уважаемые Гуру поправьте меня, если я не прав. Делаю проект на ардуино дешифратора KEELOQ с использованием программатора HCS200 - HCS300 на PIC от Dmitry__
После беглого просмотра исходников программатора понял, что ключ кодирования K1 K2 получается методом нормальной генерации ключа по общеизвестному алгоритму
Код: Выделить всёРазвернуть
SerialNomer&=0x0FFFFFFF;
SerialNomer|=0x20000000;
k1=KeeLoq_Decrypt(SerialNomer, manufak);
SerialNomer&=0x0FFFFFFF;
SerialNomer|=0x60000000;
k1=KeeLoq_Decrypt(SerialNomer, manufak);

при этом дискриминатор равен нулю.
в декодере нужно будет после определения серийного номера брелка и проверки на свой-чужой выполнять такой же код для вычисления ключа дешифрования перед расшифровкой пакета. После расшифровки полученным ключом проверяем получившийся дискриминант на ноль и совпадение статуса кнопок в открытой и зашифрованной части принятого кода.
Andrey_T
 
Сообщения: 4
Зарегистрирован: 25 янв 2016, 14:57
Откуда: Краснодарский край
прог. языки: Delphi
ФИО: Андрей

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Dmitry__ » 28 янв 2016, 03:04

Все правильно, дискриминатору можешь назначать свое любое значение. Ноль используют сигналки мангуст :D
Еще надо проверять "16-bit Sync Value" на окно валидности (например в 200 нажатий) чтоб не попасть на срабатывание от старых кодов записанных граббером. Каждое нажатие на кнопку брелка - увеличение этого счетчика.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Andrey_T » 28 янв 2016, 09:44

Мысли сейчас такие: чтобы сильно не заморачиваться, после включении питания декодера при первом использовании каждого брелка происходит автоматическая синхронизация и вычисление ключа шифрования для данного брелка с запоминанием,то есть в первый раз счетчики синхронизации не сравниваются а значение текущего счетчика брелка записывается в массив, так же записывается в массив вычисленное значение ключа шифрования для данного брелка. В следующие разы для этого брелка происходит расшифровка кода по уже вычисленному ключу шифрования и проверка на окно валидности (берем значения из массива).
Кстати проверил на скорость на Arduino Uno алгоритм дешифрования - получается около 31 миллисекунды.
Andrey_T
 
Сообщения: 4
Зарегистрирован: 25 янв 2016, 14:57
Откуда: Краснодарский край
прог. языки: Delphi
ФИО: Андрей

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Andrey_T » 02 фев 2016, 23:30

Итак, выкладываю скетч для ардуино приема и дешифровки брелков. Основан на исходниках приема пакета KEELOQ отсюда http://arduino.ru/forum/apparatnye-voprosy/biblioteka-chteniya-id-brelkov-signalizatsiii-hcs301-keeloq и функции дешифрования отсюда https://github.com/RobTillaart/Arduino-1/commit/329d451886eab4fc1257812b70ec2d243d6c9510
Код: Выделить всёРазвернуть
#define KeeLoq_NLF              0x3A5C742EUL
#define ManufacLow   0x89ABCDEF  //мануфактурный код младшие разряды
#define ManufacHigh  0x01234567  //мануфактурный код старшие разряды
#define ValidWindow  256         //окно валидности счетчика синхронизации
word MyCointer[10]={0,0,0,0,0,0,0,0,0,0}; //Счетчики синхронизации брелков
unsigned long KeyHigh[10]; //Ключи шифрования для каждого брелка (старшие разряды)
unsigned long KeyLow[10];  //Ключи шифрования для каждого брелка (младшие разряды)
unsigned long MySerialNum[10]={1,2,3,4,5,6,7,8,9,10}; //Серийные номера моих брелков

// Радиобрелки ///////////////////////////////////////////////////////////////////////////////////////
#define HCS_RECIEVER_PIN  2    // пин к которому подключен приемник для брелков

class HCS301 {
public:
   unsigned BattaryLow : 1;  // На брелке села батарейка
   unsigned Repeat : 1; // повторная посылка
   unsigned BtnNoSound : 1;
   unsigned BtnOpen : 1;
   unsigned BtnClose : 1;
   unsigned BtnRing : 1;
   unsigned long SerialNum;
   unsigned long Encript;

   void print();
};

volatile boolean   HCS_Listening = true;      
byte            HCS_preamble_count = 0;
uint32_t         HCS_last_change = 0;
//uint32_t         HCS_start_preamble = 0;
uint8_t            HCS_bit_counter;            // счетчик считанных бит данных
uint8_t            HCS_bit_array[66];            // массив считанных бит данных
#define            HCS_TE      400               // типичная длительность имульса Te
#define            HCS_Te2_3   600               // HCS_TE * 3 / 2

HCS301 hcs301;


void setup()
{
   Serial.begin(9600);

   // Брелки
   pinMode(HCS_RECIEVER_PIN, INPUT);
   attachInterrupt(0, HCS_interrupt, CHANGE);

   Serial.println("Setup OK");
}

unsigned long Keeloqdecrypt(unsigned long data, unsigned long keyHigh, unsigned long keyLow)
{
  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;
}

byte ReadKeeloq()
{
  byte i=0;
  byte btn=0;
  byte btndecrypt;
  unsigned long decrypt=0;
  unsigned long cointer=0;
  word cointer_=0;
  unsigned long TempSerNum=0;
  unsigned long diskriminant;
  boolean MyBrelok = false;
  if(HCS_Listening == false)
   {
     HCS301 msg;
     memcpy(&msg,&hcs301,sizeof(HCS301));
     //Serial.println(String("KeyFb#")+String(msg.SerialNum));
     msg.print();
     for (i = 0; i < 10; i++)
     {
      if (msg.SerialNum==MySerialNum[i])  //Если номер свой
         {
          if (MyCointer[i]==0)   //Если счетчик для этого брелка равен 0
           { //расчитываем ключи шифрования
             TempSerNum=msg.SerialNum;
             TempSerNum&=0x0FFFFFFF;
             TempSerNum|=0x20000000;
             KeyLow[i] =Keeloqdecrypt(TempSerNum,ManufacHigh,ManufacLow);
             TempSerNum&=0x0FFFFFFF;
             TempSerNum|=0x60000000;
             KeyHigh[i]=Keeloqdecrypt(TempSerNum,ManufacHigh,ManufacLow);
           }
          decrypt=Keeloqdecrypt(msg.Encript,KeyHigh[i],KeyLow[i]); //Дешифруем закрытую часть кода
          Serial.println(String("Dcrypt HEX#")+String(decrypt,HEX));
          diskriminant=decrypt&0x03FF0000;
          diskriminant=diskriminant>>16;
          Serial.println(String("Diskriminant#")+String(diskriminant));
          if (diskriminant==0)
           {
               //вычисление принятого счетчика синхронизации
            cointer_=word(decrypt&0x0000FFFF);
            Serial.println(String("MyCointer#")+String(MyCointer[i]));
            Serial.println(String("Cointer#")+String(cointer_));
            if (MyCointer[i]==0) {MyCointer[i]=cointer_;MyBrelok=true;} //если брелок используется в первый раз, то синхронизируемся, Иначе проверка на валиднось счетчика
            else {if (cointer_-MyCointer[i]<ValidWindow){MyCointer[i]=cointer_;MyBrelok=true;}}
            if (MyBrelok)
            {
          if (msg.BtnRing == 1) btn += 1;
               if (msg.BtnClose == 1) btn += 2;
          if (msg.BtnOpen == 1) btn += 4;
          if (msg.BtnNoSound == 1) btn += 8;
               Serial.println(String("Button_free#")+String(btn));
               btndecrypt=byte(decrypt>>28);
               if (btndecrypt!=btn){btn=0;}
               Serial.println(String("Button_decrypt#")+String(btndecrypt));
             } 
          }
         break;   
        } 
     }
      // включаем слушанье брелков снова
     HCS_Listening = true;
    }
      //Serial.println(String("KeyFb#")+String(msg.SerialNum));
    return btn;
}






void loop()
{
  byte readkeeloq=ReadKeeloq();
if (readkeeloq !=0){Serial.println(readkeeloq);}
}

// Функции класса  HCS301 для чтения брелков
void HCS301::print(){
   String btn;

   if (BtnRing == 1) btn += "Ring";
   if (BtnClose == 1) btn += "Close";
   if (BtnOpen == 1) btn += "Open";
   if (BtnNoSound == 1) btn += "NoSound";

   String it2;
   it2 += "Encript ";
   it2 += Encript;
   it2 += " Serial ";
   it2 += SerialNum;
   it2 += " ";
   it2 += btn;
   it2 += " BattaryLow=";
   it2 += BattaryLow;
   it2 += " Rep=";
   it2 += Repeat;

   Serial.println(it2);

}

void HCS_interrupt(){

   if(HCS_Listening == false){
      return;
   }

   uint32_t cur_timestamp = micros();
   uint8_t  cur_status = digitalRead(HCS_RECIEVER_PIN);
   uint32_t pulse_duration = cur_timestamp - HCS_last_change;
   HCS_last_change         = cur_timestamp;

   // ловим преамбулу
   if(HCS_preamble_count < 12){
      if(cur_status == HIGH){
         if( ((pulse_duration > 150) && (pulse_duration < 500)) || HCS_preamble_count == 0){
            // начало импульса преамбулы
            //if(HCS_preamble_count == 0){
            //   HCS_start_preamble = cur_timestamp; // Отметим время старта преамбулы
            //}
         } else {
            // поймали какую то фигню, неправильная пауза между импульсами
            HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
            goto exit;

         }
      } else {
         // конец импульса преамбулы
         if((pulse_duration > 300) && (pulse_duration < 600)){
            // поймали импульс преамбулы
            HCS_preamble_count ++;
            if(HCS_preamble_count == 12){
               // словили преамбулу
               //HCS_Te = (cur_timestamp - HCS_start_preamble) / 23;  // вычисляем длительность базового импульса Te
               //HCS_Te2_3 = HCS_Te * 3 / 2;
               HCS_bit_counter = 0;
               goto exit;
            }
         } else {
            // поймали какую то фигню
            HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы
            goto exit;
         }
      }
   }
   

   // ловим данные
   if(HCS_preamble_count == 12){
      if(cur_status == HIGH){
         if(((pulse_duration > 250) && (pulse_duration < 900)) || HCS_bit_counter == 0){
            // начало импульса данных
         } else {
            // неправильная пауза между импульсами
            HCS_preamble_count = 0;
            goto exit;
         }
      } else {
         // конец импульса данных
         if((pulse_duration > 250) && (pulse_duration < 900)){
            HCS_bit_array[65 - HCS_bit_counter] = (pulse_duration > HCS_Te2_3) ? 0 : 1; // импульс больше, чем половина от Те * 3 поймали 0, иначе 1
            HCS_bit_counter++;   
            if(HCS_bit_counter == 66){
               // поймали все биты данных
            
               HCS_Listening = false;   // отключем прослушку приемника, отправляем пойманные данные на обработку
               HCS_preamble_count = 0; // сбрасываем счетчик пойманных импульсов преамбулы

               hcs301.Repeat = HCS_bit_array[0];
               hcs301.BattaryLow = HCS_bit_array[1];
               hcs301.BtnNoSound = HCS_bit_array[2];
               hcs301.BtnOpen = HCS_bit_array[3];
               hcs301.BtnClose = HCS_bit_array[4];
               hcs301.BtnRing = HCS_bit_array[5];

               hcs301.SerialNum = 0;
               for(int i = 6; i < 34;i++){
                  hcs301.SerialNum = (hcs301.SerialNum << 1) + HCS_bit_array[i];
               };

               uint32_t Encript = 0;
               for(int i = 34; i < 66;i++){
                   Encript = (Encript << 1) + HCS_bit_array[i];
               };
               hcs301.Encript = Encript;
            }
         } else {
            // поймали хрень какую то, отключаемся
            HCS_preamble_count = 0;
            goto exit;
         }
      }
   }
   
   exit:;

}

В скетче функция ReadKeeloq() возвращает 0 если ничего не принято или принят сигнал от чужих брелков или выдает число от 1 до 15 (четыре бита нажатых кнопок) Отладочные принты убирать не стал.
Andrey_T
 
Сообщения: 4
Зарегистрирован: 25 янв 2016, 14:57
Откуда: Краснодарский край
прог. языки: Delphi
ФИО: Андрей

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение dccharacter » 03 фев 2016, 01:32

А что за брелки-то, стесняюсь спросить? Какие-то конкретные, или некие, или неопределенный круг брелков?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Andrey_T » 03 фев 2016, 14:32

Брелки те, что указаны в первом посте то есть которые содержат чипы: HCS200, HCS300, HCS301, перешитые программатором тоже из первого поста. Отбирал просто: пришел в автосервис по установки сигнализаций с ноутбуком и ардуиной с приемником и отобрал из большой кучи те, от которых ардуина смогла принять пакет.
Andrey_T
 
Сообщения: 4
Зарегистрирован: 25 янв 2016, 14:57
Откуда: Краснодарский край
прог. языки: Delphi
ФИО: Андрей

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Dmitry__ » 03 фев 2016, 22:52

Andrey_T писал(а):Итак, выкладываю скетч для ардуино приема и дешифровки брелков.

Хорошее дело. У меня тоже какие-то были запилы под дуину. Может чего еще и поделаю на них, уж больно ценник вкусный - по 100р за arduino mini. Прям убийца новых разработок всяких дешевых арм :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Busy » 08 мар 2016, 11:33

Andrey_T писал(а):Итак, выкладываю скетч для ардуино приема и дешифровки брелков. Основан на исходниках приема пакета KEELOQ

Привет, Arduino Uno на базе процессора ATmega328p использовал, если 31 милисек. время обработки была?
Busy
 
Сообщения: 58
Зарегистрирован: 11 мар 2013, 18:26

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Omega » 29 июн 2016, 14:02

Приветствую!
Собрал программатор с 1й странице, тот, что 675м пике. Пробовал прошить им HCS300 (2 штуки). Не прошилось! Прошу помощи в расследовании!
Собрал на Ардуиновской макетке. Записал от 4х Вольт и пик и HCS, может в этом дело?
При подаче питания (не зависимо есть ли HCSка или ее нет) свтодиод мигает (12 или 13 раз, не помню), потом пауза и по новой. Если начать кнопку "prog key" светодиод тухнет. Честко сказать не знаю как долго ждать программирования и как должна работать световая индикация. ПОдскажите кто знает.

Схема (надеюсь я верно понял описанное в исходнике)такая:
pic12f675:
1- +5V
2- через 1К кнопка, подтянута к + питания
3- светодиод, чрез 1К на "-"питания
4- через 3.6к подтянуто на + питания
5- на 3й пин HCS
6- на 6й HCS
7- через 10 Ом на 8й пин HCS
9- минус питания.

Проверял прошилось или нет так: впаял обратно в брелок, удерживаю нажатой кнопку -через примерно 28секунд передача отключается (гаснет мигающий в брелке светодиод). На сколько я знаю, в той прошивке, которую выкладывал автор НЕ задействован таймер на передачу. Соответственно косвенно могу понять, что не прошилось.
Omega
 
Сообщения: 10
Зарегистрирован: 14 июл 2009, 08:00

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Dmitry__ » 29 июн 2016, 15:52

Ну вроде все правильно. Уточнение: Кнопка одним пином должна быть на землю, 2-м на GP5, который еще подтянут резистором к + питания. Мигать светодиод не должен. Проверяй схему.
Omega писал(а):9- минус питания.

8 пин - земля, pic 8-ми ногий.
Omega писал(а):Собрал на Ардуиновской макетке. Записал от 4х Вольт и пик и HCS, может в этом дело?

Вот этого я не понял, что за программатор на ардуиновской макетке? 1-й раз лучше не экспериментировать с 4 вольтами, когда все будет работать от стандартного питания, тогда можно и химичить.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Omega » 29 июн 2016, 16:32

8 пин - земля, pic 8-ми ногий.

Опечатался, конечно же на 8й пин.

А вот по поводу попробовать от 5 Вольт- вечером проверю, отпишусь. Как я понял из мануала на HCS она от 4.5 до 5.5В

Но меня так же интересует вопросы:
1) как должен сигнализировать светодиод о программировании (мигать/не мигать, сколько раз и тд), что бы быть уверенным, что программирование завершилось.
2) правильно ли я подключил (соединения описал в предыдущем сообщении).
Спасибо.
Omega
 
Сообщения: 10
Зарегистрирован: 14 июл 2009, 08:00

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Dmitry__ » 29 июн 2016, 20:59

Omega писал(а):1) как должен сигнализировать светодиод о программировании (мигать/не мигать, сколько раз и тд), что бы быть уверенным, что программирование завершилось.

При включении питания, светодиод должен моргнуть 1 раз, дальше ожидание нажатия кнопки. Если нажать кнопку без подкл. к hcs, то будет ошибка и светодиод моргнет 20 раз.
Скорее всего у тебя все время нажата кнопка. При вкл. питания в таком режиме должно быть так: 1 раз моргнет, пауза, а потом 20 вспышек.
Omega писал(а):2) правильно ли я подключил (соединения описал в предыдущем сообщении).

А я ответил :)
Dmitry__ писал(а):Ну вроде все правильно.
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Автомобильные брелки Keeloq с пользой для дела :)

Сообщение Omega » 30 июн 2016, 16:12

Вчера вечером провел повторный эксперимент, Ваше сообщение прочитал только сегодня.
В общем подал 5 Вольт, пробовал перешить (использовался 675й пик)-не прошилась.
Скомпилил код с 1й странице под 84й пик- включаю, один раз мигнул. Нажал кнопку- начал мигать постоянно. Подождал полминуты- отпустил кнопку...подождал секунд 10, выключил питание. Опять не прошилось.
Возможно HCS301 плохо придавлена к макетке (использовал канцелярскую прищепку из пружинящей сталюки, черные такие). Но хоть раз (причем ода чипа)из нескольких попыток должно же было прошиться.

Вопросы:
1) Если долго удерживал кнопку (я не знал, что нужно кратковременно ее жать) а потом отпустил, все равно же прошилось бы, верно?
2) Сколько времени ждать окончания процесса прошития? Я так понял светодиод об окончании прошивки не уведомит :(

PS: то, что не прошилось могу судить косвенно (как ранее писал)по тому, что HCSка впаянная после прошития в родной брелок- через 28 сек перестает мигать светодиодом передачи.

PPS: вероятно нужно поставить какой-нить анализатор и по эфиру смотреть какой серийник передается. Ну или код (не силен в кейлоке).
Omega
 
Сообщения: 10
Зарегистрирован: 14 июл 2009, 08:00

Пред.След.

Вернуться в КиберЗона - клуб боевых роботов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron