Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RSA Verschlüsselung - Access Violation (https://www.delphipraxis.net/128161-rsa-verschluesselung-access-violation.html)

Basti_sz 25. Jan 2009 12:55


RSA Verschlüsselung - Access Violation
 
Hallo,

ich bin gerade dabei eine RSA-Verschlüsselung und -Entschlüsselung zu programmieren. Das wichtigste dabei ist das Finden von Primzahlen und die Primfaktorzerlegung eines Produkts zweier Primzahlen.

Es kann sein, dass der Code ziemlich umständig geschrieben sit. Er funktioniert jedoch für n bis ungefähr 900.000 (vielleicht sogar ein bisschen mehr). Wenn ich dann eine größere Zahl eingebe, was immernoch eine INT64 Zahl sein müsste kommt di Fehlermeldung "ACCESS VIOLATION ON ADDRESS ...".
Manchmal passert auch folgendes: Ich gebe eine Zahl für n ein und er berechnet sie. Beim nächsten mal gebe ich wieder die gleiche Zahl für n ein und die Fehlermeldung erscheint.

CODE: Das Programm beginnt mit der Prozedur primfinden.

Delphi-Quellcode:
 VAR
ergebnis: array[0..1] of int64;
temp   : array of int64;
prims  : array of int64;
timer  : cardinal;


implementation

uses index;

function potenzieren(basis:Integer;exponent:Int64):Int64;
VAR i,zahl:Int64;
Begin
 i:=0;
 zahl:=1;
 WHILE i<exponent DO Begin
                      inc(i);
                      zahl:=zahl*basis
                     End;
 result:=zahl;
End;


procedure primfinden(n :int64);
Var grenze,i,k,z,count : int64;
Begin

 setlength(temp,n);
 i:=0;
 While i<(n-1) Do Begin temp[i]:=i+2; inc(i); End;

 {grenze:=wurzel(n);} {setzt die größte Zahl, die man quadrieren kann, ohne die Grenze n zu überschreiten}

 i:=2;
 z:=0;

 While i<n Do Begin {Das sind die Zahlen, die man multipliziert um nichtPrimzahlen zu finden}

                      k:=i; {der Koeffizient, der für jedes i von neuem von 1 größer wird}
                      Repeat Begin

                               z:=i*k;

                               IF ((i=k) AND (z>n))
                               THEN i:=n;

                               temp[z-2]:=0;

                               

                               inc(k);
                              End;
                      Until z>n;
                      inc(i);

                     End;
 i:=0;
 count:=0;
 WHILE i<(n-1) DO BEGIN IF temp[i]<>0 THEN inc(count); inc(i) End;

 setlength(prims,count);
 k:=0;
 i:=0;
 Form1.ListBox1.clear;
 WHILE i<(n-1) Do Begin
                IF temp[i]<>0
                THEN Begin
                      prims[k]:=temp[i];
                      index.Form1.list(inttostr(prims[k]),inttostr(k));
                      inc(k);
                     End;
                inc(i);
               End;

End;

procedure primfaktorzerlegen(n : int64);
Var i: int64;
Begin
 i:=0;
 While i<n DO Begin
               IF n mod prims[i] =0
               THEN Begin
               
                     ergebnis[0]:=prims[i];
                     ergebnis[1]:=trunc(n/ergebnis[0]);
                     Form1.Edit3.Text:='Zeit: '+IntToStr(gettickcount - timer);
                     i:=n;
                    End;
                inc(i);    
              End;
End;
Ich hoffe der Fehler ist offensichtlich für jemanden :D
Danke schon mal im Voraus für eure Hilfe.

Ich hoffe der Code reicht aus und ist einigermaßen Verständlich.

Meflin 25. Jan 2009 12:57

Re: RSA Verschlüsselung - Access Violation
 
In welcher Zeile tritt der Fehler denn auf? Würde die Suche etwas eingrenzen... :glaskugel:

mkinzler 25. Jan 2009 13:00

Re: RSA Verschlüsselung - Access Violation
 
Möglichweise ist aber In64 auch zu klein für ein Zwischenergebnis

Basti_sz 25. Jan 2009 13:03

Re: RSA Verschlüsselung - Access Violation
 
Sorry, hab vergessen die Zeile zu nennen.

Er tritt ziemlich in der Mitte auf: In der While-Schleife: temp[z-2]:=0;

mkinzler 25. Jan 2009 13:05

Re: RSA Verschlüsselung - Access Violation
 
Welchen Wert hat z zu diesem Zeitpunkt?

Basti_sz 25. Jan 2009 13:14

Re: RSA Verschlüsselung - Access Violation
 
Das weiß ich leider nicht. Es wird nirgends angezeigt. Gibt es denn eine gute Methode bei Delphi das herauszufinden welche Werte die Variablen haben?

mkinzler 25. Jan 2009 13:17

Re: RSA Verschlüsselung - Access Violation
 
Ich hoffe, ich erzähl dir nichts neues, wenn ich ich vom Delphi-Debugger rede. Schau dir den Ablauf doch im Debugger an und überwache z.

Meflin 25. Jan 2009 13:18

Re: RSA Verschlüsselung - Access Violation
 
Zitat:

Zitat von Basti_sz
Das weiß ich leider nicht. Es wird nirgends angezeigt. Gibt es denn eine gute Methode bei Delphi das herauszufinden welche Werte die Variablen haben?

´
Du kannst einen Breakpoint setzen (links neben der Zeile in den Rand klicken, dann erscheint da ein roter Boppel), dann wird das Programm, wenn es diese Zeile ausführt, angehalten, und du kannst dir im Debugger die Werte der Variablen betrachten (einfach mit der Maus draufzeigen).

Basti_sz 25. Jan 2009 14:02

Re: RSA Verschlüsselung - Access Violation
 
Ich habe einen Fehler schon mal gefunden:

Vor temp[z-2]:=0 muss noch die Bedingung z<=n hinzugefügt werden. Ansonsten will eine Stelle des Arrays ändern, die es gar nicht gibt.
Habe schon die Zahl 7.000.000 zerlegt. Hat zwar für meinen Geschmack zu lange gedauert aber es hat geklappt.

Als ich dann 2^32 (also: 4.294.967.296) eingegeben habe kam ein neuer Fehler.

Undzwar gleich bei der ersten While-Schleife in der Procedure primfinden:

While i<(n-1) Do Begin temp[i]:=i+2; inc(i); End;

Es ist wieder die gleiche Fehlermeldung EAccessViolation

mkinzler 25. Jan 2009 14:05

Re: RSA Verschlüsselung - Access Violation
 
Und der Array hat zu diesem Zeitpunkt i + 1 Einträge?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr.
Seite 1 von 2  1 2      

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