Deterministische RSA-Verschlüsselung in Java

9

Dies ist meine erste Frage auf dieser Seite, und ich habe nur ein grundlegendes mathematisches Verständnis von RSA, also bitte ertragen Sie mit mir! :)

Ich schreibe eine Java-Webanwendung für mein Abschlussjahrprojekt an der Universität. Es ist eine webbasierte Implementierung von "Pret-a-Voter", einem sicheren Wahlsystem für diejenigen, die davon gehört haben.

Im Wesentlichen ist mein Problem, dass ich jemandem, der die Rolle eines Auditors spielen möchte, erlauben kann:

  • eine Quelle Byte-Array (der zu verschlüsselnde Klartext)
  • eine RSA Public Key-Datei
  • ein " Ziel " Byte-Array, das das Ergebnis meiner eigenen Berechnung der Chiffredaten ist, die den Klartext und den öffentlichen Schlüssel
  • erhalten

Ich möchte dann, dass der Auditor in der Lage ist, die Verschlüsselung unter Verwendung der ersten beiden Elemente durchzuführen, und sich davon überzeugt haben, dass das dritte das Ergebnis ist. Daher muss die Verschlüsselung deterministisch sein, d. H. Jedes Mal, wenn die Verschlüsselung mit dem gleichen Klartext und dem öffentlichen Schlüssel wiederholt wird, die gleichen Chiffredaten erzeugt werden.

(Hinweis - Ich arbeite mit sehr kleinen Datenblöcken in diesem Projekt - es gibt überhaupt keine symmetrische Verschlüsselung ... Ich bin mir bewusst, dass dies eine "interessante" Verwendung von RSA ist!)

Jedenfalls habe ich das in Java mit

gefunden %Vor%

verwendet das standardmäßige zufällige Auffüllschema mit Kosten von 11 Byte (bei einem 2048-Bit-Schlüsselpaar ist es also möglich, 2048 / 8-11 = 245 Byte zu verschlüsseln). Wiederholte Verschlüsselungen desselben Klartextes erzeugen unterschiedliche Chiffriertexte, was offensichtlich nicht der ECB-Modus ist, den ich möchte.

Meine Frage ist - sollte ich Folgendes verwenden?

%Vor%

Ich habe an vielen Stellen gelesen, dass RSA ohne Padding unsicher ist. Liegt das daran, dass ein Angreifer ein Wörterbuch mit Klartexten / Geheimtexten erstellen kann? Dies ist ein Nebeneffekt der deterministischen Verschlüsselung, die ich benötige, um Auditoren zu ermöglichen, meine Verschlüsselung zu verifizieren, und in meinem Schema werden Auditoren vertraut , so dass dies in Ordnung wäre.

Teil zwei meiner Frage ist mehr Java-bezogen. Wenn ich RSA / ECB / NoPadding wie oben verwende, glaube ich, dass ich in der Lage bin, ein Quellbytearray von (sagen wir) der Länge 128 (für ein 1024-Bit-RSA-Schlüsselpaar) bereitzustellen und dieses zu verschlüsseln um ein weiteres Byte-Array der Länge 128 zu erhalten. Wenn ich dann versuche, das erneut zu verschlüsseln, mit einem anderen öffentlichen Schlüssel mit 1024 Länge, bekomme ich

  

javax.crypto.BadPaddingException: Die Nachricht ist größer als der Modul

Weiß jemand warum?

EDIT - Verschlüsselung mit NoPadding erzeugt nicht immer diese Ausnahme - es ist temperamentvoll. Auch wenn die Verschlüsselung diese Ausnahme nicht generiert, generiert die Entschlüsselung Folgendes:

  

javax.crypto.BadPaddingException: Daten müssen mit Null beginnen

Vielen Dank für das Lesen! Jede Hilfe würde sehr geschätzt werden.

