| Autor |
Beitrag |
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: So 28.09.03 16:50
Hab das hier schon in nem anderen Froum gepostet, da scheint aber irgendwie nix wirklich funktionierendes rauszukommen, dann hab ich mir überlegt, dass ich es hier vielleich nommal poste...
| Zitat: | hi!
ich bin hier grad dabei n RSA-Chat für die schule zu schreiben und hab da ein problem. und zwar beim wichtigesten punkt überhaupt. bei der ver-/entschlüsselung. und zwar "reicht mir der int64" nicht aus. gibt es irgendwie ne möglicheit diesen "kleinen" zahlen zu entspringen?
der RSA berechnet sich so:
(k^c) mod n = g
(g^d) mod n = k
[ k= klar"text", g= geheim"text", c+d+n: schlüssel].
so also diese "Hoch"s machen mir schwierigkeiten. und zwar will ich n kompletten int64 als schlüssel (also in dem fall jeweils ein kompletter int64 für c, einer für d und einer für n) nehmen. wenn ich jetz aber ein zeichen (z.B. #255) hab, kann ich das net no hoch nen "komplett gefüllten" int64 machen, weil mir da meine datenstrukturen nemme ausreichen... muss ja irgendwie gehn, aber ich glaub ich steh grad irgendwie aufm schlauch....
MrSaint
P.S.: Da es was für die Schule is, und ich mich vor meinem lehrer net "bloßstellen" will, will ich eigentlich keine RSA Kompo benutzen
|
wir hatten in dem anderen Forum schon ein ergebniss:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function FastExpMod(x, n, p: Int64): Int64; var z: Int64; begin if (n = 0) then begin Result := 1; exit; end; if Odd(n) then result := (x * FastExpMod(x, n - 1, p)) mod p else begin z := FastExpMod(x, n div 2, p); result := (z * z) mod p; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToStr(FastExpMod(5, 4, 11))); end; |
Aber die Funktion läuft leider nicht für große zahlen... da gibt sie nicht-korrekte werte aus... ich hab dann auch noch das hier probiert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function calculate(k,c,n:int64):int64; begin if c<1 then result := 1 else begin result := k*calculate(k,c-1,n) mod n; end; end; |
Aber die gibt mir Stack-Überläufe... (bringt au nix, wenn ich alle Variablen zu Pointern mache).
Jemand hat dann noch gemeint, dass ich doch besser mit Logarithmen arbeiten sollte anstatt mit Potenzen, weil das Ergebnis das gleiche sei, ich aber eben nicht mit so großen Zahlen klar kommen müsste.. bloß: WIE??? ich hab beim Logarithmieren irgendwie n Problem mit dem modulo, weil ich net weiß wie ich damit umgehen soll...
Help?
MrSaint
P.S.: Sorry für den vielen Text
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Zuletzt bearbeitet von MrSaint am Di 30.09.03 13:55, insgesamt 1-mal bearbeitet
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 28.09.03 18:47
Ich will dir ja nicht in dein ehrgeiztiges Projekt reinreden, aber vielleicht sind mir doch ein paar Anmerkungen gegönnt
1. Wie bekommst du denn ein so großes n? Schließlich muss das n ein Produkt von zwei Primzahlen sein, und die sind demzufolge auch schon sehr groß. Wie bekommst du die?
2. Das c und d sind natürlich auch nicht beliebig.
Aber ich gehe mal davon aus, dass du weisst, wie RSA funktioniert und du die Wert korrekt ermittelst.
3. Man sollte wirklich nicht mit int64-Werten arbeiten, und dann zeichen für Zeichen kodieren. Besser wäre da, mehrere Buchstaben auf einmal zu nehmen. Überlege mal, wie viele Zeichen du in eine int64 Zahl unterbringenkannst...
4. Wenn das ein Chat für die Schule werden soll, dann geht es doch bestimmt um das PRINZIP des RSA-Verfahrens, und nicht darum, vertrauliche Daten, die die nationale Sicherheit betreffen, durch die Welt zu schicken, oder? nimm doch erstmal kleine Zahlen, die tuns für solche Zwecke auch.
(3+4) Kleine Werte für n etc verringern die Sicherheit, aber wenn sowieso jedes Zeichen einzelnen kodiert wird, geht die Sicherheit auch irgendwie flöten...
Zu deinem Problem: Das letzte gibt nen Stack-Überlauf? Kein Wunder, bei DER Rekursionstiefe...Überleg mal, wieviele rekursive Funktionsaufrufe gemacht werden müssen, bevor mit der Berechnung begonnen wird...
Die Funktion FastExpMod sollte es eigentlich tun, wie kontrollierst du denn die Ergebnisse? Oder gibts auch da nen Stack-Überlauf?
Wenn alles nix hilft, musst du dir halt nen neuen Integer-Typen definieren. Mit Hilfe von Arrays z.b. Aber dann musst du auch dafür sorgen, wie man mit diesem Datentyp dann rechnet...
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: So 28.09.03 19:02
erstmal DANKE für deine antwort  klar darfst du ein paar Anmerkungen machen, sonst würd ich ja net posten
zu 1. und 2.: ich generier die entweder per Maple oder mit ner eigenen Routine (dann unter Benutzung von ner Primzahl-rausfind-DLL die nich von mir is). c,d und n sind auf jeden Fall korrekt und entsprcchen den Vorgaben des RSA. Sicher.
3. Das Problem is, dass wenn ich große Schlüssel hab, der Geheim"text" (also bis zum Zeichen #255) eben auch riesig werden können, und ich somit entscheiden hab, dass ich da für jedes Zeichen n int64 nehm, damit ich sicher geh, dass die ganzen kodierten (und sehr großen) Daten auch "reinpassen" wollte ursprünglich eben jedes Zeichen in ein neues Zeichen (char) kodieren, aber das klappt net.. also -> int64.
4. Hmmm.. ja scho... für kleine Schlüssel klappts ja auch wunderbar, aber eben für die großen net... und wenn ich so n programm schreib, dann will ich eben au dass man "große" schlüssel benutzen kann.. und daran hakts im moment eben :/
Jo, das letzte gibt n Stack Überlauf  is ja auch, wie du schon gesagt hast, irgendwo verständlich
Die FastExpMod gibt mir als kodierte Zahlen ganz kleine Zahlen (einstellig) zurück, obwohl es eigentlich ziemlich große zahlen sein sollten... und wenn ich etwas mit nem großen schlüssel verschlüssel und dann direkt wieder entschlüssel, kommt nur "datensalat" (d.h. nix lesbares) raus... bei kleinen Schlüsseln klappts wunderbar... Stack-Überlauf gibts da keinen... ach ja, maple bekommt das au net ohne probleme gebacken, wenn ich ganz normal (k^c) mod n mit nem großen c eingeb.. besse gesagt, das bekommts gar net gebacken... dem sind die zahlen zu groß... aber wenn ich jedesmal ein "mod n" drin hab (-> 2. funktion), dann müssten die Zahlen klein genug bleiben... aber die muss ich eben zu oft aufrufen *grml* weiß keiner was?
| Zitat: |
Wenn alles nix hilft, musst du dir halt nen neuen Integer-Typen definieren. Mit Hilfe von Arrays z.b. Aber dann musst du auch dafür sorgen, wie man mit diesem Datentyp dann rechnet...
|
eben.. muss doch au irgendwie anders zu berechnen sein
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 28.09.03 19:53
Hmm, keine Ahnung, wo dein Problem liegt. Ich habe mal die funktion rauskopiert und getestet mit
Delphi-Quelltext 1:
| ShowMessage(IntToStr(FastExpMod(65, 432323453434355732, 1112989782323131))); |
Das sind natürlich keine gültigen Werte für RSA (wäre zumindest ein merkwürdiger Zufall...), aber da wird eine ziemlich goße Zahl ausgegeben... ungefähr 437205463325440.
Die Funktion funktioniert also schon irgendwie. Das einzige, was möglich ist, dass die Zahl, negativ wird, aber das kriegt man behoben, indem man einfach noch mal die "modulo-Zahl" draufaddiert.
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: So 28.09.03 20:08
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TClientFrm.Button1Click(Sender: TObject); var help,c,d,n:int64; begin c:=7; d:=74368806461143; n:=104116349456429; help:=FastExpMod(65, c, n); ShowMessage(IntToStr(help)); ShowMessage(Inttostr(FastExpMod(help,d,n))); end; |
Das geht aber net... und die Keys sind korrekt! Bei der 2. Showmessage misste ich n 65 bekommen, tu ich aber net  ich bekomm irgendwas langes, nicht negatives (weiß die zahl nu net)....
MrSaint
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 28.09.03 20:31
Also die einzige Fehlerquelle, die mir im monent einfällt, sind die keys. Gib doch mal bitte die ausgangswerte (also die beiden Primzahlen, von denen du ausgehst). Vielleicht ist da doch irgendwo ein fehler drin. manchmal sieht man ja selbst die offensichtlichsten Fehler nicht.
Ich geh dann mal durch, ob da irgendwo was schiefläuft. Natürlich nur wenn du willst, denn p und q sind ja geheim 
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 11:36
also die zahlen oben waren per zufall generiert (also die primzahlen).. kann die nu net wieder herbekommen... aber ich hab neue gemacht...
P: 12819953
Q: 2835733
C: 5
D: 7270789624973
N: 36353963780549
mit denen gehts auch nicht...
MrSaint
EDIT: Die Schlüssel hab ich mit Maple überprüft und die stimmen... hab nun auch noch was gefunden, wo man den RSA doch mit Maple berechnen kann und das Ergebnis ist KORREKT. Es muss also an der FastExpMod liegen...
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 12:38
mir is gerade was aufgefallen: Die Verschlüsselung von FastExpMod stimmt mit obigem Key noch. Aber die Entschlüsselung nicht mehr. dann hab ich doch gerade gemeint, dass ich etwas gefunden habe, womit man das RSA auch mit Maple berechnen kann. und zwar hab ich das vorher so versucht:
Quelltext
dann gibt es die overflow exception (maple). aber so gehts:
Quelltext
bin in maple net so forciert (und versteh zugegebenermaßen die hilfe in dem punkt au net ganz  ), aber so kann maple das berechnen.
wenn das nichts zu bedeuten hat:könnte es vielleicht sein, dass es irgendeinen unterschied beim "mod" in Delphi und beim "mod" in maple gibt? eigentlich is es ja n direkter assembler-befehl, aber könnte ja sein  ich glaub nämlich grad irgendwie, dass das alles erst passiert wenn c^d > n...
MrSaint
P.S.: wegen der berechnung die du da oben durchegührt hast: Maple gibt 167211380056528 aus, nich 437205463325440  und da vertrau ich eher maple 
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 13:45
... und nochmal ich
ich glazub ich schnall jetzt so langsam richtig ab... hab 2 weitere Fuktionen gefunden, aber kein funktioniert... nummer 1:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68:
| function GCD(const N1, N2: Int64): Int64; var X, Y, J : Int64; begin X := N1; Y := N2; if X < Y then Swap(X, Y); While (X <> 1) and (X <> 0) and (Y <> 1) and (Y <> 0) do begin J := (X - Y) mod Y; if J = 0 then begin Result := Abs(Y); exit; end; X := Y; Y := J; end; Result := 1; end;
function InvMod(const A, N: Int64): Int64; var g0, g1, v0, v1, y, z : Int64; begin if N < 2 then raise EInvalidArgument.CreateFmt ('InvMod: n=%d < 2', [N]); if GCD(A, N) <> 1 then raise EInvalidArgument.CreateFmt ('InvMod: GCD(a=%d, n=%d) <> 1', [A, N]); g0 := N; g1 := A; v0 := 0; v1 := 1; while g1 <> 0 do begin y := g0 div g1; z := g1; g1 := g0 - y * g1; g0 := z; z := v1; v1 := v0 - y * v1; v0 := z; end; if v0 > 0 then Result := v0 else Result := v0 + N; end;
function ExpMod(A, Z: Int64; const N: Int64): Int64; var Signed : Boolean; begin Signed := Z < 0; if Signed then Z := -Z; Result := 1; while Z <> 0 do begin while not Odd(Z) do begin Z := Z shr 1; A := (A * Int64(A)) mod N; end; Dec (Z); Result := (Result * Int64(A)) mod N; end; if Signed then Result := InvMod(Result, N); end; |
(Quelle: fundementals.sourceforge.net/cMaths.html )
2.:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| function ModExp(a,b,n : Int64) : Int64; var d,t: Int64; i: Integer; begin if (b = 0) then begin Result := 1 mod n; end else if (b < 0) then begin Result := (-1); end else begin d := 1; i := Trunc(logn(2, b)); while (i >= 0) do begin d := (d*d) mod n; t := Trunc(Power(2,i)); if ((b and t) <> 0) then d := (d*a) mod n; i := i - 1; end; Result := d; end; end; |
(Quelle: rattlesnake.at.box.s...rbeit/facharbeit.doc )
... und dann noch einen.. der is aber net Delphi, sondern "written for Philip A. Nelson's threaded code compiler, named Bc"... ich könnt ihn wohl übersetzen, bis auf die zeile " x /= 2".. das weiß ich net, was das heißen soll.. ( "%" is in C soweit ich weiß ja n "mod")
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| define modexp(a, x, n) a = ( a * a ) % n x /= 2 } return(r) } |
(Quelle: www.linuxjournal.com/article.php?sid=6695 )
Kann mir irgendjemand weiterhelfen? ich kanns eigentlich gar net glauben, dass es da so viele funktionen dafür gibt, aber irgendwie keine wirklich funktioniert
MrSaint
P.S.: Langsam wirds aber wirklich seeehhhhr viel Text... tut mir leid
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.09.03 15:09
Zu dem C-Problem: x/=2 ist ne Kurform für x:=x/2. So was geht in c++, und man kann damit verwirrende Sachen schreiben...
Und so viele verschiedene Methoden zum Potentieren sind das ja auch nicht...
Guck dir mal die Funktionen ExpMod, ModExp und FastExpMod genauer an. Und versuche sie Zeile für Zeile zu verstehen, auch die Mathematik dahinter. Was z.B. bedeutet die Zeilen Delphi-Quelltext 1: 2: 3:
| if ((b and t) <>0) then... Z:=Z shr 1; while not Odd(Z) do... |
Wenn dir klar wird, was da passiert, dann wird dir auch klar, dass alle drei Funktionen im Grunde dasgleiche machen. Nur macht die eine das rekursiv, die andere iterativ. Und "Z shr 1" ist das gleiche wie "Z:=Z / 2", (wenn Z gerade ist).
Such also nicht nach weiteren Methoden zum Potenzieren, sondern verwende die, die du schon hast. Ich hab jetzt lange gesucht, und in den Funktionen keinen Fehler gefunden
Irgendwo muss mit dem Typ int64 und den verwendeten Funtionen Div, mod etc. was schief gehen.
Denn die Werte für c und d scheinen wirklich zu stimmen, zumindest ergibt c*d=1 mod phi(n)...
Sorry, das ich da nich weiter helfen kann bisher.
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 15:41
*brumm*
hab das Problem nun identifiziert: Ein Integerüberlauf!  Hab in den Projektoptionen die Überlaufsprüfung eingeschaltet...
Bleibt mir was anderes übrig als Schlüssel in ihrer Größe noch stärker zu begrenzen?
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.09.03 17:06
Jepp, das könnte die Lösung sein.
Natürlich bleibt dir was andres übrig:
den überlauf abzufangen oder darauf entsprechend zu reagieren
Leider fällt mir da im moment keine realisierbare Lösung ein. Das einzige, was mir einfällt, ist die Multiplikation (denn da tritt der Überlauf wohl auf) durch wiederholte Addition und MOD-Rechnung zu machen, aber das kannst du bei den großen Zahlen vergessen.
d.h.-Moment.... probier mal mit derselben Technik wie in FastExp eine Funktion "FastMult" zu machen. Also eine rekursive ode iterative Funtkion, die Stückweise den Wert a*b durch b-faches addieren von a ermittelt und zwischendurch immer wieder MODelt. Das könnte klappen.
Dadurch wird das alles zwar langsamer, aber nicht VIEL langsamer...
Ich muss jetzt erstmal ein paar ikea-möbel aufbauen.
_________________ We are, we were and will not be.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.09.03 18:33
Der MöbelTyp, bei dem ich helfen sollte, hat es sich anders überlegt, also kann ich hier helfen
so gehts:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| function TForm1.FastExpMod(x, n, p: Int64): Int64; var z: Int64; begin if (n = 0) then begin Result := 1; exit; end; if odd(n) then result := FastMultMod(x,FastExpMod(x, n - 1, p),p) else begin z := FastExpMod(x, n div 2, p); result := FastMultMod(z,z,p); end;
end;
function TForm1.FastMultMod(x, n, p: Int64): Int64; var z: Int64; begin if (n = 1) then begin Result := x; exit; end; if odd(n) then result:=(x + FastMultMod(x, n - 1, p)) mod p else begin z := FastMultMod(x, n div 2, p); result := (z + z) mod p; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin c:=5; d:=7270789624973; n:=36353963780549; help:=FastExpMod(spinedit1.value, c, n); ShowMessage(IntToStr(help)); ShowMessage(Inttostr(FastExpMod(help,d,n))); end; |
Und das ganze geht auch in Nullkommanix...
| MrSaint hat folgendes geschrieben: |
Hab das hier schon in nem anderen Froum gepostet, da scheint aber irgendwie nix wirklich funktionierendes rauszukommen, dann hab ich mir überlegt, dass ich es hier vielleich nommal poste... |
Habs ja schon immer gewusst, dass dieses Forum das beste ist!
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 18:41
hei! *freu* *um den Hals fall*
BIG BIG THX!!!!!!!!!!!!!!!!!!!!!!!!
funzt!  nur um's nochmal klarzustellen, die FastMultMod berechnet (x*n) mod p, nich?
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 19:24
*grml* zu früh gefreut.... es funzt zwar wenn ich eine einzelne Zahl da durchjage, wenn ich aber meine encode/decode methode ansetz, gibts wieder n Stack-Überlauf  jetzt kotzt mich das langsam richtig an...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| type TRSAString=array [1..256] of int64;
...
function TRSA.decode(text:TRSAString;priv_key,n:int64):TRSAString; var i:integer; begin i:=0; ClearRSAString(result); while (i<length(text)) do begin inc(i); result[i]:=FastExpMod(ord(text[i]),priv_key,n); end; end; |
MrSaint
Moderiert von Tino: Code- durch Delphi-Tags ersetzt.
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
mirage228
      
