>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML
PHP

Streichholz-Kryptografie: Wie man ECDSA in einen günstigen Mikrocontroller quetscht

1.419 Sterne

Wenn es um den Schutz von Daten in IoT oder günstiger Hardware geht, stoßen Entwickler oft an eine Wand. Versuchen Sie, ein vollständiges OpenSSL auf einem 8-Bit-AVR oder schwachen ARM Cortex-M0 bereitzustellen. Meistens passt Ihre Firmware einfach nicht in den Speicher, und selbst wenn sie passt, bleiben keine Ressourcen für die Hauptanwendungslogik übrig. Genau hier kommt das micro-ecc-Projekt ins Spiel – es macht eine Sache, aber die richtig gut.

Worum geht es bei diesem Projekt

micro-ecc ist eine kompakte Implementierung der ECDH- (Schlüsselaustausch) und ECDSA-Algorithmen (digitale Signatur) in C. Der Autor des Projekts, Ken MacKay, hat sich offensichtlich zum Ziel gesetzt, eine Bibliothek zu erstellen, die überall läuft, wo es irgendeinen Prozessor gibt.

Der Haupttrick hier ist der vollständige Verzicht auf dynamische Speicherallokation. Kein malloc und kein Heap, nur Stack und statischer Speicher. Für eingebettete Systeme ist das entscheidend: Sie wissen genau, wie viel Speicher die Kryptografie zur Kompilierzeit verbrauchen wird, und Sie fürchten weder Fragmentierung noch Laufzeit-Lecks.

Was die Bibliothek kann

Die Bibliothek unterstützt fünf Standardkurven, einschließlich der beliebten secp256r1 (auch bekannt als P-256) und der „Bitcoin“-Kurve secp256k1.

Die Hauptmerkmale sehen folgendermaßen aus:

  • Funktioniert auf 8-, 32- und 64-Bit-Architekturen.
  • Schutz vor bekannten Seitenkanalangriffen.
  • In reinem C geschrieben, aber es gibt Assembler-Snippets für AVR und ARM, um maximale Geschwindigkeit herauszuholen.
  • Veröffentlicht unter der liberalen BSD-2-Klausel-Lizenz.

Übrigens, wenn Sie mit Arduino arbeiten, ist das Projekt direkt im Bibliotheksmanager verfügbar. Kein manuelles Herunterladen nötig – suchen Sie einfach nach micro-ecc und fügen Sie es zu Ihrem Sketch hinzu.

Kleiner Code für große Aufgaben

Der Autor behauptet, der Code sei für Größe optimiert. In der Welt der Mikrocontroller ist das oft wichtiger als rohe Geschwindigkeit. Wenn Sie nur einmal im Monat eine Firmware-Aktualisierungssignatur verifizieren müssen, ist es egal, ob es 100ms oder 500ms dauert. Was zählt, ist, dass der Verifizierungscode nicht 80% Ihres Flash-Speichers verbraucht.

Das heißt aber nicht, dass es keine optionalen Optimierungen gibt. Durch uECC_OPTIMIZATION_LEVEL können Sie die Leistung anpassen. Aber seien Sie vorsichtig: Bei hohen Optimierungsstufen für ARM-Plattformen benötigt GCC möglicherweise bestimmte Flags wie -fomit-frame-pointer, andernfalls könnte alles kaputtgehen.

Wie es im Code aussieht

Die Bibliothek hat eine minimalistische Schnittstelle. Um loszulegen, kopieren Sie einfach ein paar Dateien in Ihr Projekt und binden die Header-Datei ein.

#include "uECC.h"

// Создаем ключи
uint8_t public_key[64];
uint8_t private_key[32];
const struct uECC_Curve_t * curve = uECC_secp256r1();

uECC_make_key(public_key, private_key, curve);

Kurvenpunkte werden standardmäßig in unkomprimierter Form ohne das 0x04-Präfix dargestellt. Wenn Sie jedes Byte bei der Übertragung über Funk sparen müssen, stellt die Bibliothek die Funktionen uECC_compress() und uECC_decompress() bereit.

Für wen ist das gedacht

Ich sehe mehrere Szenarien, in denen micro-ecc einfach unverzichtbar ist. Erstens, Geräteauthentifizierung. Zum Beispiel, wenn Ihr Sensor dem Server beweisen muss, dass er das ist, was er ist, und keine Fälschung. ECDSA eignet sich perfekt für die Erzeugung einer solchen Signatur.

Zweitens, Secure Boot. Wenn Sie einen benutzerdefinierten Bootloader für STM32 oder einen AVR schreiben, hilft micro-ecc dabei, die Signatur eines neuen Firmware-Images zu verifizieren, bevor es in den Flash geschrieben wird.

Drittens, wenn Sie Wearables oder batteriebetriebene Sensoren erstellen. Je weniger CPU-Zyklen für Berechnungen aufgewendet werden, desto länger lebt das Gerät. Assembler-Snippets für ARM und AVR sind hier sehr nützlich.

Ein paar Hinweise für unterwegs

Trotz seiner Großartigkeit hat das Projekt seine Eigenheiten. Die README ist ziemlich knapp, daher müssen Sie für Details zu jeder Funktion in den uECC.h schauen. Die Dokumentation lebt in den Code-Kommentaren.

Wenn Sie planen, das Projekt unter Windows zu erstellen, vergessen Sie nicht, die Systembibliothek advapi32.lib zu verlinken – sie wird für die Arbeit mit Entropie benötigt. Und für AVR stellen Sie sicher, dass Sie die Compiler-Optimierung aktivieren (-O1 und höher), andernfalls funktioniert die Bibliothek aufgrund der Stack-Handling-Spezifika möglicherweise nicht korrekt.

Insgesamt ist dies ein großartiges Beispiel dafür, wie eine spezialisierte Bibliothek aussehen sollte: ein enger Fokus, minimale Abhängigkeiten und vorhersehbares Verhalten. Wenn Ihre Hardware zu schwach für TLS ist, aber Sie Sicherheit benötigen – micro-ecc verdient definitiv einen Platz in Ihrem src/lib.