Gibt es eine leichtgewichtige Bibliothek, die eine RSA-2048-Verschlüsselung für eine eingebettete Anwendung durchführen kann?

Ich suche nach einer C/C++-Implementierung von RSA mit einem 2048-Bit-Schlüssel (vorzugsweise aus einer Datei gelesen). Mein Ziel ist eine eingebettete Plattform, daher gibt es einige seltsame Einschränkungen. Die Hardware hindert uns daran, den neuen Operator zu verwenden, und wir müssen eine spezielle Version von malloc verwenden, die vom Hardwarehersteller namens "umalloc" geliefert wird. Bei Bedarf kann ich in die Quelle graben und die malloc-Aufrufe von Hand ersetzen, aber das möchte ich vermeiden. Die idealste Lösung wäre, eine Bibliothek zu finden, die RSA-Verschlüsselung durchführen kann, jedoch ohne Ausnahmen oder dynamische Zuordnung.

Ich recherchiere das jetzt seit etwa einer Woche und bin auf den verschiedenen Stackexchange-Websites auf mehrere verschiedene Bibliotheken gestoßen. Siehe hier und hier . Ich wollte diese Frage erneut öffnen, da die meisten Fragen, die ich gefunden habe, mehrere Jahre alt waren und ich sehen möchte, ob die Meinungen zu diesen Bibliotheken noch zutreffen.

Bisher sind hier die folgenden Bibliotheken, auf die ich gestoßen bin

  • OpenSSL: Die beliebteste Option. Da ich NUR RSA-Verschlüsselung machen möchte, scheint OpenSSL übertrieben zu sein. Auch das Ersetzen von malloc in der Quelle scheint zu viel Aufwand zu sein.
  • LibreSSL: Fork von OpenSSL. Kommt mit den gleichen Problemen wie OpenSSL.
  • crypto++: C++-Bibliothek, verwendet aber Ausnahmen. Kann ich nicht benutzen.
  • axTLS: Scheint sehr leicht zu sein, und ich untersuche diese Bibliothek gerade. Ich habe jedoch Schwierigkeiten zu verstehen, wie man einen öffentlichen Schlüssel in seine Schnittstelle einliest.
  • libcrypto: Ich habe diese Bibliothek erst vor ein paar Stunden entdeckt. Wird derzeit untersucht.

Im Idealfall hoffe ich, einfach ein paar Dateien einzufügen und nur eine Handvoll Funktionen zu verwenden, um loszulegen. Gibt es Bibliotheken, die über das hinausgehen, was ich aufgelistet habe, die RSA-2048-Verschlüsselung durchführen können, und zwar ohne Ausnahmen oder dynamische Speicherzuweisung? Vielen Dank

Eine Sache, die Sie beachten und untersuchen sollten, sind die Exportbeschränkungen, da das Einschließen von RSA-2048-Code in Ihr eingebettetes Ziel unweigerlich dazu führt, dass es für das gesamte Gerät gilt. Die USA und einige andere Länder betrachten Kryptografie ab einem gewissen Grad als Waffentechnologie.
Reden Sie von ITAR? Bezieht sich dies auf alles, was mit RSA-2048 verschlüsselt ist?
@HD_Mouse Die meisten Dinge, die Sie mit RSA verschlüsseln würden, würden abgedeckt (im Grunde alles außer einem Passwort). Signieren ist in Ordnung. Wenn die Funktion des Geräts jedoch nicht hauptsächlich darin besteht, Kryptografie durchzuführen, hätte das Gerät als Ganzes nicht die gleichen Beschränkungen wie der Verschlüsselungscode. Ja, es ist ein bisschen albern. Was ich hier schreibe, ist nur eine sehr kurze Zusammenfassung, recherchieren Sie dies gründlich, bevor Sie mit dem grenzüberschreitenden Versand von Software oder Hardware beginnen.
Könnten Sie RSA durch ECC ersetzen?
@CodesInChaos Ich glaube nicht, dass das eine Option ist, da ich nur ein Ende des Datenpfads schreibe. Es wird erwartet, dass die Daten mit einem öffentlichen RSA-Schlüssel verschlüsselt ankommen, und ich glaube nicht, dass ich die Befugnis habe, das zu ändern.
@HD_Mouse - In den USA haben ITAR und EAR, aber auch andere Länder wie Großbritannien ihre eigenen Beschränkungen, und die Beschränkungen variieren von Zeit zu Zeit und den beteiligten Landkreisen. Einige Inspektoren/Bewerter werden die Nutzung beurteilen und einige Orte werden auf Zugang zu Schlüsseln/Samen oder anderen Hintertüren bestehen. Siehe en.wikipedia.org/wiki/… und en.wikipedia.org/wiki/…
Haben Sie eine alte Version von Crypto++ in Betracht gezogen? Version 4.1 verwendet keine Ausnahmen im RSA-Code, und Sie können die Teile der Bibliothek, die dies tun, einfach nicht kompilieren. Ich weiß nicht, wie viel Ersatz von new/delete benötigt würde.
@Mark danke, dass du mich darauf aufmerksam gemacht hast. Die Hauptseite für Crypto++ hatte keine Option zum Herunterladen einer älteren Version. Obwohl ich vorsichtig bin, eine ältere Version einer kryptografischen Bibliothek zu verwenden. Wäre es nicht offen für Schwachstellen? Oder ist die RSA-Komponente ausgereift genug, um keine Updates zu benötigen?
@HD_Mouse, hängt davon ab, worüber Sie sich Sorgen machen. Wenn Sie sich Sorgen über Seitenkanalangriffe machen, z. B. wenn jemand den Schlüssel durch Messen der Wärmeabgabe oder des Stromverbrauchs ableitet, könnte eine alte Version Probleme haben; Ansonsten ist RSA ein ausgereifter Algorithmus und es sollte keine Schwachstellen in seiner Implementierung geben.
Siehe auch Leichte Implementierungen von Kryptobibliotheken (ich schließe nicht als Duplikat, da die Anforderungen nicht genau gleich sind und jede Frage Antworten zulässt, die nicht zur anderen Frage passen würden)
Eine zusätzliche Option kann BearSSL sein, das speziell auf Umgebungen ohne dynamische Speicherzuweisungen und mit geringer RAM-Verfügbarkeit abzielt. Außerdem ist sein Code speziell so geschrieben, dass er widerstandsfähig ist, um Operationen unabhängig von geheimen Werten in der Zeit auszuführen ("konstante Zeit").

