Шифрование в Arduino
- Войдите на сайт для отправки комментариев
Сб, 25/01/2020 - 16:03
Всем привет, ардуинщики!
Скажите, есть ли проекты по анализу блочных видов шифрования с использованием Arduino? (Модель IoT)
Всем привет, ардуинщики!
Скажите, есть ли проекты по анализу блочных видов шифрования с использованием Arduino? (Модель IoT)
Нет такой модели. И нет никакой причины, кроме мазохизма, анализировать шифры на слабом железе.
А на Raspberry?
Анализировать с точки зрения переданного блока данных за определенное время или потребляемой электроэнергии
А на Raspberry?
Мне повторить? Нет никакой причины, кроме мазохизма, анализировать шифры на слабом железе.
Анализировать с точки зрения переданного блока данных за определенное время или потребляемой электроэнергии
Что это значит? Если мне надо узнать, сколько данных передается за определенное время, я беру калькулятор и считаю. Если мне надо измерить электричество, я беру ваттметр и измеряю. Никаких ПРОЕКТОВ тут не надо.
Анализировать с точки зрения переданного блока данных за определенное время или потребляемой электроэнергии
Все слова понял, смысла фразы - нет.
Что с чем сравнивается и по каким критериям оценивается?
Я имею ввиду по примеру данной статьи: https://pdfs.semanticscholar.org/c73f/c9be94f2a70b07fbcfa31649179fb680f5b9.pdf?_ga=2.217363606.1276740591.1579956298-1625339107.1579956298
..Правда в ней используется Raspberry.
В "стандартной ардуине" с МК типа ATMega328 нет никаких кластеров ядер, подключающихся при необходимости крипто-сопроцессоров и "коробочных" режимов понижения частот при бездействии. Она всегда молотит с практически одним и тем же энергопотреблением. Так что единственная оценка тут - длительность процедуры шифровки/дешифровки помноженная на константу в микроваттах (или в чём хотите измерять затраты).
Никакого анализа на малине там не происходит. Это просто подопытный образец. Всё, что там происходит - измерения ваттметром и секундомером.
Короче сравнение разных алгоритмов шифрования на Arduino дело лишнее.
Это всё для диплома я спрашиваю. Может что реализовать можно было бы.
Это всё для диплома я спрашиваю. Может что реализовать можно было бы.
...похоже диплом - это первый момент, когда дипломник начинает интересоваться. что ж он такое изучал несколько лет.
Я сетевик(инженер проводных каналов связи), по приборостроению и микроконтроллерам у нас мало было дисциплин, к сожалению.
Нет, не лишнее. Если хочется написать об этом диплом, то это вполне нормально. Только вот не надо сравнение алгоритмов называть анализом шифров. И не надо ждать, что будет что-то готовое на блюдечке.
Да мне готовое не надо. Главное навести на по-настоящему нужную проблему. И разобрать варианты решения этой проблемы. В данном случае, не зная толком микроконтроллеры Arduino, спрашиваю у Вас, знающих. Реально ли провести, например, эксперимент с двумя ардуинками с модулями приемо-передачи и сравнить параметры работы нескольких алгоритмов шифрования.
Эксперимент провести - реально, но есть ли в этом смысл - вопрос на миллион.
По-настоящему нужной проблемы тут нет, ибо никто не делает на ардуино настолько масштабные вещи, чтобы микроватты разницы что-то решали. С другой стороны, ожидать, что диплом прям реально позитивный вклад в мир внесет - наивно.
Посеяли тоску и сомнения:D
Посеяли тоску и сомнения:D
Подскажите, можно ли подключить к микроконтроллеру модуль приемо-передачи и работать с уровнем шифрованием или логика шифрования канала между двумя модулями жестко прошита?
Вопросы у Вас, что не знаешь как ответить
... И так можно и сяк. "Модулей" для ардуино >1 разновидности.
Подскажите, можно ли подключить к микроконтроллеру модуль приемо-передачи и работать с уровнем шифрованием или логика шифрования канала между двумя модулями жестко прошита?
CC430 5-ой серии в помощь. Там всё в одном.
у Core i9 встроенный AES.
Даже если в модуле уже есть шифрование, то ничто не мешает зашифровать еще раз в мк.
На Raspberry Pi 3 лучше реализовывать?
UM1924. User manual. STM32 crypto library. ST, 2015
Почитайте по английски. Сертифицированные библиотеки. На программном и аппаратном уровне. Для МК.
Объясните пожалуйста, на каком это уровне идёт шифрование? Шифруются передача данных внутри платы? Или в дальнейшем для передачи по разным каналам?
Что почитать более фундаментального, чтобы понять на каком уровне всё это происходит?
Что почитать более фундаментального, чтобы понять на каком уровне всё это происходит?
Для начала, закончить ВУЗ по спицальности "Защита информации"
Если закончил по специальности " Системы связи", то всё плохо?
тогда у тебя был минимум семестр по теории защиты передаваемых данных.
Объясните пожалуйста, на каком это уровне идёт шифрование? Шифруются передача данных внутри платы? Или в дальнейшем для передачи по разным каналам?
Что почитать более фундаментального, чтобы понять на каком уровне всё это происходит?
Как сделаешь - так и будет. Никакого стандарта нет.
Код загрузили - и смотрит за какое время передает на другое устройство?
Причём тут передаёт. Смотри время, затраченое на шифрование и/или дешифровку блока данных. Передача не показатель, там от канала связи ещё будет зависть. Вообще мысль взять криптолиб и скомпилировать DES для ардуины периодически посещает меня. Даже знаю зачем - получить прозрачную, без закладок, бекдоров и др. уязвимостей криптосистему обмена сообщениями. Тока незнаю зачем оно лично мне:-) Думаю на des ресурсов хватит. А значить и на 3des. Ассиметричные алгоритмы кроме генерации ключа тоже возможно потянет. Так что пробуйте.
не вынесла душа поэта. Попробовал. Источник вдохновения - http://www.proteus2001.narod.ru/crypt/index.html
typedef unsigned char byte; typedef unsigned int uint; class DES{ void inital_key(const char key[64],char ekey[16][48],bool is_crypt); //!< подготовка ключа void round_(char l[32],char r[32],const char ekey[48]); //!< раунд шифра void permute(const char *in,char *out,const int table,uint size); //!< табличная подстановка void lshift(char [28],uint step); //!< циклический сдвиг массива void xor_(const char *in1,const char *in2,char *out,uint size); //!< xor двух массивов void work(const char in[64],char out[64],const char key[64],bool is_crypt); void str_to_key(const byte str[7],byte key[8]); //!< конвертируем 7 байтный ключ в 8 public: void crypt_block(const byte in[8],byte out[8],const byte key[8],bool is_crypt); void lm_hash(const byte in[7],byte out[8]); }; namespace _DES{ const byte PROGMEM perm1[56] = { 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 }; const byte PROGMEM perm2[48] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; const byte PROGMEM perm3[64] = { 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, 56, 48, 40, 32, 24, 16, 8, 0, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6 }; const byte PROGMEM perm4[48] = { 31, 0, 1, 2, 3, 4, 3, 4, 5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 11, 12, 13, 14, 15, 16, 15, 16, 17, 18, 19, 20, 19, 20, 21, 22, 23, 24, 23, 24, 25, 26, 27, 28, 27, 28, 29, 30, 31, 0 }; const byte PROGMEM perm5[32] = { 15, 6, 19, 20, 28, 11, 27, 16, 0, 14, 22, 25, 4, 17, 30, 9, 1, 7, 23, 13, 31, 26, 2, 8, 18, 12, 29, 5, 21, 10, 3, 24 }; const byte PROGMEM perm6[64] ={ // изменено! 7, 39, 15, 47, 23, 55, 31, 63, 6, 38, 14, 46, 22, 54, 30, 62, 5, 37, 13, 45, 21, 53, 29, 61, 4, 36, 12, 44, 20, 52, 28, 60, 3, 35, 11, 43, 19, 51, 27, 59, 2, 34, 10, 42, 18, 50, 26, 58, 1, 33, 9, 41, 17, 49, 25, 57, 0, 32, 8, 40, 16, 48, 24, 56 }; const byte sc[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}; const byte PROGMEM sbox[8][4][16] = { {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7}, {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8}, {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0}, {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}}, {{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10}, {3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5}, {0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15}, {13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9}}, {{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8}, {13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1}, {13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7}, {1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12}}, {{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15}, {13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9}, {10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4}, {3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14}}, {{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9}, {14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6}, {4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14}, {11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3}}, {{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11}, {10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8}, {9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6}, {4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13}}, {{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1}, {13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6}, {1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2}, {6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12}}, {{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7}, {1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2}, {7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8}, {2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}}}; } void DES::permute(const char *in,char *out,const int table,uint size) { for(uint n=0; n<size; n++) out[n]=in[pgm_read_byte(table+n)]; } //! \param step размер сдвига void DES::lshift(char array[28],uint step) { char buff[28]; // конешно надо без лишнего буфера (всё только для наглядности) for(uint n=0; n<28; n++) buff[n]=array[(n+step)%28]; memcpy(array,buff,28); } void DES::xor_(const char *in1,const char *in2,char *out,uint size) { for(uint n=0; n<size; n++) out[n]=in1[n]^in2[n]; } // Triple DES (3DES) будет отличаться от DES, только процерудой подготовки ключа и числом раундов void DES::inital_key(const char key[64],char ekey[16][48],bool is_crypt) { union{ char pkey[56]; struct{char l[28],r[28];}; } a; permute(key,a.pkey,_DES::perm1,56); // готовим ключ for(uint n=0; n<16; n++) { lshift(a.l,_DES::sc[n]); lshift(a.r,_DES::sc[n]); permute(a.pkey,ekey[is_crypt?n:15-n],_DES::perm2,48); } } void DES::round_(char l[32],char r[32],const char ekey[48]) { uint x,y; char erk[48],b[8][6],cb[32],pcb[32]; permute(r,erk,_DES::perm4,48); xor_(erk,ekey,erk,48); for(y=0; y<8; y++) for(x=0; x<6; x++) b[y][x]=erk[y*6+x]; for(y=0; y<8; y++) { uint i=(b[y][0]<<1)| b[y][5]; uint j=(b[y][1]<<3)|(b[y][2]<<2)|(b[y][3]<<1)|b[y][4]; for(x=0; x<4; x++) b[y][x]=(/*_DES::sbox[y][i][j]*/ pgm_read_byte((int)_DES::sbox+j+i*16+y*16*4) & (1<<(3-x)))?1:0; } for(y=0; y<8; y++) for(x=0; x<4; x++) cb[y*4+x]=b[y][x]; permute(cb,pcb,_DES::perm5,32); xor_(l,pcb,l,32); } void DES::work(const char in[64],char out[64],const char key[64],bool is_crypt) { char ekey[16][48]; // подготовленный ключ union{ // левый и правый блок (сети Фейстеля) char pin[64]; struct{char l[32],r[32];}; } a; inital_key(key,ekey,is_crypt); permute(in,a.pin,_DES::perm3,64); for(uint n=0; n<16;) round_(a.l,a.r,ekey[n++]),round_(a.r,a.l,ekey[n++]); // после последнего раунда блоки l,r надо поменять местами // я не стал... просто поменял _DES::perm6, чтобы она это учитывала permute(a.pin,out,_DES::perm6,64); } void DES::str_to_key(const byte str[7],byte key[8]) { for(uint n=1; n<=6; n++) key[n]=(str[n-1]<<(8-n))|(str[n]>>n); key[0]=str[0]; key[7]=str[6]<<1; } void DES::crypt_block(const byte in[8],byte out[8],const byte key[7],bool is_crypt) { uint n; byte keym[8]; char outb[64],inb[64],keyb[64]; str_to_key(key,keym); for(n=0; n<64; n++) { inb [n]=!!(in [n/8]&(0x80>>(n%8))); keyb[n]=!!(keym[n/8]&(0x80>>(n%8))); //outb[n]=0; } work(inb,outb,keyb,is_crypt); memset(out,0,8); for(n=0; n<64; n++) if(outb[n]) out[n/8]|=(0x80>>(n%8)); } void DES::lm_hash(const byte in[8],byte out[8]) { crypt_block((byte*)"KGS!@#$%",out,in,true); } void setup() { // put your setup code here, to run once: Serial.begin(115200); } byte res1[8],res2[8]; byte dataDES[]="qwertyop"; byte pass[]="12345678"; DES des; void loop() { // put your main code here, to run repeatedly: int t; t=micros(); des.crypt_block(dataDES,res1,pass,true); Serial.println((int)micros()-t); t=micros(); des.crypt_block(res1,res2,pass,false); Serial.println((int)micros()-t); //{0x9F,0x4B,0x05,0xE7,0xA3,0xCE,0x4C,0xAD}; for(uint8_t a=0;a<8;a++){Serial.print( res1[a], HEX); Serial.print( " ");} Serial.println(); for(uint8_t a=0;a<8;a++){Serial.print( (char)res2[a]); Serial.print( " ");} Serial.println(); delay(100); }Немного притер, в прогмем вынес.
Ну а на Raspberry такое можно сделать, как думаете?
Ну а на Raspberry такое можно сделать, как думаете?
Можно.
Кто по Расбери шарит, подскажите, это всё в командной строке ОС Linux делается?
Так, например: https://wiki.openssl.org/index.php/Command_Line_Utilities
Так, например: https://wiki.openssl.org/index.php/Command_Line_Utilities
а ты на расбери опенссл с гост 2012 установил?
Так, например: https://wiki.openssl.org/index.php/Command_Line_Utilities
а ты на расбери опенссл с гост 2012 установил?
Вы что, из одного гнезда с ua6em?
То есть пишу код на распбери клиенте, который зашифрует данные передаваемые от неё. После чего передаю по wi-fi каналу, а далее расшифровываю данные, предварительно установив код расшифровки на сервере-шлюзе. Так?
Какие-то варнинги при компиляции:
D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino: In member function 'void DES::inital_key(const char*, char (*)[48], bool)': D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:161:36: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(key,a.pkey,_DES::perm1,56); // готовим ключ ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:165:56: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(a.pkey,ekey[is_crypt?n:15-n],_DES::perm2,48); ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino: In member function 'void DES::round_(char*, char*, const char*)': D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:174:31: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(r,erk,_DES::perm4,48); ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:183:32: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(cb,pcb,_DES::perm5,32); ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino: In member function 'void DES::work(const char*, char*, const char*, bool)': D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:196:34: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(in,a.pin,_DES::perm3,64); ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:200:35: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'int' [-fpermissive] permute(a.pin,out,_DES::perm6,64); ^ D:\ARDUINO\arduino-1.8.9-NEW\portable\sketchbook\AVR\DES_V001\DES_V001.ino:133:6: note: initializing argument 3 of 'void DES::permute(const char*, char*, int, uint)' void DES::permute(const char *in,char *out,const int table,uint size) ^~~а AES не подойдет? когда то находил исходники. не зависящие от платформы, в любой код C можно было добавить.
саму ссылку не найду, файлы остались, могу на почту кинуть.
а AES не подойдет? когда то находил исходники. не зависящие от платформы, в любой код C можно было добавить.
саму ссылку не найду, файлы остались, могу на почту кинуть.
я решил задачу на уровне ХЭШей формируемых из данных и некоторого количества закрытых ключей в рандомном использовании
PS если найдёшь исходники работающие на ESP8266 буду признателен
а AES не подойдет? когда то находил исходники. не зависящие от платформы, в любой код C можно было добавить.
саму ссылку не найду, файлы остались, могу на почту кинуть.
я решил задачу на уровне ХЭШей формируемых из данных и некоторого количества закрытых ключей в рандомном использовании
PS если найдёшь исходники работающие на ESP8266 буду признателен
Дык aes на любом МК работает. Почта куда отправить? Или что поискать?
На работе все, завтра скину.
//Какие-то варнинги при компиляции:
Варнингов спужался ))) Это ж не раздел для новичков!
Забей на них. Это из за несоответствия знакового и беззнакового char при включенном -fpermissive. Если спать не дает - допиши unsigned в третий параметр permute(.
ПС. Под рукой сейчас lgt8f328p. Таки да, он побыстрей немного. При всем том же
мне сиё надобно только под ESP
И что, не работает под ESP? Там конечно PROGMEM не канает, но в общем должно.