Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi RSA verschlüsselung funktioniert nicht... (https://www.delphipraxis.net/112042-rsa-verschluesselung-funktioniert-nicht.html)

Bblackhawk 14. Apr 2008 11:42


RSA verschlüsselung funktioniert nicht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
hi, ich habe ein programm für die verschlüsselung mit dem RSA verfahren gebastelt, bekkomme die entschlüsselung aber leider nicht hin...

ich gehe euch mal eben einen kleinen überblick über mein Programm...

Dies ist die grafische Oberfläche...
(jetzt im anhang (von admin so vorgeschrieben))
die Schlüssel haben wie ihr gleich im quelltext seht nichts zu sagen...

Delphi-Quellcode:
procedure tcodiermaschine.verschluesseln;
var i, acode : integer;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(Klartext[i]);
      // 2 Durch formel ( C = M^e mod N ) verschlüsseln
      acode := (acode + round(exp(7*ln(5))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      codetext[i] := chr(acode);
    end;
end;

procedure tcodiermaschine.entschluesseln;
var i : single;
var acode : extended;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := (acode - round(exp(23*ln(146))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;
Dies sind die procedure's für die ent- und verschlüsselung...
Die verschlüsselung funktioniert, aber bei der entschlüsselung haut delphi immer die Fehlermeldung raus, dass die Schleifenvariable falsch sei...
Dies habe ich schon versucht mit dem Datentypen integer versucht zu behen, aber dafür sind die Zahlen einfach zu groß (bei diesem Beispiel wäre die zahl mit der man mod rechnet bei etwa 3,6*10^46)

Ich hoffe ihr habt eine gute Lösung für mein Problem...
Vielen Dank schonmal im voraus... :)

greetz
Bblackhawk

Klaus01 14. Apr 2008 11:45

Re: RSA verschlüsselung funktioniert nicht... BITTE HELFT MI
 
Delphi-Quellcode:
var i : single;
var acode : extended;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
i sollte vom Typ Byte oder Integer (Ganzzahling) sein
Single ist hier nicht richtig.

Grüße
Klaus

gammatester 14. Apr 2008 12:12

Re: RSA verschlüsselung funktioniert nicht... BITTE HELFT MI
 
Das ist selbst im Ansatz kein RSA:

Delphi-Quellcode:
      // 2 Durch formel ( C = M^e mod N ) verschlüsseln
      acode := (acode + round(exp(7*ln(5))) mod 187);
Hier wird ja "nur" ein fester Wert drauf addiert im Gegensatz zur Formel. Wenn Du diese andere Art Verschlüsselung akzeptierst, ist die Entschlüsselung natürlich

Delphi-Quellcode:
       acode := (acode - round(exp(7*ln(5))) mod 187);
.

Aber implementiere mal nach den Formel, benutzte Integerarithmetik und suche nach "Schnelle Modulare Exponentation" (im wesentlich ausmultiplizieren und nach jedem Schritt mod ausführen).


Gruß Gammatester

Corpsman 14. Apr 2008 12:40

Re: RSA verschlüsselung funktioniert nicht... BITTE HELFT MI
 
In diesem Sample hier wird ein RSA gemacht, bzw wenigstens mal gezeigt.

Sharky 14. Apr 2008 12:47

Re: RSA verschlüsselung funktioniert nicht... BITTE HELFT MI
 
Hai Bblackwawk.

Ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS" :hello:

Eine "bitte" habe ich an Dich. Ändere den Titel deines Threads und nehme das "bitte helft mit!!!" heraus.

Hilfe sucht hier so ziemlich jeder ;-)

Wie das geht? Ganz einfach. Klicke bei deinem obersten Posting auf den "Edit-Button".

danke.

p.s. und hänhe bei der gelegenheit das Bild als Anhang an dein Posting.

Bblackhawk 14. Apr 2008 13:24

Re: RSA verschlüsselung funktioniert nicht...
 
zu #2 das problem ist, dass es dann, wenn ich den datentypen von i ändere, folgendes nicht mehr funktioniert...
Delphi-Quellcode:
klartext[i] := chr(acode);
zu #3 es ist nur ein beispiel.. also sind das nur testzahlen, damit das überhaupt erstmal funktioniert... ;)

zu #4 danke das bringt mich schon etwas weiter.. aber damit habe ich immernoch das problem, dass ich da nur zahlen verschlüsseln kann, was ich aber brauche sind texte... trotzdem vielen dank :)

Vielen dank nochmal für eure mühe... :)

habt ihr evtl noch vorschläge die funktionieren würden?

nice greetz
Bblackhawk

Klaus01 14. Apr 2008 13:38

Re: RSA verschlüsselung funktioniert nicht...
 
Zitat:

Zitat von Bblackhawk
zu #2 das problem ist, dass es dann, wenn ich den datentypen von i ändere, folgendes nicht mehr funktioniert...
Delphi-Quellcode:
klartext[i] := chr(acode);

Mit Verlaub, aber das glaube ich nicht das dem so ist.
Wenn Klartext bei Dir ein String ist, dann sind die Indizes
des Strings vom Typ Integer (Ganzzahl) und kein realWert.

[edit]
Warum ist bei acode so definiert:
Delphi-Quellcode:
var acode : extended;
Auch hier braucht es keinen Realwert sondern nur einen Ganzzahlwert
den Ord(...) liefert auch nur ein Integer zurück.

Delphi-Quellcode:
procedure tcodiermaschine.entschluesseln;
var
  i : Integer;
  acode : Integer;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := (acode - round(exp(23*ln(146))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;
[/edit]

Grüße
Klaus

Bblackhawk 14. Apr 2008 13:52

Re: RSA verschlüsselung funktioniert nicht...
 
genau, dass hatte ich vorher auch so...
aber ich benutze extended, weil der wert von acode bei ca 3,6*10^46 liegt --> integer ist nicht ausreichend um dies darzustellen...

ich kopiere mal das, was delphi mir als fehlermeldung raushaut, vielleicht, bringt das weiter...

Dies wird von delphi ausgegeben...
[DCC Fehler] ukrypto.pas(70): E2032 FOR-Schleifenvariable muss von ordinalem Typ sein
[DCC Fehler] ukrypto.pas(73): E2010 Inkompatible Typen: 'Integer' und 'Single'
[DCC Fehler] ukrypto.pas(77): E2010 Inkompatible Typen: 'Integer' und 'Single'
[DCC Fehler] ukrypto.pas(77): E2008 Inkompatible Typen
[DCC Fehler] umain.pas(8): F2063 Verwendete Unit 'ukrypto.pas' kann nicht compiliert werden

Klaus01 14. Apr 2008 13:57

Re: RSA verschlüsselung funktioniert nicht...
 
Also das untere wird bei mir ohne Problem compiliert.

Delphi-Quellcode:
procedure entschluesseln(klarText:String;codetext:String);
var
  i : Integer;
  acode : int64; // auf int64 geändert
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := (acode - round(exp(23*ln(146))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  entschluesseln(edit1.Text,edit2.Text);
end;
Deine Fehler müssen woanders stecken.

Grüße
Klaus

MrKnogge 14. Apr 2008 13:58

Re: RSA verschlüsselung funktioniert nicht...
 
Dann verwendest du irgendwo noch Singles.

Bblackhawk 14. Apr 2008 14:06

Re: RSA verschlüsselung funktioniert nicht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
dann haut der mir noch mehr fehler raus aus der system datei...

ich hab mal das projekt in den anhang gestellt, vielleicht kannst du damit ja was anfangen *hoff*

danke nochmal..

ich hab solangsam keine ahnung mehr woran das liegt...

nice greetz
Bblackhaek

gammatester 14. Apr 2008 15:07

Re: RSA verschlüsselung funktioniert nicht...
 
Zitat:

Zitat von Bblackhawk
dann haut der mir noch mehr fehler raus aus der system datei...

ich hab mal das projekt in den anhang gestellt, vielleicht kannst du damit ja was anfangen *hoff*

danke nochmal..

ich hab solangsam keine ahnung mehr woran das liegt...

nice greetz
Bblackhaek

Wie schon gesagt, Du benutzt gar kein RSA. Man kann Dein Programm so ändern, daß wieder "Klartext" erscheint:

Verschlüsseln:
Delphi-Quellcode:
      // 2 Durch formel ( C = M^e mod N ) verschlüsseln
      //  acode := (acode + round(exp(7*ln(5))) mod 187);
      acode := (acode + 146) mod 187;
Hinweis: round(exp(7*ln(5)) mod 187 = 5^7 mod 187 = 146.

Entschlüsseln:
Delphi-Quellcode:
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      // acode := (acode - round(exp(23*ln(146))) mod 187);
      acode := (acode + 41) mod 187;
Hinweis: 41 = -146 mod 187.

Gruß Gammatester

Bblackhawk 14. Apr 2008 15:22

Re: RSA verschlüsselung funktioniert nicht...
 
das das noch kein wirklicher rsa ist, ist mir klar, anstatt der zahlen, kommen da noch varablen hin, nur erstmal muss das generell funktionieren...

die zahlen sind nur ein beispiel, ich werde das, wenn das mit den beispielzahlen klappt, noch erweitern und mit edit fenstern machen...

muss nur erstmal klappen ;)

Klaus01 14. Apr 2008 15:25

Re: RSA verschlüsselung funktioniert nicht...
 
Hallo,

im Prinzip sollte RSA so laufen.
Problem dabei ist, es kommen dabei sehr große Zahlen
ins Spiel. Da reicht int64 nicht mehr.

Hier im Forum gibt es einige Beispiele mit BigInt.
Diese Typen wären dazu eher geeignet.
Grüße
Klaus

Delphi-Quellcode:
{
  RSA : p=7 q=11
  p * q = 77 = N
  phi(N) = (p-1)* (q-1) = 60
  e teilerfremd zu phi(N) = 23
  -> e=23 und N=77 public Key
  wird zum Verschlüsseln benötigt

  Berechnung der inversersen zu e
   e* d +k * phi(N) ? 1 = ggT(e,phi(N))
   23 * d + k * 60 = 1 = ggT(23,60)
   23 * 47 + (-18) * 60 = 1
   -> d = 47 N=77 -> privater Schlüssel

}

// für power die math unit einbinden

procedure tcodiermaschine.verschluesseln;
var i, acode : integer;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(Klartext[i]);
      // 2 Durch formel ( C = M^e mod N ) verschlüsseln
      acode := round(power(acode,23)) mod 77;
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      codetext[i] := chr(acode);
    end;
end;

procedure tcodiermaschine.entschluesseln;
var i : integer;
var acode : int64;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := round(power(acode,47)) mod 77;
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;

Bblackhawk 14. Apr 2008 15:58

Re: RSA verschlüsselung funktioniert nicht...
 
vllt dummer frage, aber wie binde ich die "math" unit ein??

:oops:

TeronG 14. Apr 2008 16:14

Re: RSA verschlüsselung funktioniert nicht...
 
Zitat:

Zitat von Bblackhawk
vllt dummer frage, aber wie binde ich die "math" unit ein??

:oops:

Delphi-Quellcode:
uses math

Bblackhawk 14. Apr 2008 21:27

Re: RSA verschlüsselung funktioniert nicht...
 
wenn ich jetz versuche mein projekt zu compilieren kommt folgender fehler:

Erste Gelegenheit für Exception bei $7C812A7B. Exception-Klasse EInvalidOp mit Meldung 'Invalid floating point operation'. Prozess krypto.exe (2096)

ich weiß nicht mehr was ich machen soll :(

Klaus01 15. Apr 2008 06:47

Re: RSA verschlüsselung funktioniert nicht...
 
Guten Morgen,

die Meldung kommt nicht beim Kompilieren sondern wenn Du das Programm ausführst.
Wie in meinem letzten Beitrag schon erwähnt kommen hier recht schnell sehr große Zahlen
zustande. Deine Fehlermeldung ist das Resultat davon. Die Zahlen verlassen
den zulässigen Wertebereich.

Du könntest Deinen Versuch mit kleineren Primzahlen durchführen.
Damit wird auch e und d kleiner.

Oder schau Dir einmal das DecMath von Hagen an. Das kann mit solchen
großen Zahlen umgehen.

Grüße
Klaus

gammatester 15. Apr 2008 08:35

Re: RSA verschlüsselung funktioniert nicht...
 
Zitat:

Zitat von Klaus01
Du könntest Deinen Versuch mit kleineren Primzahlen durchführen.
Damit wird auch e und d kleiner.

Oder schau Dir einmal das DecMath von Hagen an. Das kann mit solchen
großen Zahlen umgehen.

Das mit den kleineren Primzahlen wird wohl wenig bringen, und auch DEC erscheint mir hier für jemanden, der nicht weiß, wie Unit math benutzt wird, nicht Erfolg versprechend.

Statt der Powerroutine aus math kann er mal folgende Integer-Power-Funktionn verwenden:

Delphi-Quellcode:
function IPowMod(a,b,n: int64): int64;
  {-Berechnet a^b mod n}
var
  p: int64;
begin
  p := 1;
  while b > 0 do begin
    while b and 1 = 0 do begin
      b := b shr 1;
      a := (a * a) mod n;
    end;
    dec(b);
    p := (p * a) mod n;
  end;
  IPowMod := p;
end;
Ergebnis von IPowMod(123,60000,997) ist zB 966. 123^60000 ist ein Zahl mit über 400000 Bits also riesig im Verbleich mit den 64 Bits von double.

Gruß Gammatester

Bblackhawk 15. Apr 2008 16:04

Re: RSA verschlüsselung funktioniert nicht...
 
warscheinlich nerv ich euch schon so richtig, aber entweder bin ich einfach zu dumm oder es geht einfach nicht...

wenn ich die function IPowMod inplementiere, dann bekomm ich schon wieder fehlermeldungen rausgehaun...

und zwar folgende:

[DCC Fehler] ukrypto.pas(17): E2065 Ungenügende Forward- oder External-Deklaration: 'tcodiermaschine.IPowMod'
[DCC Fehler] krypto.dpr(5): F2063 Verwendete Unit 'ukrypto.pas' kann nicht compiliert werden

könnt ihr mir vllt nochmal helfen, wär echt nett von euch :oops:

Vielen dank nochmal und nochmal im voraus...

nice greetz
Bblackhawk

gammatester 15. Apr 2008 16:09

Re: RSA verschlüsselung funktioniert nicht...
 
Zitat:

Zitat von Bblackhawk
warscheinlich nerv ich euch schon so richtig, aber entweder bin ich einfach zu dumm oder es geht einfach nicht...

wenn ich die function IPowMod inplementiere, dann bekomm ich schon wieder fehlermeldungen rausgehaun...

und zwar folgende:

[DCC Fehler] ukrypto.pas(17): E2065 Ungenügende Forward- oder External-Deklaration: 'tcodiermaschine.IPowMod'
[DCC Fehler] krypto.dpr(5): F2063 Verwendete Unit 'ukrypto.pas' kann nicht compiliert werden

könnt ihr mir vllt nochmal helfen, wär echt nett von euch :oops:

Vielen dank nochmal und nochmal im voraus...

nice greetz
Bblackhawk


IPowMod muss im Quellcode vor der Verwendung stehen und muß nicht mit tcodiermaschine.IPowMod aufgerufen werden, nur zB i:=IPowMod(2,10,55);

Gammatester

Klaus01 15. Apr 2008 16:10

Re: RSA verschlüsselung funktioniert nicht...
 
füge die Funktion vor die Methoden, kodieren und dekodieren ein.
Oder mache aus Ihr eine Methode Deines Objektes.

Grüße
Klaus

Bblackhawk 15. Apr 2008 16:33

Re: RSA verschlüsselung funktioniert nicht...
 
der will bei mir immernoch nich...

ich stelle euch mal zur show, was ich da gebaut hab (is aus der klasse ukrypto)...

Delphi-Quellcode:
UNIT ukrypto;

INTERFACE
 USES sysutils;

 TYPE tcodiermaschine=class(TObject)
          private
             klartext,codetext: string;
          public
             constructor create;
             function IPowMod(a,b,n:int64): int64;
             procedure setklartext(text: string);
             procedure setchiffre(text: string);
             function getklartext: string;
             function getchiffre: string;
             procedure verschluesseln(c: string);virtual;
             procedure entschluesseln(c: string);virtual;
 end;
so, dann gehts weiter mit der IPowMod
Delphi-Quellcode:
function IPowMod(a,b,n: int64): int64;
  {-Berechnet a^b mod n}
var
  p: int64;
begin
  p := 1;
  while b > 0 do begin
    while b and 1 = 0 do begin
      b := b shr 1;
      a := (a * a) mod n;
    end;
    dec(b);
    p := (p * a) mod n;
  end;
  IPowMod := p;
end;
(steht direkt hinter dem Constructor)
so und zum schluss die procedure zum verschlüsseln...
Delphi-Quellcode:
procedure tcodiermaschine.entschluesseln;
var i : integer;
var acode : int64;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := IPowMod(  a:146, b:23, n:187 ); //(acode - round(exp(23*ln(146))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;
folgende Fehler:

[DCC Fehler] ukrypto.pas(93): E2003 Undefinierter Bezeichner: 'a'
[DCC Fehler] ukrypto.pas(97): E2029 '.' erwartet, aber ';' gefunden
[DCC Fehler] ukrypto.pas(11): E2065 Ungenügende Forward- oder External-Deklaration: 'tcodiermaschine.IPowMod'
[DCC Fehler] krypto.dpr(5): F2063 Verwendete Unit 'ukrypto.pas' kann nicht compiliert werden

wie gesagt, keine ahnung mehr...

vielen dank wiedermal für die hilfe...

very nice greetz
Bblackhawk

Klaus01 15. Apr 2008 19:32

Re: RSA verschlüsselung funktioniert nicht...
 
Hallo,

wenn Du das so machst:

Delphi-Quellcode:
UNIT ukrypto;

INTERFACE
USES sysutils;

TYPE tcodiermaschine=class(TObject)
          private
             klartext,codetext: string;
          public
             constructor create;
             function IPowMod(a,b,n:int64): int64;
             procedure setklartext(text: string);
             procedure setchiffre(text: string);
             function getklartext: string;
             function getchiffre: string;
             procedure verschluesseln(c: string);virtual;
             procedure entschluesseln(c: string);virtual;
end;
dann solltest Du dies so machen:

Delphi-Quellcode:
function tcodiermaschine.IPowMod(a,b,n: int64): int64;
  {-Berechnet a^b mod n}
var
  p: int64;
begin
  p := 1;
  while b > 0 do begin
    while b and 1 = 0 do begin
      b := b shr 1;
      a := (a * a) mod n;
    end;
    dec(b);
    p := (p * a) mod n;
  end;
  IPowMod := p;
end;
Grüße
Klaus

Bblackhawk 15. Apr 2008 19:56

Re: RSA verschlüsselung funktioniert nicht...
 
da hab ich wieder ein diesmal aber kleines problem :oops:

Delphi-Quellcode:
procedure tcodiermaschine.entschluesseln;
var i : integer;
var acode : int64;
begin
  // Klartext zu ASCII
    for i := 1 to length (klartext) do
    begin
      // 1 ASCII- Code der i-ten Buchstaben ermitteln
      acode := ord(codetext[i]);
      // 2 Durch formel ( M = C^d mod N ) verschlüsseln
      acode := IPowMod( a:146, b:23, n:187 ); //(acode - round(exp(23*ln(146))) mod 187);
      // 3 Das Zweichen mit dem ASCII- Code acode an der i-ten Stelle im chiffre ablegen
      klartext[i] := chr(acode);
    end;
end;
wenn ich das so schreibe sagt der mir:

[DCC Fehler] ukrypto.pas(93): E2003 Undefinierter Bezeichner: 'a'
[DCC Fehler] ukrypto.pas(97): E2029 '.' erwartet, aber ';' gefunden
[DCC Fehler] krypto.dpr(5): F2063 Verwendete Unit 'ukrypto.pas' kann nicht compiliert werden

wie soll ich das sons schreiben????
is doch genau wie die struktur bei IPowMod...

nice greetz
Bblackhawk

Klaus01 15. Apr 2008 20:07

Re: RSA verschlüsselung funktioniert nicht...
 
Vielleicht so:

Delphi-Quellcode:
acode := IPowMod(146,23,187 )
Du solltest IPowMod mit Parametern füttern, die Namen der Paramter
werden da nicht mehr gebraucht.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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