Antworten (2)

Ja, LibTomCrypt . LibTomCrypt implementiert die gängigsten kryptografischen Primitiven (und viele ungewöhnliche) , einschließlich RSA (PKCS#1 v1.5, PSS- und OAEP-Modi). Der Code ist sauber und portabel C, sodass Sie ihn in Anwendungen einbinden können, die in so ziemlich jeder Programmiersprache geschrieben sind. Die Bibliothek besteht aus kleinen Objekten, sodass nur der Code, den Sie tatsächlich benötigen, in Ihre Binärdatei eingebunden wird. Die Lizenz erlaubt Ihnen, buchstäblich zu tun, was zum Teufel Sie wollen.

Mathematische Operationen werden von der begleitenden Bibliothek LibTomMath (in hohem Maße portierbarer und lesbarer Code) oder TomsFastMath (mit Optimierungen für einige Plattformen einschließlich ARM) durchgeführt.

LibTomCrypt nutzt mallocund co. standardmäßig für die Speicherverwaltung, aber Sie können andere ersetzen, wenn Sie die Bibliothek erstellen ( #define XMALLOC umallocusw.).


LibTomCrypt macht nur Krypto-Primitive, keine Zertifikate oder Netzwerkprotokolle. Wenn Sie SSL/TLS benötigen, schlagen wir vorläufig mbed TLS vor, früher bekannt als PolarSSL. Vorläufig, weil ich es noch nie in einem eingebetteten Projekt verwendet habe.

Es wird von ARM verwaltet, sodass Sie Code erwarten können, der auf ARM-Plattformen gut funktioniert (obwohl es meines Wissens keine besonderen Optimierungen gibt, z. B. gibt es keine optionale ARM-Assembly, nur portables C). Für Open-Source-Projekte ist die Bibliothek unter der GNU GPL lizenziert (nicht der LGPL), was restriktiv ist, aber es gibt Ausnahmen, die das Verknüpfen mit Nicht-GPL-Open-Source-Code erlauben. Eine Lizenz, die eine Closed-Source-Verteilung erlaubt, ist ebenfalls gegen Gebühr erhältlich.

Der Quellcode ist ziemlich sauberes, portables C. Ein Teil des Kerncodes wird überhaupt nicht verwendet malloc, und der Code, der dies tut, verwendet immer polarssl_mallocund polarssl_free(es gibt keine Verwendung von realloc), wodurch es bei Bedarf einfach ist, andere Zuweisungen zu ersetzen.

Elliptische Kurven werden auch unterstützt, wenn Sie irgendwann auf etwas Schnelleres und Kleineres als RSA migrieren.

Danke, dass du mir das vorgestellt hast! Das klingt sehr vielversprechend, aber die GPL-Lizenz ist definitiv restriktiv. Ich werde mit meinen Kollegen besprechen, ob wir bereit wären, die Gebühr für eine Closed-Source-Distribution zu zahlen. Ich halte mich damit zurück, dies als Antwort zu akzeptieren, für den Fall, dass sich eine vielversprechendere Lösung ergibt.
Die Bibliothek ist jetzt auch unter der Apache Version 2-Lizenz lizenziert. Das bedeutet, dass es sogar in proprietären kommerziellen Closed-Source-Projekten ohne Kosten verwendet werden kann. Während ich nach einer viel kleineren RSA-Bibliothek suchte, konnte ich nichts finden, also nehme ich diese Antwort auch. Kann nicht verstehen, warum es dafür keine kleine Ein-Datei-Lösung gibt.
@Lothar Wenn ich auf diese Antwort zurückblicke, warum habe ich jemals Polar empfohlen? Das ist für SSL, aber das ist nicht das, was die Frage stellt. Bearbeitet. Verwenden Sie libtomcrypt!
@HD_Mouse Wenn ich auf diese Antwort zurückblicke, warum habe ich jemals Polar empfohlen? Das ist für SSL, aber das ist nicht das, was die Frage stellt. Bearbeitet. Verwenden Sie libtomcrypt!

Im Jahr 2019 ist die beste C-Bibliothek für eingebettete Kryptografie wahrscheinlich BearSSL . Abgesehen davon, dass es meiner Meinung nach ziemlich sicher ist (es berücksichtigt Seitenkanalangriffe), ist es sehr kompakt und so konzipiert, dass es keinen Speicher dynamisch zuweist (z. B. ruft es nicht auf malloc).