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:
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:
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.
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.
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.
So scheint es mir, dass Sie zwei Hauptanforderungen haben, die Sie deterministic RSA
zu lösen versuchen:
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).
Tags und Links java encryption rsa encryption-asymmetric deterministic