Pobierz - Politechnika Poznańska, Wydział Informatyki
Transkrypt
Pobierz - Politechnika Poznańska, Wydział Informatyki
Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska CRC16 05-2016 Zygmunt Kubiak 2 Jeden z przykładów: https://github.com/vinmenn/Crc16 Przykład zawiera bibliotekę metod dla Arduino, do wyznaczania CRC Przykład programu do bezpośredniego wyznaczania CRC16 Program CRC16 // Wielomian generujący (CCITT-16): x^16 + x^12 + x^5 + 1 // w zapisie HEX: 0x11021, // w wersji uproszczonej, wykorzystywanej w programie: 0x1021 word temp; void setup() { Serial.begin(115200); Serial.println(„Test programu CRC-16 CCITT"); Serial.println("============================"); } 05-2016 Zygmunt Kubiak 3 Przykład programu do bezpośredniego wyznaczania CRC16 Program CRC16 cd void loop() { byte data[] = „ Imie Nazwisko"; Serial.println(„Programowe wyznaczanie CRC16"); temp = calcrc((byte*)data, 14); Serial.print("crc = 0x"); Serial.println(temp, HEX); while(true); // blokada cykliczności } 05-2016 Zygmunt Kubiak 4 Przykład programu do bezpośredniego wyznaczania CRC16 Program CRC16 cd word calcrc(byte *ptr, int count) { word crc; char i; crc = 0; while (--count >= 0) { crc = crc ^ (word) *ptr++ << 8; i = 8; do { if (crc & 0x8000) crc = crc << 1 ^ 0x1021; else crc = crc << 1; } while(--i); } return (crc); } 05-2016 Zygmunt Kubiak 5 Przykłady kalkulatorów CRC: http://depa.usst.edu.cn/chenjq/www2/software/crc/CRC_Ja vascript/CRCcalculation.htm lub: http://www.zorc.breitbandkatze.de/crc.html lub np.: http://www.lammertbies.nl/comm/info/crccalculation.html#intr 05-2016 Zygmunt Kubiak 6 AES128 05-2016 Zygmunt Kubiak 7 Skopiować do folderu libraries bibliotekę ze strony: https://github.com/DavyLandman/AESLib Do szkicu dodać: #include <AESLib.h> Biblioteka AESLib zawiera między innymi następujące metody: // Szyfrowanie wielu 128 bitowych bloków danych, data_len podzielne mod 16 // key oraz iv mają długość 128 bitów, tzn. 16 bajtów (typ const uint8_t) void aes128_cbc_enc(const uint8_t* key, const uint8_t* iv, void* data, const uint16_t data_len); // Szyfrowanie pojedynczego bloku 128 bitów, tzn. 16 bajtów (typ uint8_t) // Klucz oraz ma długość 128 bitów, tzn. 16 bajtów (typ const uint8_t) void aes128_enc_single(const uint8_t* key, void* data); 05-2016 Zygmunt Kubiak 8 // Deszyfrowanie wielu 128 bitowych bloków danych, data_len podzielne mod 16 // key oraz iv mają długość 128 bitów, tzn. 16 bajtów (typ const uint8_t) void aes128_cbc_dec(const uint8_t* key, const uint8_t* iv, void* data, const uint16_t data_len); // Deszyfrowanie pojedynczego bloku 128 bitów, tzn. 16 bajtów (typ uint8_t) // Klucz oraz ma długość 128 bitów, tzn. 16 bajtów (typ const uint8_t) void aes128_dec_single(const uint8_t* key, void* data); 05-2016 Zygmunt Kubiak 9 Przykład użycia biblioteki AESLib #include <AESLib.h> void setup() { Serial.begin(11520); } void loop() { uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; char data[] = "**Imie Nazwisko*"; //16 znaków == 16 bajtów aes128_enc_single(key, data); Serial.print("Blok zaszyfrowany:"); Serial.println(data); aes128_dec_single(key, data); Serial.print("Blok rozszyfrowany:"); Serial.println(data); delay(15000); // czas powtarzania } 05-2016 Zygmunt Kubiak 10 Dziękuję Zygmunt Kubiak 11 09200 6