Inhaltsverzeichnis:

Sicherheit mit Arduino: Atecc608a - Gunook
Sicherheit mit Arduino: Atecc608a - Gunook

Video: Sicherheit mit Arduino: Atecc608a - Gunook

Video: Sicherheit mit Arduino: Atecc608a - Gunook
Video: Arduino NANO 33 IOT, Getting Started and Explaining Code - Part 1 2024, November
Anonim
Sicherheit mit Arduino: Atecc608a
Sicherheit mit Arduino: Atecc608a
Sicherheit mit Arduino: Atecc608a
Sicherheit mit Arduino: Atecc608a

Thema

Hallo alle zusammen !

Dies ist mein erster Instructables-Artikel, also hoffe ich, dass es für Sie alle interessant sein wird.

In diesem Artikel erkläre ich Ihnen, wie Sie einen Mikrochip namens "ATECC608A" verwenden, der mehrere Sicherheitstools bietet.

Dieser Chip wurde von MicroChip entwickelt und ist die letzte Version des "CryptoAuthentication Chip". Vor dieser Version gab es "ATSHA204A" und "ATECC508A".

Warum habe ich mich entschieden, die letzte Version und nicht die vorherige Version zu verwenden?

Diese Version ist der fortschrittlichste Chip und hat Funktionen, die die alte Version nicht hat (zum Beispiel: AES-Modul, IO-Schutzmodul …).

Warum dieses Projekt?

Ich arbeite im Bereich der CyberSecurity und wie jeder liebte ich Programmierung und Elektronik. Während meines Studiums bekomme ich eine Konferenz mit einem Spezialisten für IoT-Sicherheit, der uns gezeigt hat, dass Industrial Security in seinem IoT-Objekt nicht verwendet. Ich habe uns ein Vorhängeschloss gezeigt, das mit deinem Smartphone per Bluetooth geöffnet werden kann. Auf dem Vorhängeschloss stand ein Satz "Dieses Vorhängeschloss ist am sichersten als ein Schlüsselschloss!". Dieser Satz bringt ihn zum Schmunzeln und er modifiziert den Satz "Dieses Vorhängeschloss ist das schlechteste Vorhängeschloss, das jemals gebaut wurde!".

Er zeigte uns mit seinem eigenen PC und einem Bluetooth-Sniffer, dass jeder vom Smartphone gesendete Befehl jedes Mal gleich ist und es sehr einfach ist, diesen Befehl zu kopieren und mit Ihrem Smartphone zu senden. Er erklärte uns, dass "Sicherheit" für "Industrial" nicht das Hauptproblem ist. Er zeigte uns Chips (weniger als 0,60 $), die diesen Objekten eine Sicherheitsebene verleihen könnten.

Nach dieser Demonstration habe ich versucht, ein Open-Source-Projekt zu finden, das dem IoT-Objekt eine Sicherheitsebene hinzufügt, aber ich habe es nie gefunden.

Also beschloss ich, an einem Projekt zu arbeiten, das Sicherheitsschichten für die Kommunikation zwischen zwei IoT-Objekten verwendet.

Was ist meine Idee?

Während einer Kommunikation zwischen zwei IoT-Objekten kann es mehrere Angriffe geben: Mann der Milde, Kopie von Informationen und mehr.. Meine Idee ist also sehr einfach:

  1. Nutzung verschlüsselter Daten zwischen zwei oder mehr IoT-Objekten.
  2. Kostengünstige Verbrauchsmaterialien
  3. Kann mit einem Arduino UNO arbeiten

Jetzt erkläre ich Ihnen, wie ich dieses abstrakte Bild mit einem Arduino und einem Atecc608a-Chip umgesetzt habe. In diesem Artikel erkläre ich Ihnen, wie Sie das Arduino UNO mit dem ATECC608A verwenden.

Ich werde das nächste Mal einen Artikel über die Kommunikation von zwei Objekten schreiben.

Lieferungen

Für dieses Projekt benötigen Sie ein paar Dinge:

  1. Arduino UNO oder MEGA (Chip muss Atmega 328 oder ATMEGA 2560 sein)
  2. Atecc608A-Chip (Kosten weniger als 0,80 $ pro Stück, leicht auf der Website Ihres Lieferanten zu finden)
  3. 8-Pin-SOIC-Adapter
  4. Einige Drähte und Widerstände

Das Datenblatt der Vorgängerversion dieses Chips (Atecc508a) finden Sie hier -> Datenblatt Atecc508a

Schritt 1: Schritt für Schritt

Schritt für Schritt
Schritt für Schritt

In diesem Artikel zeige ich Ihnen, wie Sie die Konfiguration dieses Chips ändern und anschließend Daten mit dem AES CBC-Algorithmus verschlüsseln.

Wir werden diese Schritte befolgen:

  1. Aufbau der Schaltung
  2. Konfiguration dieses Chips
  3. Verwendung des AES CBC-Moduls
  4. Warum müssen Sie diesen Chip verwenden?

Für jeden Schritt werde ich alles für Sie detailliert beschreiben. Außerdem habe ich meinen Code in meinem Github mit Kommentaren für jede Funktion hinzugefügt. Wenn Sie Fragen zu meinem Code oder diesem Projekt haben, beantworte ich diese gerne.

Mein Github: Mein Github

Schritt 2: Warnung vor dem Atecc608a

Warnung zum Atecc608a
Warnung zum Atecc608a

Der Atecc608a-Chip ist kein "einfacher" Chip.

Erstens steht die Dokumentation dieses Chips unter NDA, so dass Sie sie nicht vollständig im Internet finden. Aber kein Problem dafür, das Datenblatt der Vorgängerversion ist im Internet Datasheet Complete ATECC508A verfügbar.

Zweitens müssen Sie bei Verwendung dieses Chips seine Konfiguration sperren, und es ist unmöglich, die Konfiguration des Chips zu ändern, wenn er gesperrt ist. Seien Sie also vorsichtig, wenn Sie die Konfigurationszone und die Datenzone sperren.

Drittens ist die in C geschriebene Bibliothek sehr groß und vollständig, sodass Sie die Dokumentation der Funktionen, die Sie zuvor verwenden werden, lesen müssen.

Viertens, die Bibliothek, die für diesen Chip geschrieben hat, funktioniert nicht für Arduino UNO, aber sie fügte die Funktionen hinzu, die sie benötigen, um mit Arduino UNO zu arbeiten.

Der Chip ATECC608A

Sie können mit diesem Chip per I2C kommunizieren. Die Adresse dieses Chips kann in der Konfiguration geändert werden.

Dieser Chip enthält 16 verschiedene Steckplätze, die verschiedene Arten von Daten enthalten können:

  1. ECC-Schlüssel (privat oder öffentlich)
  2. AES-Schlüssel
  3. Andere Daten (wie Sha-Hash oder nur Wörter)

In unserem Fall speichern wir den AES-Schlüssel in einem Steckplatz.

Schritt 3: 1. Design der Schaltung

1. Design der Schaltung
1. Design der Schaltung
1. Design der Schaltung
1. Design der Schaltung

1. Aufbau der Schaltung

Das Schema dieser Schaltung ist sehr einfach!

Sie müssen 3,3 V verwenden, da die Empfehlung zwischen 2,0 V und 5,5 V liegt, aber ich habe es vorgezogen, 3,3 V zu verwenden.

Für diesen Chip haben Sie normalerweise einen Punkt an einer Ecke des Chips, dieser Punkt ist der Pin 1 dieser Platine. Ich habe die Draufsicht des Atecc608a mit PIN-Nummer hinzugefügt, da es sich um ein 8-Lead-SOIC handelt und der Chip daher sehr klein ist.

  1. ARDUINO 3.3V -> PIN 8 (Atecc608a)
  2. ARDUINO GND -> PIN 4 (Atecc608a)
  3. ARDUINO A4 (SDL) -> PIN 5 (Atecc608a)
  4. ARDUINO A5 (SCL) -> PIN 6 (Atecc608a)

Sie müssen 3,3 V verwenden, da die Empfehlung zwischen 2,0 V und 5,5 V liegt, aber ich habe es vorgezogen, 3,3 V zu verwenden.