Beiträge: 338
Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
|
Verfasst: Mo 29.09.03 19:34
Hi,
hast du schon versucht unter "Projekt" --> "Optionen" --> "Linker" unter "Max. Stackgrösse" die Größe des Stacks zu erhöhen?
mfG
mirage228
_________________ May the source be with you, stranger.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mo 29.09.03 19:36
jo, die hab ich schon an den Anschlag geregelt, bringt aber nix...
so ne *mist*e...
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.09.03 21:22
Fragen, nur mal nebenher
- Warum ist TRSAstring ein Array mit 256 Elementen? wäre es nicht sinnvoller, da ein dynamisches array zu nehmen, um beliebig lange texte kodieren zu können?
- in der Zeile result[i]:=FastExpMod(ord(text[i]),priv_key,n); von decode, was soll da das ord? text[i] is doch schon der int-wert! Das ord brauchst du nur für ENCODE!
Aber zu deinem Problem.
Ich weiss, warum es zum Stack-overflow kommt!
1. Es muss heissen
Delphi-Quelltext 1:
| while (i<length(text)-1) |
zumindest mit dem dynamischen-array, was ich hier jetzt habe.
DENN der Wert in Text[length(text)], den du versuchst zu dekodieren, hat den Wert 0 oder so.
Es wird also FastExpMod(0,priv_key,n)
berechnet. Das ist natürlich =0. Während der Rekursion gibts auch den Aufruf Delphi-Quelltext 1:
| result := FastMultMod(x,0,p) |
Und genau das gibt die Endlos-Rekursion, die den Stack zumüllt. Schau dir FastMultMod ddafür nochmal an!
Also: in die Funktion FastMultMod muss am anfang das hier rein:
Delphi-Quelltext 1: 2: 3: 4: 5:
| if (n=0) OR (x=0) then begin Result := 0; exit; end; |
Dann gehts. Hoffe auch bei dir, da ich beim rumprobieren etwas an deinen Funktionen rumgefuscht habe...
_________________ We are, we were and will not be.
|
|
MrSaint 
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Di 30.09.03 13:55
jo, logisch
ich war wohl gestern nemme so aufnahmefähig  jetzt läuft es auf jeden Fall perfekt und ich bedanke mich vielmals bei deiner Hilfe!
*verbeug*
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 481
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Di 30.09.03 15:53
(fast) kein Problem. Jetzt am Ende aber noch was andres:
Dir ist schon klar, dass das, was du da machst praktisch nix mit RSA zu tun hast? Das ist praktisch so, als würde ich in meinen GolfII Scheiben aus Panzerglas einbauen, damit keiner einbrechen kann...Schliesslich gehen die Türen mit nem Schraubenzieher auch auf...
Wenn du jedes Zeichen einzeln kodierst, dann wird jedes "a" immer auf die gleiche Zahl kodiert. Und dieses Verschlüsselungsverfahren ist genau so leicht zu knacken wie mein Golf, auch ohne meinen "privaten" Schlüssel. Nämlich durch einfache Häufigkeitsanalysen. Sicherlich kennst du auch diese Kreuzwort-Rätsel, wo man den Zahlen die korrekten Buchstaben zuordnen muss...Da sitzt man 1-2 Stunden dran, und man hat den Code...
Im Klartext: Die ganze Bemühung mit int64 etc. war bisher UMSONST, wenn du nicht anfängst, Zeichenblöcke gleichzeitig zu kodieren!!
_________________ We are, we were and will not be.
|
|
|