Delphi-Quellcode:
function RSAUncrypt(KeyM,KeyF: Integer,CryptedText: string): string;
const
Offset = 47;
i: Integer;
begin
setlength(Result,length(CryptedText));
for i := 1 to length(CryptedText) do
Result[i] := Power(Ord(CryptedText[i])-Offset,KeyF) mod KeyM;
end;
Das kann niemals funktionieren
1.) wird mit Fließkommazahlen in Power() gearbeitet und diese können nur maximal 48Bit exakt darstellen. Bei RSA arbeitet man immer mit Ganzzahlen und exakten Berechnngen die auf minidestens 1024 Bit exakt sein müssen. Dh. die Zahlen liegen in Größenordnung 2^1024 und nicht nur 2^48.
2.) wird eine modulare Division im Ganzzahlbereich mit Fließkomma gemischt, das kann der Compiler garnicht übersetzen, inkompatible Datentypen (Power() mod X)
3.) wird die Zahl erst potenziert entstehen rießiggroße Zahlen, rechne mal aus wie groß 2^1024^(2^1024) ist. Dh. überlicherweise rechnet man nicht X^Y mod N so wie es als Formel erscheint, sondern man rechnet mit der Binären Modulare Exponentation die quasi jeden Einzelschritt einer Exponentation modular durchführt. Die maximal größte auftrentende Zahl dabei ist zweimal größer in Bits als das Modul N.
Also auch der Hinweis auf IntPower() ist kontraproduktiv.
4.) wird bei RSA niemals eine Nachricht Zeichenweise ver/entschlüsselt. Dies reduziert die erwünschte Sicherheit des Gesamtverfahrens auf defakto NULL. Normalerseise wird man bei RSA nur in Blöcken a X Bits arbeiten, wobei X meistens >= 1024 ist.
5.) es ist tödlich eine RSA Nachricht direkt mit RSA zu verschlüsseln, dies ist unsicher ! Normalerweise werden heute nur sogenannte Hybridsysteme verwendet. Ein per Zufall erzeugter Schlüssel mindestens 128 Bit groß wird mit RSA verschlüsselt. Die eigentliche Nachricht wird mit einem symmetrischen Verfahren verschlüsselt wobei eben unser Zufallsschlüssel als Passwort dient. Die verschlüsselte Nachricht enthält also mindestens 2 Datenbereiche -> 1.) mit RSA geschützer Zufallskey 2.) Nachricht mit diesem Zufallskey verschlüsselt.
Je nach deiner Aufgabenstellung gehst du folgendermaßen vor:
1.) der Lehrer möchte nur das du demonstrativ RSA erklärst:
- dann reichen Int64 Berechnungen aus da du mit in Wirklichkeit absolut unsicheren Zahlenbereichen arbeiten kannst, quasi Mini-RSA rein zu Demonstration der Mathematik
- du benötigtst eine modulare Exponentation Funktion die du selber schreiben musst. Hier in der
DP findest du mehrere Postings dazu -> suche "binäre modulare Exponentation"
- du benötigst eine 3'rd Party Bibliothek die dir mal schnell par Mini-RSA Schlüssel erzeugst die du dann Hardcoded in deinem Source einbaust. Ich meine du willst ja nicht die RSA Schlüsselerzeugung demonstrieren.
- wenn doch benötigst du noch Funktionen zur Primzahlerzeugung (maximal 2^31 Zahlenbereich, auch das findest du hier in der
DP)
- und eine Funktion um das Modulare Multiplikative Inverse zu berechnen -> A = B^-1 mod N. Dazu benötigt man den erweiteren euklidschen GCD, auch dafür gibts Source hier in der
DP
2.) der Lehrer möchte eine ECHTE RSA von dir
- du benötigst auf alle Fälle eine Bibliothek/Sourcecode der alle notwendigen mathematischen Operationen auf Zahlen der Größenordnung <= 2^4096 berechnen kann
- ich meine ja das deine Lehrer von dir nicht erwarten kann das du selber so eine Lib codest (naja eigentlich doch, aber dazu braucht man zeit)
- deshalb wäre es gerechtfertig eine fertige Library zu benutzen, auch das gibts für Delphi, jedoch ist die Auswahl in JAVA und C/C++ größer
- die weiteren Schritte sind gleich zu 1.)
Gruß Hagen