BEARBEITEN - Entschuldigung, meine ursprüngliche Frage war nicht sehr klar, was ich machen möchte, also hier ist ein [Versuch einer] Erklärung:

  • Der Klartext ist die Stimme eines Wählers bei einer Wahl.
  • Pret-a-voter zielt darauf ab, end-to-end überprüfbar zu sein, ohne die Wählergeheimnisse (usw.) zu opfern. Nach der Abstimmung erhält der Wähler eine Quittung, mit der er überprüfen kann, ob seine Stimme korrekt aufgezeichnet wurde und welche später zeigt, dass seine Stimme nicht manipuliert wurde. Der Wähler vergleicht die Informationen auf seinem Empfang mit einer identischen Kopie im Internet.
  • Allerdings sollte es keinem Wähler möglich sein zu beweisen, wie er / sie gewählt hat (da dies zu Zwang führen könnte), also ist die Information nicht der Klartext, sondern eine verschlüsselte Kopie der Abstimmung.
  • Tatsächlich ist der Klartext viermal verschlüsselt, mit vier verschiedenen asymmetrischen Schlüsseln - gehalten von zwei verschiedenen Kassierern, von denen jeder zwei Schlüssel hält. So wird einem Erzähler eine Stimme (Klartext) zur Verfügung gestellt, die ihn unter Verwendung des öffentlichen Schlüssels # 1 verschlüsselt und dann diesen Geheimtext mit seinem zweiten öffentlichen Schlüssel verschlüsselt und den Chiffretext dem zweiten Erzähler gibt, der ihn mit seinen zwei Schlüsseln in demselben verschlüsselt Weg. Der resultierende Chiffretext (Ergebnis von vier sequenziellen Verschlüsselungen) wird im Web veröffentlicht (publiziert). Die Kassierer sind vertrauenswürdig.
  • Jede verschlüsselte Stimme kann als "Zwiebel" dargestellt werden, wobei das Zentrum die Stimme ist und mehrere Ebenen der Verschlüsselung vorhanden sind. Um zur Abstimmung zu gelangen, muss jede Schicht der Reihe nach entfernt werden, dh die entsprechenden privaten Schlüssel (die von den Wählern gehalten werden) müssen in umgekehrter Reihenfolge angewendet werden. Dies ist der Schlüssel zur Sicherheit - alle Kassierer müssen zusammenarbeiten, um die Stimmen zu entschlüsseln.
  • Das Web Bulletin Board kann als eine Tabelle mit 5 Spalten visualisiert werden - die erste (auf der linken Seite) enthält die vollständig verschlüsselten Abstimmungen (wird auch auf dem Empfang jedes Wählers angezeigt) und ist die einzige sichtbare Spalte während der Stimmabgabe Bühne.Die zweite Spalte enthält den gleichen Satz von Stimmen, aber mit der äußeren Schicht entfernt - Teller 2 füllt diese Spalte und Spalte 3 durch Entschlüsseln der Stimmen mit seinen privaten Schlüsseln während der Tally-Phase. Am Ende der Zählphase enthält Spalte 5 die vollständig entschlüsselten Stimmen, die dann gezählt werden können.
  • Jeder Wähler erhält eine Quittung, die ihn mit einer verschlüsselten Stimme in Spalte 1 verbindet. Dies zeigt nicht, wie er abgestimmt hat, sondern erlaubt ihm zu überprüfen, dass seine Stimme nicht manipuliert wurde, da sie dies während des Wahlprozesses überprüfen können Ihre verschlüsselte Stimme ist immer noch in Spalte 1, unberührt. Dies ist natürlich nur die Hälfte der "Ende-zu-Ende-Verifizierung", da die Wähler nicht verifizieren können, dass die Entschlüsselungen korrekt durchgeführt wurden, dh dass es in Spalte 2 einen Eintrag gibt, der ihre Stimme abzüglich der äußeren Verschlüsselungsschicht darstellt . Jeder Wähler ist nur für die Überprüfung bis zu dem Punkt der Spalte 1 verantwortlich.
  • Danach ist es Aufgabe des Auditors, zu überprüfen, ob die Einträge in Spalte 1 in Spalte 2 entschlüsselt werden und so weiter. Die Art und Weise, wie sie dies tun, beruht auf der deterministischen Verschlüsselung und den öffentlichen Schlüsseln, die für die Verschlüsselung verwendet werden, öffentlich.
  • Da öffentliche Schlüssel öffentlich sind, möchten Sie nicht, dass Personen einfach Zeilen aus Spalte 5 in Spalte 1 zeichnen und die Stimme von jemandem zusammenführen, wenn sie wiederholt verschlüsselt wird. Auf diese Weise knüpft eine Quittung, die Sie mit einer verschlüsselten Stimme verbindet Sie zu einer unverschlüsselten, lesbaren Stimme - & gt; Zwang! Daher sind nur die Spalten 1, 3 und 5 öffentlich (deshalb führt jeder Kassierer ZWEI Verschlüsselungen durch), und für jeden Eintrag in Spalte 3 wird nur einer der entsprechenden Einträge in {2,4} für die Prüfer offengelegt. Dies verhindert, dass jemand (auch Auditoren) eine verschlüsselte Abstimmung mit einer unverschlüsselten Abstimmung verknüpfen kann.
  • Die Revisoren müssen daher einen Eintrag in Spalte 3 vornehmen, den entsprechenden Eintrag in Spalte 2 und den öffentlichen Schlüssel erhalten und die gleiche Verschlüsselung durchführen, um sicherzustellen, dass sie tatsächlich den Eintrag in Spalte 2 erhalten.
  • Zusammengefasst bietet das eine End-to-End-Überprüfbarkeit.

Entschuldigung, das war so lang - ich hoffe, es beschreibt mein Bedürfnis nach deterministischen Verschlüsselungen. Ich habe viele grundlegende Details verpasst (ich habe dieses Schema stark modifiziert), aber hoffentlich sind die Kernprinzipien alle da. Vielen Dank für das Lesen - ich schätze es wirklich.

    
Chris 30.03.2011, 15:23
quelle

3 Antworten

3

Wenn Sie das Padding entfernen, wird das System unsicher. Wenn die öffentlichen Schlüssel tatsächlich öffentlich sind, wie Sie sagen, kann ein Angreifer einfach zu Spalte 5 gehen, die Klartexte nehmen und sie mit den vier öffentlichen Schlüsseln in der richtigen Reihenfolge verschlüsseln. Sie können dann die resultierenden Chiffriertexte mit denen aus den Rezepten zusammenbringen, wodurch die "no cercion" -Eigenschaft kompromittiert wird.

Das zufällige Auffüllen stoppt dies, weil der Angreifer nicht weiß, welche Füllung hinzugefügt werden soll.

Sie müssen das normale Padding verwenden, aber eine Untermenge der privaten Schlüssel für eine Untergruppe der Auditoren offenlegen (in Wahlsystemen gewöhnlich "Wahlkommissare" genannt). Dies bedeutet, dass ein Prüfer bestätigen kann, dass Spalte 1 Spalte 2 entspricht, ein anderer kann bestätigen, dass Spalte 2 Spalte 3 entspricht, und so weiter. Ein einzelner Prüfer kann einen Stimmberechtigten nicht mit einem Stimmzettel vergleichen, sondern nur mit einem Stimmberechtigten.

Der Grund dafür, dass Sie den Fehler "Nachricht ist größer als Modul" erhalten, ist, dass jeder Modul anders ist, so dass der verschlüsselte Text einer Verschlüsselung außerhalb des zulässigen Bereichs für die nächste Verschlüsselung liegt.

    
caf 31.03.2011, 06:55
quelle
1

Ссылка

Das Auffüllen ist genau dort, um zu vermeiden, dass ein bestimmter Klartext zu einem einzigen Chiffretext verschlüsselt wird. Wenn Sie also ein deterministisches (einzelnes) Ergebnis für einen beliebigen einfachen Text haben möchten, besteht die einzige Möglichkeit darin, es auszuschalten.

    
Paul Ruane 30.03.2011 16:03
quelle
0

So scheint es mir, dass Sie zwei Hauptanforderungen haben, die Sie deterministic RSA zu lösen versuchen:

  1. Wähler dürfen die Integrität ihrer Stimme gewährleisten
  2. Den Prüfern erlauben, die Integrität aller Abstimmungen sicherzustellen

Digitale Signaturen sollten dieses Problem lösen. Sie können Ihren Chiffretext aus Spalte 1 übernehmen, ihn hashen und den Hash mit einem privaten Schlüssel verschlüsseln. Dieser verschlüsselte Hash kann dann in Spalte 2 platziert werden. Um die Integrität von Spalte 1 zu verifizieren, verwenden Sie einfach den entsprechenden öffentlichen Schlüssel, um den Hash in Spalte 2, Hash-Spalte 1, zu entschlüsseln und diese 2 Werte zu vergleichen. Wenn sie gleich sind, wurden die Daten nicht manipuliert. Nur Parteien, die den privaten Schlüssel haben, könnten möglicherweise die Daten in diesen Spalten manipulieren, da nur sie ein passendes Paar bilden können. Dies ist vergleichbar mit einem HMAC, hat aber den Vorteil, öffentliche / private Schlüssel anstelle eines geheimen gemeinsamen Schlüssels zu verwenden. So kann jeder überprüfen, aber nur vertrauenswürdige Parteien können ändern.

Eine Sache, die bei deterministischen Schemata zu beachten ist, ist die Tatsache, dass Informationen auf viele Arten verloren gehen. Nehmen wir an, ich weiß, dass ich für Blue als meine Lieblingsfarbe gewählt habe. Ich kann sehen, dass der resultierende Chiffretext meiner Stimme 0x12345678 ist. Wenn das Schema vollständig deterministisch ist, weiß ich, dass jeder, der einen entsprechenden Chiffretext von 0x12345678 hat, auch für Blue gewählt hat. Da Sie in der Regel eine endliche Menge an Wahlmöglichkeiten haben, ist ein ausgewählter Klartext-Angriff unglaublich einfach. Daher möchten Sie wirklich, dass RSA seine Arbeit macht und das vorgesehene Padding-Schema verwendet.

Als nächstes sollten Sie das System vor einer Form von Replay Attack schützen, indem Sie die Stimmen nummerieren oder so ähnlich. Wie ich Ihr Schema verstehe, sieht es so aus, als ob ich irgendwie Zugang zu dem Punkt bekommen würde, wo Sie Ihre Stimmen speichern (oder mitten in irgendeiner Kommunikation), ich könnte gefälschte Abstimmungen vortäuschen oder spammen, einfach indem ich Daten, die ich bereits habe, erneut abspiele oder kopiere gesehen (ein weiteres Problem mit deterministisch sein).

    
Luke 30.03.2011 21:19
quelle