Ich habe die Draufsicht des Atecc608a hinzugefügt, da es sich um ein 8-Lead-SOIC handelt, sodass der Chip sehr klein ist. Wenn Sie es vorziehen, so bauen die Lieferanten einige Platinen mit dem Chip-Lot, es könnte für Sie einfacher sein.

Warnung: In meinem Fall muss ich einen Widerstand zwischen dem SDA des Arduino und dem Chip hinzufügen (auch für den SDL). Ich habe für jeden einen 4,7Kohm-Widerstand hinzugefügt.

Schritt 4: 2. Konfiguration des Chips (Atecc608a)

Bevor Sie die Funktion der Verschlüsselung oder Entschlüsselung verwenden, müssen Sie den Chip konfigurieren. In diesem Schritt werde ich alle Schritte beschreiben, die Sie für die Konfiguration dieses Chips ausführen müssen.

Achtung: Dieser Schritt ist sehr wichtig und wenn Sie die Zonen vor dem Ende sperren, können Sie sie nicht ändern.

Wie bereits erwähnt, hat dieser Chip zwei Zonen:

  1. Konfigurationsbereich
  2. Datenzone

Die Konfigurationszone hat eine Größe von 128 Byte, aber die ersten 16 Byte können nicht geändert werden.

Um diesen Chip zu konfigurieren, müssen Sie diesen Schritt zwei folgen. Es ist sehr wichtig, die einzelnen Schritte der Reihe nach zu befolgen, da sonst Ihre Konfiguration nicht funktioniert und Ihr Chip gesperrt und unbrauchbar wird. Diese Schritte sind:

  1. Erstellen Sie eine Konfigurationsvorlage
  2. Schreiben Sie diese Vorlage auf den Chip
  3. Sperren Sie die Konfigurationszone
  4. Schreiben Sie Ihren AES-Schlüssel (128 Bits) in einen Steckplatz
  5. Sperren Sie die Datenzone

Information

Im Folgenden beschreibe ich jeden Schritt der Konfiguration mit meinem Code, aber keine Sorge, ich habe ein vollständiges Konfigurationsbeispiel in meinem Github hinzugefügt. Ich füge Kommentare zu jeder Funktion hinzu und eine *.ino-Datei ist mit jedem Schritt für Sie verfügbar.

  • Mein Github: Mein Github
  • Pfad der Beispielkonfiguration: configuration_example.ino

Erster Schritt: Erstellen Sie eine Konfigurationsvorlage

Wie bereits erläutert, erhält die Konfigurationszone eine Größe von 128 Bit, die ersten 16 Bit können jedoch nicht geändert werden. Diese Zone besteht aus mehreren Teilen, aber Sie müssen nur 3 Teile dieser Konfigurationszone für dieses Projekt kennen:

  1. Die Bytes 16 -> Dies ist die I2C-Adresse des Chips
  2. Die Bytes 20 bis 51 -> Sie können hier den Typ des Slots für die 16 Slots dieses Chips ändern
  3. Die Bytes 96 bis 127 -> Hier können Sie den Typ des Schlüssels oder der Daten einstellen, die in jedem Steckplatz verwendet werden.

(Wenn Sie mehr über diese Zone erfahren möchten, lesen Sie bitte die Dokumentation (Seite 13, Abschnitt 2.2))

Hier habe ich jedes Byte/Teil der 112 Bytes der Konfiguration eines Chips im Detail angegeben. Dies ist ein Beispiel, jeder gekaufte Chip kann eine andere Konfiguration haben:

0xC0, // I2C-Adresse

