Dauert es lange, RSA in Hardware zu implementieren?

Ich habe gerade meinen ersten Digital-Hardware-Kurs abgeschlossen. Wir haben kombinatorische Schaltungen, sequentielle Schaltungen und FSMs behandelt.

Wir müssen jetzt ein endgültiges Designprojekt erstellen. Dafür haben wir 2 Wochen Zeit und arbeiten in 2er-Teams.

Ich möchte RSA-Verschlüsselung in Hardware implementieren. Im Wesentlichen würde das FPGA ein Audiosignal als Eingabe nehmen, RSA darauf ausführen und das verschlüsselte Audiosignal ausgeben. Wir werden Verilog und ein DE2-Board verwenden. Ich mache mir jedoch Sorgen, dass dies zu lange dauern könnte.

Könnte mir jemand sagen, ob die Implementierung von RSA in Hardware ein vernünftiges Ziel für ein zweiwöchiges Projekt für jemanden ist, der nur einen einzigen Kurs in digitaler Elektronik belegt hat? Dies ist mein erstes Engineering-Projekt, daher bin ich noch nicht sehr gut im Scoping.

Danke schön.

Antworten (3)

RSA wird nicht einfach zu implementieren sein und kann ein sehr großes FPGA erfordern. RSA eignet sich viel besser für die Ausführung auf einer Allzweck-CPU als ein FPGA. Ich habe einige Implementierungen von RSA auf einem FPGA gesehen, die einen Softcore verwenden, um den Algorithmus auszuführen, und das FPGA, um einen Teil der Mathematik zu beschleunigen, aber der vollständige Algorithmus ist nicht in Verilog implementiert. Und im Allgemeinen, wenn eine Datei "RSA-verschlüsselt" ist, ist sie es normalerweise nicht - die Datei ist im Allgemeinen AES-verschlüsselt und der AES-Schlüssel ist dann RSA-verschlüsselt, da AES viel schneller als RSA ist. Wenn Sie einen Verschlüsselungsalgorithmus auf einem FPGA implementieren möchten, insbesondere für ein Streaming-Signal, wäre AES eine viel bessere Idee als RSA. Sie können AES wahrscheinlich in einer Woche implementieren, es ist ein ziemlich einfacher Algorithmus.

RSA ist nicht dazu geeignet, große Datenmengen direkt zu verschlüsseln. Es ist nicht nur viel zu langsam, sondern auch schwächer als einige andere Algorithmen gegen einen Gegner, der eine große Anzahl bekannter Klartext/Geheimtext-Paare hat. Um dem vorzubeugen, werden Daten, die mit RSA verschlüsselt werden, in der Regel zuvor mit Zufallsbits aufgefüllt. Infolgedessen ist der RSA-Chiffretext im Allgemeinen erheblich größer als die Größe der Datennutzlast.

Das normale Verwendungsmuster für RSA besteht darin, einen zufälligen Schlüssel für ein anderes Kryptosystem zu generieren und einen RSA-„Klartextblock“ zu generieren, der diesen zufälligen Schlüssel zusammen mit einigen optionalen zusätzlichen Informationen über die zu verschlüsselnde Datei enthält, wobei jeder zusätzliche Platz mit zufälligen Bits gefüllt wird. Dieser Block wird dann verschlüsselt und zusammen mit einer Kopie der echten Datei an den beabsichtigten Empfänger gesendet, die mit dem anderen Kryptosystem mit dem Schlüssel verschlüsselt wurde, der im RSA-verschlüsselten Block enthalten ist.

Ich denke, dass das Entwerfen einer seriellen "RSA-Beschleuniger" -Schaltung zur effizienten Durchführung einer NxK-Multiplikation, bei der K ein fester Wert ist und N beliebig groß sein kann, eine gute Herausforderung sein könnte. Machen Sie es so, dass sobald die Schaltung mit dem kurzen Multiplikanden geladen ist, jeder Teil des langen Multiplikanden, der eingetaktet wird (LSB zuerst), den gleich großen Teil der Ergebnisdaten erzeugt. Wenn Sie eine Chunk-Größe von einem Bit verwenden, könnte der Multiplikator als zwei N-Bit-Register implementiert werden; Wenn X mit dem K-Bit-Wert und R mit Null geladen wird, sollte jeder Schritt Folgendes ausführen:

if input is 1
  output = R[0] xor (input and K[0])
  R = (R+K)>>1
else
  output = R[0]
  R = (R>>1)
endif

Um Dinge auf diese präzise Weise zu implementieren, wäre eine K-Bit-Übertragskette erforderlich, die in einem Zyklus arbeiten könnte. Mit ein wenig Überlegung würde jedoch das Hinzufügen eines weiteren K-Bit-Registers es der Schaltung ermöglichen, sich genau wie das obige zu verhalten, aber eine ziemlich kurze Ausbreitungsverzögerung im ungünstigsten Fall. Außerdem wäre die Menge an zusätzlicher Schaltung, die erforderlich ist, um zwei Bits gleichzeitig zu verarbeiten, nicht viel größer als die, die erforderlich ist, um jeweils ein Bit zu verarbeiten.

Das Entwerfen eines Multiplikators, der einfach über einen oder zwei SPI-Ports an einen Mikrocontroller angeschlossen werden kann (wenn zwei, machen Sie einen Master-Modus und den anderen Slave-Modus mit seiner an den Master gebundenen Uhr), könnte eine vernünftige Herausforderung sein. Wenn man bereit wäre, den RSA-Modul auf die Form 1000...000xxxxx mit 256 Nullen in der Nähe der führenden Bits zu beschränken (dies würde die Verwendung eines Moduls erfordern, der 256 Bit länger ist, als es sonst für ein bestimmtes Sicherheitsniveau erforderlich wäre), ein Nx256 Multiplikator würde wahrscheinlich etwas um ein 2048-Gate-FPGA herum erfordern, aber selbst einem kleinen Mikro ermöglichen, RSA-Verschlüsselungen in Sekundenbruchteilen durchzuführen.

Dies ist eine ziemliche Herausforderung, und wenn Sie keine Open-Source- oder leicht verfügbare RSA-Implementierung verwenden, sind 2 Wochen eine Strecke.

Wenn Sie eine fertige Bibliothek für die Implementierung verwenden, ist es möglich, die Bibliothek an Ihre Bedürfnisse anzupassen.

Dies setzt voraus, dass Sie über ein bewährtes Devkit verfügen, das Sie verwenden können.