![]() |
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:
Ich hoffe der Fehler ist offensichtlich für jemanden :D
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; Danke schon mal im Voraus für eure Hilfe. Ich hoffe der Code reicht aus und ist einigermaßen Verständlich. |
Re: RSA Verschlüsselung - Access Violation
In welcher Zeile tritt der Fehler denn auf? Würde die Suche etwas eingrenzen... :glaskugel:
|
Re: RSA Verschlüsselung - Access Violation
Möglichweise ist aber In64 auch zu klein für ein Zwischenergebnis
|
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; |
Re: RSA Verschlüsselung - Access Violation
Welchen Wert hat z zu diesem Zeitpunkt?
|
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?
|
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.
|
Re: RSA Verschlüsselung - Access Violation
Zitat:
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). |
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 |
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 10:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz