Einzelnen Beitrag anzeigen

Basti_sz

Registriert seit: 25. Jan 2009
7 Beiträge
 
#1

RSA Verschlüsselung - Access Violation

  Alt 25. Jan 2009, 12:55
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
Danke schon mal im Voraus für eure Hilfe.

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