0x00, 0x00, 0x00, 0x83, 0x20, // Slot Config Slot 1 0x85, 0x20, // Slot Config Slot 2 0x8F, 0x20, // Slot Config Slot 3 0xC4, 0x8F, // Slot Config Slot 4 0x8F, 0x8F, // Slot Config Slot 5 0x8F, 0x8F, // Slot Config Slot 6 0x9F, 0x8F, // Slot Config Slot 7 0x0F, 0x0F, // Slot Config Slot 8 0x8F, 0x0F, // Slot Config Slot 9 0x8F, 0x0F, // Slot Config Slot 10 0x8F, 0x0F, // Slot Config Slot 11 0x8F, 0x0F, // Slot Config Slot 12 0x8F, 0x0F, // Slot Config Slot 13 0x00, 0x00, // Slot Config Slot 14 0x00, 0x00, // Slot Config Slot 15 0xAF, 0x8F, // Slot Config Slot 16 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0 0x00, 0x00, 0x33, 0x00, // Key Config Slot 1 0x33, 0x00, // Key Config Slot 2 0x33, 0x00, // Key Config Slot 3 0x1C, 0x00, // Key Config Slot 4 0x1C, 0x00, // Key Config Slot 5 0x 1C, 0x00, // Key Config Slot 6 0x1C, 0x00, // Key Config Slot 7 0x3C, 0x00, // Key Config Slot 8 0x1A, 0x00, // Key Config Slot 9 0x3A, 0x00, // Key Config Slot 10 0x1A, 0x00, // Key Config Slot 11 0x3A, 0x00, // Key Config Slot 12 0x3A, 0x00, // Key Config Slot 13 0x3C, 0x00, // Key Config Slot 14 0x3C, 0x00, // Key Config Slot 15 0x1C, 0x00 // Key Config Slot 16

Wie Sie sehen, habe ich einige Kommentare in diesen Code eingefügt, um diese Konfiguration besser zu verstehen.

In Ihrem Fall brauchen Sie nur drei Dinge zu verstehen:

  1. Die Bytes 16 -> Dies ist die I2C-Adresse des Chips
  2. Die Bytes 20 bis 51 -> Sie können hier den Typ des Slots für die 16 Slots dieses Chips ändern
  3. Die Byte 96 bis 127 -> Hier können Sie den Typ des Schlüssels oder der Daten einstellen, die in jedem Steckplatz verwendet werden.

Ich werde die Art der Konfiguration nicht erklären und warum ich diese und keine andere verwendet habe, da es kompliziert ist, alles zu erklären. Weitere Informationen finden Sie in der Dokumentation, Seite 16 Abschnitt 2.2.1 für „SlotConfig“und Seite 19 Abschnitt 2.2.5 für „KeyConfig“

In diesem Beispiel verwenden Sie den Steckplatz 9, um einen AES-Schlüssel zu speichern.

Dazu müssen wir Folgendes einfügen (bei Bedarf können Sie das obige Beispiel kopieren, die Änderung wurde darin vorgenommen):

  1. Byte 36 = 0x8F
  2. Byte 37 = 0x0F
  3. Byte 112 = 0x1A
  4. Byte 113 = 0x00

Warum habe ich diese Konfiguration eingestellt: Für jeden Steckplatz dieses Chips können Sie Parameter einstellen, um dem Chip mitzuteilen, welche Art von Daten gespeichert werden. Sie haben mehrere Parameter:

  • Slot kann geschrieben oder gelesen werden (Löschen- oder Verschlüsseln-Aktion)
  • Art der gespeicherten Daten (ECC-Schlüssel, Public Key, SHA Hash, AES Key …)
  • Steckplatz kann abschließbar sein
  • Schlüsselgenerierung ist erlaubt

Wenn die Bytes 36 und 37 auf "0x0F8F" gesetzt sind:

  • Daten können in das Clear geschrieben werden
  • Der Inhalt dieses Slots ist geheim und kann nicht gelesen werden
  • Slot kann nicht für den CheckMac Copy-Befehl verwendet werden

Wenn die Bytes 112 und 113 auf "0x001A" gesetzt sind:

Steckplatz kann bis zu vier symmetrische AES 128-Bit-Schlüssel speichern (KeyType = 0x6)

Zweiter Schritt: Schreiben Sie diese Konfiguration

Dieser Schritt ist sehr wichtig, da wir den Chip mit unserer Konfiguration einstellen und wenn diese Konfiguration nicht gut ist, verwenden Sie diesen Chip.

Aber keine Sorge, solange die Konfiguration nicht gesperrt ist, können Sie Ihre Konfiguration ändern.

Hier ist der Code, mit dem die Konfiguration auf den Chip geschrieben wurde:

/** \brief Schreiben Sie eine neue Konfiguration auf den Chip.

* \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] config Array uint8_t der Konfiguration (Länge 112) * \param[in] len Größe des Konfigurationsarrays * \return ATCA_SUCCESS bei Erfolg, sonst ein Fehlercode. */ ATCA_STATUS write_configuration(ATCAIfaceCfg *cfg, uint8_t *config, size_t len) { if (len != 112) return ATCA_BAD_PARAM; ATCA_STATUS-Status; status = atcab_init(cfg); if (status == ATCA_SUCCESS) { // Schreibe das Konfigurations-Array auf den Chip // Auffüllen von 16 Byte (16 erste Bytes können nicht geschrieben werden) status = atcab_write_bytes_zone(ATCA_ZONE_CONFIG, 0, 16, (uint8_t *)config, len); Rückgabestatus; } Status zurückgeben; }

Diese Funktion schreibt Ihre Konfiguration in den Chip.

Dritter Schritt: Sperren Sie die Konfigurationszone

Warnung: Seien Sie bei diesem Schritt vorsichtig, wenn Sie diese Zone sperren und Ihre Konfiguration nicht gut ist, ist der Chip unbrauchbar und Sie können diese Zone nicht ändern

Für diese Aktion verwenden wir diese Funktion:

/** \brief Check ob die DATA_ZONE oder CONFIG_ZONE gesperrt ist

* \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] zone LOCK_ZONE_DATA oder LOCK_ZONE_CONFIG * \return ATCA_SUCCESS bei Erfolg, sonst ein Fehlercode. */ ATCA_STATUS check_lock_zone(ATCAIfaceCfg *cfg, uint8_t zone) { ATCA_STATUS status; bool lock = false; if (zone != (uint8_t)LOCK_ZONE_CONFIG && zone != (uint8_t)LOCK_ZONE_DATA) return ATCA_BAD_PARAM; status = atcab_init(cfg); if (status == ATCA_SUCCESS) { if (ATCA_SUCCESS != (status = atcab_is_locked(zone, &lock))) { return ATCA_FUNC_FAIL; } if (!lock) { return ATCA_NOT_LOCKED; } ATCA_SUCCESS zurückgeben; } ATCA_BAD_PARAM zurückgeben; } check_lock_zone(&cfg, LOCK_ZONE_CONFIG);

Vierter Schritt: Schreiben Sie Ihren AES-Schlüssel in einen Slot

In diesem Teil setzen Sie Ihren persönlichen AES-Schlüssel in den Slot, den Sie in der Konfiguration des Chips definiert haben.

Für dieses Beispiel verwende ich die Steckplatznummer 9 des Chips.

Sie müssen wissen: Eine Besonderheit dieses Chips ist, dass Sie Daten in Slots nur mit 4 Byte oder 32 Byte schreiben können. Für AES benötigen wir 128 Bit Key, also 16 Byte Daten. Also beschloss ich, in diesem Slot in einen Schlüssel von jeweils 16 Byte zu schreiben, um 32 Bytes Daten zu haben.

Jetzt zeige ich Ihnen den verwendeten Code:

/** \brief AES-Schlüssel in einen bestimmten Slot schreiben. * \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] key key slot number * \param[in] datakey key array uint8_t * \param[in] len Größe des key array * \return ATCA_SUCCESS bei Erfolg, ansonsten ein Fehlercode. */ ATCA_STATUS write_key_slot(ATCAIfaceCfg *cfg, uint8_t key, uint8_t *datakey, size_t len) { if (key 16) return ATCA_BAD_PARAM; if (len != 32) return ATCA_BAD_PARAM; ATCA_STATUS-Status = atcab_init(cfg); if (status == ATCA_SUCCESS) { status = atcab_write_zone (ATCA_ZONE_DATA, (uint16_t)key, 0, 0, datakey, 32); if (status != ATCA_SUCCESS) Rückgabestatus; } Rückgabestatus; }

Für dieses Beispiel verwende ich zwei AES-Schlüssel mit jeweils 16 Byte:

// Beispiel für AES KEY (len 32)uint8_t example_of_key[32] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; write_key_slot(&cfg, 9, example_of_key, sizeof(example_of_key));

Wenn diese Aktion gut ist, müssen Sie jetzt den letzten Schritt "Datenzone sperren" bestehen.

Letzter Schritt: Sperren Sie die Datenzone

Achtung: Seien Sie bei diesem Schritt vorsichtig, wenn Sie diese Zone sperren und Ihre Daten nicht eingestellt sind, ist der Chip unbrauchbar und Sie können diese Zone nicht ändern

Für diese Aktion verwenden wir diese Funktion:

/** \brief Check ob die DATA_ZONE oder CONFIG_ZONE gesperrt ist

* \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] zone LOCK_ZONE_DATA oder LOCK_ZONE_CONFIG * \return ATCA_SUCCESS bei Erfolg, sonst ein Fehlercode. */ ATCA_STATUS check_lock_zone(ATCAIfaceCfg *cfg, uint8_t zone) { ATCA_STATUS status; bool lock = false; if (zone != (uint8_t)LOCK_ZONE_CONFIG && zone != (uint8_t)LOCK_ZONE_DATA) return ATCA_BAD_PARAM; status = atcab_init(cfg); if (status == ATCA_SUCCESS) { if (ATCA_SUCCESS != (status = atcab_is_locked(zone, &lock))) { return ATCA_FUNC_FAIL; } if (!lock) { return ATCA_NOT_LOCKED; } ATCA_SUCCESS zurückgeben; } ATCA_BAD_PARAM zurückgeben; } check_lock_zone(&cfg, LOCK_ZONE_DATA);

Wenn diese Aktion gut ist, ist Ihr Chip einsatzbereit

Schritt 5: 3. Verwendung des AES CBC-Moduls

3. Verwendung des AES CBC-Moduls
3. Verwendung des AES CBC-Moduls

Ich werde erklären, wie man Daten mit dem Algorithmus AES CBC und dem Chip Atecc608a ver- und entschlüsselt.

Denken Sie daran: Bevor Sie diese Funktion verwenden, müssen Sie den Chip einrichten. Befolgen Sie dazu Schritt 2 dieses Artikels

Dieser Chip hat mehrere Arten von AES-Modulen (AES 128 Bit), nur AES 128 Bit ist möglich:

  1. AES normal
  2. AES-CBC
  3. AES GCM (mit GFM-Hash) (siehe Wikipedia für weitere Erläuterungen)

Um die Bedienung zu vereinfachen, habe ich zwei Funktionen erstellt:

  1. aes_cbc_encrypt
  2. aes_cbc_decrypt

Diese beiden Funktionen sind auf meinem Github verfügbar.

Erklärung

Ich entscheide mich für den AES CBC-Algorithmus, weil er sicherer ist als der grundlegende AES 128-Bit. Dieser Algorithmus verwendet einen Initial Vector, um Ihre Daten zu verschlüsseln.

Information

Im Folgenden beschreibe ich jeden Schritt der Verschlüsselungs- und Entschlüsselungsmethode. Aber ich habe einen Code für den Arduino geschrieben, der diese beiden Funktionen verwendet. Sie können diesen Code in meinem Github sehen:

  • Github: Mein Github
  • Codebeispiel "Encrypt/Decrypt": AES_crypto_example.ino

Erster Schritt: Verschlüsseln Sie Ihre Daten

In diesem Teil zeige ich Ihnen, wie Sie Ihre Daten verschlüsseln.

Zuerst benötigen Sie diese Funktion:

/** \brief Daten mit AES CBC-Algorithmus verschlüsseln * \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] data Zu verschlüsselnde Wörter (müssen durch 16 geteilt werden, maximale Länge 240) * \param[in] Länge der zu verschlüsselnden Wörter (müssen durch 16. geteilt werden), max length 240) * \param[out] iv Initial Vector verwendet im AES CBC (liefert den Vektor in dieser var) * \param[out] ciphertext gibt hier den Cyphertext zurück * \param[in] key Slot Nummer des key * \return ATCA_SUCCESS bei Erfolg, sonst ein Fehlercode. */ ATCA_STATUS aes_cbc_encrypt(ATCAIfaceCfg *cfg, uint8_t *data, int len, uint8_t *iv, uint8_t *chiffrtext, uint8_t key) { atca_aes_cbc_ctx_t ctx; if (len> LIMIT_DATA_SIZE_CBC && len % 16 != 0) {Serial.print (F("ERROR: ATCA_BAD_PARAM")); ATCA_BAD_PARAM zurückgeben; } uint8_t tmp_iv[IV_LENGTH_CBC]; uint8_t tmp_data[len]; ATCA_STATUS-Status = atcab_init(cfg); if (status == ATCA_SUCCESS) { status = atcab_aes_cbc_init(&ctx, key, 0, tmp_iv); if (status != ATCA_SUCCESS) { Serial.print (F("ERROR Encrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (Status, HEX); Rückkehr; } memcpy(iv, tmp_iv, IV_LENGTH_CBC); memcpy(tmp_data, data, len); intmax = len / 16; for (int j = 0; j < max; j++) {status = atcab_aes_cbc_encrypt_block(&ctx, &tmp_data[j * 16], &ciphertext[j * 16]); } if (status != ATCA_SUCCESS) { Serial.print (F ("ERROR Encrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (Status, HEX); } Rückgabestatus; } Status zurückgeben; }

Diese Funktion ist einfach zu bedienen, Sie müssen zwei Dinge einstellen:

  1. Ein leerer IV (Initial Vector) von 16 Bytes
  2. Zu verschlüsselnde Daten (max. Größe 240 Bytes)

Hier ein Beispiel "wie man diese Funktion benutzt".

Ich möchte das Wort "AAAAAAAAAAAAAAA" verschlüsseln, wobei mein Schlüssel in die Slot-Nummer "9" geschrieben ist:

ATCA_STATUS-Status = atcab_init(&cfg); if (status != ATCA_SUCCESS) { Serial.println (F("atcab_init() fehlgeschlagen: Code -> 0x")); Serial.println (Status, HEX); } uint8_t plaintext[16] = "AAAAAAAAAAAAAAA"; // Originaltext uint8_t iv[IV_LENGTH_CBC]; // Anfangsvektor uint8_t cypherdata[sizeof(plaintext)]; // Datenverschlüsselungsstatus = aes_cbc_encrypt(&cfg, plaintext, sizeof(plaintext), iv, cypherdata, 9);

Wenn die Aktion gut ist, haben Sie die verschlüsselten Daten in der Variablen "cypherdata" und den Initial Vector in der Variablen "IV".

Behalten Sie diese beiden Variablen, um Ihren Text zu entschlüsseln!

Zweiter Schritt: Entschlüsseln Sie Ihre Daten

Um Ihre Daten zu entschlüsseln, benötigen Sie zwei Dinge:

  1. Der anfängliche Vektor
  2. Die Cypher-Daten (verschlüsselte Daten)

Um Ihre Daten zu entschlüsseln, benötigen Sie diese Funktion:

/** \brief Daten mit AES CBC-Algorithmus entschlüsseln * \param[in] cfg Logische Schnittstellenkonfiguration. Einige vordefinierte * Konfigurationen finden Sie in atca_cfgs.h * \param[in] Geheimtext Zu entschlüsselnde Wörter (müssen durch 16 geteilt werden, maximale Länge 240) * \param[in] Länge der zu entschlüsselnden Wörter (müssen durch 16. geteilt werden), max length 240) * \param[in] iv Initial Vector zur Verwendung im AES CBC * \param[out] Klartext hier den entschlüsselten Text zurückgeben * \param[in] key Slot-Nummer des Schlüssels * \return ATCA_SUCCESS bei Erfolg, sonst ein Fehlercode. */ ATCA_STATUS aes_cbc_decrypt(ATCAIfaceCfg *cfg, uint8_t *ciphertext, int len, uint8_t *iv, uint8_t *plaintext, uint8_t key) { atca_aes_cbc_ctx_t ctx; if (len > LIMIT_DATA_SIZE_CBC || len % 16 != 0) { Serial.print (F ("ERROR Decrypt: ATCA_BAD_PARAM")); ATCA_BAD_PARAM zurückgeben; } ATCA_STATUS-Status = atcab_init(cfg); if (status == ATCA_SUCCESS) { status = atcab_aes_cbc_init(&ctx, Schlüssel, 0, iv); if (status != ATCA_SUCCESS) { Serial.print (F("ERROR Decrypt: atcab_aes_cbc_init, Code Error 0x")); Serial.println (Status, HEX); Rückkehr; } intmax = len / 16; for (int j = 0; j < max; j++) { status = atcab_aes_cbc_decrypt_block(&ctx, &ciphertext[j * 16], &plaintext[j * 16]); } if (status != ATCA_SUCCESS) { Serial.print (F("ERROR Decrypt: atcab_aes_cbc_encrypt_block, Code Error 0x")); Serial.println (Status, HEX); } Status zurückgeben; } Status zurückgeben; }

Ich möchte meine bisherigen Daten entschlüsseln (siehe unten, Erster Schritt). Dafür werde ich dies tun:

uint8_t plaintext[16] = "AAAAAAAAAAAAAAA"; uint8_t iv[IV_LENGTH_CBC]; uint8_t cypherdata[sizeof(Klartext)]; uint8_t decryptdata[sizeof(Klartext)]; status = aes_cbc_decrypt(&cfg, Verschlüsselungsdaten, Größevon(Verschlüsselungsdaten), iv, Entschlüsselungsdaten, 9); if (status == ATCA_SUCCESS) { Serial.print ("Entschlüsselter Text ist:"); for (size_t i = 0; i < sizeof(decryptdata); i++) {Serial.print ((char)decryptdata); } Serial.println(""); } else { // Siehe Datei atca_status.h für den Code Error Serial.print (F ("Unmöglich die Entschlüsselung durchführen | Code Error 0x")); Serial.println (Status, HEX); Rückkehr; }

Wenn die Aktion gut ist, haben Sie die entschlüsselten Daten in der Variablen "decryptdata".

Jetzt wissen Sie, wie Sie mit dem Chip Atecc608a Verschlüsselung und Entschlüsselung verwenden

Schritt 6: 5. Warum müssen Sie diesen Chip verwenden?

Verschlüsselte Daten sind sehr nützlich, da Sie Ihre Informationen verbergen und drahtlos senden oder einfach speichern können.

Hier einige Anwendungsbeispiele:

  1. Gespeicherte Daten auf einem externen EEPROM: Sie können Daten eines externen EEPROM sichern und wenn jemand dieses EEPROM noch besitzt, benötigt er den Schlüssel und die IV für die Entschlüsselung
  2. Drahtlose Daten senden: Sie können diese verschlüsselten Daten per Funk senden (nrf24L01, RFM95W…) und wenn jemand Ihre Daten abfängt, sind diese Daten sicher
  3. Gespeichertes Passwort

Sie können mit diesem Chip mehrere Dinge tun. Es kann in mehreren Projekten verwendet werden. Wenn Sie Zeit haben, sagen Sie mir, in welchem Projekt Sie diesen Chip verwenden werden?

Ein letzter Rat: Wenn Sie ein drahtloses Projekt erstellen oder Rohdaten speichern, seien Sie vorsichtig, Sicherheit ist sehr wichtig und wenn Sie wissen, wie einfach es für einen "Noob" ist, Ihre Daten abzufangen oder zu stehlen. Mit dem Internet kann jetzt jeder Skripte auf seinem Computer starten, nur um Sie zu "hacken"!

Schritt 7: Fazit

Ich hoffe, dass dieser Artikel für Sie nützlich ist. Es tut mir leid, wenn ich einen Fehler in meinem Text gemacht habe, aber Englisch ist nicht meine Hauptsprache und ich spreche besser als ich schreibe.

Danke, dass du alles gelesen hast.

Genieß es.

Empfohlen: