Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RSA-Verschlüsselung (https://www.delphipraxis.net/132432-rsa-verschluesselung.html)

taker875 12. Apr 2009 16:41


RSA-Verschlüsselung
 
hallo,

hab da nun ein problem bei dem ich nicht so richtig weiter komme. es geht um ein programm für die rsa verschlüsselung.

Fehler :

Im Projekt1.exe ist eine Exception der Klasse EInvalidOp aufgetreten. Meldung 'Ungültige Gleitkommaoperation'. Prozess wurde angehalten. ...

habe den fehler nun lokalisiert mit dem durchgehen des programms per F7. der fehler ist hier:
Delphi-Quellcode:
k := Round(Power(ORD(s[i]),e)) mod N;
e=11 und n=p*q (p=3, q=7)

was mache ich nun falsch?^^ wenn jemand das ganze programm brauch einfach melden.

vielen dank und noch schöne restliche ostern

3_of_8 12. Apr 2009 18:19

Re: RSA-Verschlüsselung
 
EDIT: Erste, falsche Vermutung gelöscht.

Die entstehende Gleitkommazahl ist einfach zu groß, um sie dann zu nem Integer zu runden. Auch Int64 ist nicht groß genug. Es gibt spezielle Algorithmen, um diese Potenzen in Restwertklassen effizient durchzuführen. Such doch einfach mal nach RSA hier im Forum, da findest du Dutzende von Threads zu dem Thema, in dem genau das gleiche Problem auftritt.

taker875 12. Apr 2009 19:14

Re: RSA-Verschlüsselung
 
habe ein thema gefunden in dem um das gleiche ging. aber da ist auch keine wirkliche lösung raus gekommen. da gab es als lösung nur :

Zitat:

TheAn00bis hat folgendes geschrieben:
Danke und gibt es auch noch eine Möglichkeit mit Double oder Extended mod (modulo) zu verwenden? Muss ich mir die Funktion jetzt selber schreiben?

Modulo gibt es (ebenso wie den div-Operator) nur für ganzzahlige Typen (Byte, shortInt, LongInt, Cardinal,...). Modulo für Real-Typen wäre (wenn es sowas gäbe) aber nicht sinnvoll, da diese die Zahlen anders speichern als beispielsweise Integer. Bei Real-Typen ist die Genauigkeit nämlich begrenzt. Wenn ein Real-Typ z.B. auf 6 Stellen genau arbeitet, dann werden solche Zahlen wie 123.456.789.012 nur als 123.456.000.000 gespeichert. Die Zahl 123.456.789.999 würde ebenfalls als 123.456.000.000 gespeichert, obwohl es eine andere Zahl ist, da die Genauigkeit des Real-Typs nicht mehr Stellen hergibt. Das hätte zur Folge, dass beide Zahlen trotz ihrer Ungleichheit das selbe Ergebnis liefern, wenn man Modulo auf sie anwendet. Und das ist ja wohl nicht erwünscht.
Also gibt es nur zwei Möglichkeiten: entweder du bleibst mit den Potenzen im Bereich von Int64, oder du nimmst Double (bzw. Extended) für größere Zahlen und musst dich dann damit zufrieden geben, dass es in diesem Bereich kein Modulo mehr gibt.
Die dritte und aufwendigste Methode wäre, sich einen eigenen Ganzzahl-Datentyp zu basteln. Für den müsste man dann aber auch alle Rechenoperationen neu programmieren.

MfG
Binärbaum
also nicht wirklich ne eindeutige lösung. wie kann ich denn nun das ganze umsetzen für eine rsa verschlüsselung?

bin nicht der delphi experte^^

aber vielen dank

Klaus01 12. Apr 2009 20:37

Re: RSA-Verschlüsselung
 
.. oder es vielleicht mal hiermit probieren.

Delphi-Quellcode:
function expmod(b,x,m : integer) : integer;
  var
    quad,halb,erg : Integer;
   {
    Berechnet die diskrete Exponentialfunktion b hoch x modulo m
    unter ausschließlicher Verwendung der Operationen Quadrieren
    und Multiplizieren. Der Rest wird nach jeder Operation bestimmt,
    um große Zwischenergebnisse zu vermeiden
    mod bezeichnet die Modulo-Operation
    div bezeichnet die ganzzahlige Division
   }
begin
  Quad := b;
  Halb := x;
  Erg := 1;
  while Halb > 0 do
    begin
      if Halb mod 2 > 0 then
         Erg := (Erg * Quad) mod m;
       Quad := (Quad * Quad) mod m;
       Halb := Halb div 2;
    end;
  result := Erg
end;
Grüße
Klaus

taker875 20. Apr 2009 14:10

Re: RSA-Verschlüsselung
 
erstmal vielen dank für die hilfe hat so wirklich gut gefunzt. bin nun schon so gut wie fertig habe da aber noch eine kleine sache.

wenn ich ein edit feld habe, in welches ich etwas eingeben kann. dann möchte, dass er ohne einen klick auf einen button sofort das in dem editfeld in die variable schreibt während ich es dort rein schreibe.

Delphi-Quellcode:
procedure TForm2.E_qChange(Sender: TObject);
begin
E_e.text :='';
E_n.text :='';
E_n0.text :='';
E_d.text :='';
end;
also bei diesem feld, dass er bei eingabe den wert sofort in die variable "Unit1.q" schreibt.

hoffe ihr versteht meine frage. danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz