Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Eine BigInt Klasse + RSA-Beispiel (https://www.delphipraxis.net/73917-eine-bigint-klasse-rsa-beispiel.html)

peanut 25. Jul 2006 16:39


Eine BigInt Klasse + RSA-Beispiel
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich habe vor einiger Zeit eine BigInt-Klasse implementiert und sie erfolgreich in einigen Verschlüsselungsprojekten eingesetzt.

Die BigInt-Klasse implementiert große (big, large oder huge) Integerzahlen, die in einem dynamischen Array von 32-Bit-Werten gespeichert werden. Die Basis ist demnach 2^32, wobei man sich darüber keine großen Gedanken machen muss, da Konvertierungsfunktionen zur Basis 10 bereitstehen. Wer möchte, kann die einzelnen digits jedoch auch direkt ansprechen und verändern.

Implementiert wurden Vergleichsoperatoren (>, <, =, >= usw.) und arithmetische Funktionen wie +, -, *, div, mod, exp sowie der erweiterte Euklidsche Algorithmus, so dass man ohne all zu großen Aufwand die typischen asymmetrischen kryptografischen Verfahren implementieren kann (für Elliptische Kurven muss man die Klasse um Punktoperationen erweitern, das sollte jedoch kein all zu großes Problem darstellen.).

Die Lizenz ist fair :lol: - habe ich von Assarbad übernommen, ich hoffe mal, er verzeiht mir...

Klasse:
Siehe Anhang und Text oben.

Beispiel:
Erzeugt RSA-Schlüssel bis 4096bit. Mehr sollte man nicht wählen, das dauert sonst zu lange. Ich habe auf Wunsch nun auch noch die zwei Funktionen rsa_encrypt und rsa_decrypt implementiert, mit denen man Puffer beliebiger Länge verschlüsseln kann. Ich rate aber dringend davon ab, ganze Dateien auf diese Weise zu verschlüsseln. Häufig wird mit RSA nur ein zufällig erstellter Schlüssel z.B. für AES oder RC4 mittels RSA verschlüsselt, der Rest wird dann mittels AES/RC4 und dem zufälligen Schlüssel "unkenntlich" gemacht.

Gruß peanut.

Dax 25. Jul 2006 16:48

Re: Eine BigInt Klasse
 
Bitte häng doch deinen Code (der ja nicht kurz ist) als Anhang an. Danke :)

PS: OpenSource wäre doch die bessere Sparte gewesen? In die Codelib sollen verzugsweise kleine Schnipsel :)

shmia 26. Jul 2006 17:12

Re: Eine BigInt Klasse + RSA-Beispiel
 
Falsch!!!
Delphi-Quellcode:
procedure TBigInt.Free;
begin
  if (Assigned(Self)) then
  begin
    ZeroMemory(@FDigits[0], DigitCount*4); // object might handle prime factors for
    SetLength(FDigits, 0);                // crypto keys - overwrite memory with zeros
    FNegative := False;
    Inherited Free;
  end;
end;
Richtig:
Delphi-Quellcode:
destructor TBigInt.Destroy;
begin
   ZeroMemory(@FDigits[0], DigitCount*4); // object might handle prime factors for
                                      // crypto keys - overwrite memory with zeros
// SetLength(FDigits, 0); // Delphi destroys dyn. arrays
   inherited;
end;

DP-Maintenance 26. Jul 2006 17:15

DP-Maintenance
 
Dieses Thema wurde von "Dax" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.
Passt hier dann doch besser ;)

himitsu 26. Jul 2006 18:33

Re: Eine BigInt Klasse + RSA-Beispiel
 
ich auch, ich auch ._.
Delphi-Quellcode:
procedure TBigInt.Free;
begin
  if (Assigned(Self)) then
  begin
    ZeroMemory(@FDigits[0], DigitCount*4); // object might handle prime factors for
    SetLength(FDigits, 0);                // crypto keys - overwrite memory with zeros
    FNegative := False;
  end;
  Inherited Free;
end;
Inherited Free; oderauch nur Inherited; (der Name kann hier weggelassen werden) muß unbedingt aufgerufen werden, also wenn du schon eine IF-Abrfage machst, dann muß dieses außerhalb stehen

Und wie mein Vorgänger schon sagte ... der Rest wird eh freigegeben (aber nur, wenn INHERITED aufgerufen wird)
Delphi-Quellcode:
procedure TBigInt.Free;
begin
  ZeroMemory(@FDigits[0], DigitCount*4); // object might handle prime factors for
  Inherited Free;                       // crypto keys - overwrite memory with zeros
end;

Dax 26. Jul 2006 18:40

Re: Eine BigInt Klasse + RSA-Beispiel
 
Himi, du enttäuschst mich :(

Finalisationscode gehört immer in den Destruktor! :warn:

Free ist nicht umsonst nur als
Delphi-Quellcode:
if Assigned(Self) then
  Destroy;
implementiert... Und vor allem statisch. Free ist nur deshalb die Freigabemethode der Wahl, eben deshalb, weils mit .Destroy bei ner Nil-Referenz knallt, bei Free nicht.

sir-archimedes 26. Jul 2006 19:18

Re: Eine BigInt Klasse + RSA-Beispiel
 
Zitat:

Zitat von himitsu
ich auch, ich auch ._.
Delphi-Quellcode:
procedure TBigInt.Free;
begin
  if (Assigned(Self)) then
  begin
    ZeroMemory(@FDigits[0], DigitCount*4); // object might handle prime factors for
    SetLength(FDigits, 0);                // crypto keys - overwrite memory with zeros
    FNegative := False;
  end;
  Inherited Free;
end;
Inherited Free; oderauch nur Inherited; (der Name kann hier weggelassen werden) muß unbedingt aufgerufen werden, also wenn du schon eine IF-Abrfage machst, dann muß dieses außerhalb stehen

Aber das ist doch totaler Blödsinn, oder? Wenn ich mich nicht ganz irre (und ich will es jetzt nicht nachschauen), prüft auch das Free von TObject erst, ob self assigned ist und ruft dann den Destructor auf. Das heißt wenn auch auf jeden Fall Inherited aufgerufen wird, ist das Ergebnis immer das gleiche.

Desweiteren ist die Möglichkeit, Methoden zu überschreiben ja teilweise auch dazu gedacht, die ursprüngliche Methode nämlich nicht immer, sondern nur im passenden Moment aufzurufen... Daher gehört das inherited sicherlich nicht immer nach außen, ans Ende oder sonst wohin!

Triples 26. Jul 2006 20:46

Re: Eine BigInt Klasse + RSA-Beispiel
 
Hallo
könntest du nicht mal ein beispiel Projeckt adden,habe keine ahnung wie ich das nutzen kann!
Ich selber was nun nicht was ich machen muß um RSA anzuwenden?
Bin für jede hilfe dankbar :P
Grüße
Triples

Code:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if edit1.text='Hilfe' then begin
  enabel.Butten1
showmessage(' Das Kennwort ist Richtig!');
    close;
  end else begin
    showmessage(' Das Kennwort ist FALSCH!');
    edit1.SelectAll;
    edit1.SetFocus;
  end;
end;

peanut 26. Jul 2006 20:50

Re: Eine BigInt Klasse + RSA-Beispiel
 
Hallo,

habe es korrigiert und mich für himitsu's Vorschlag entschieden... Danke für die Hinweise!

Zitat:

Zitat von Triples
könntest du nicht mal ein beispiel Projeckt adden

Ja, kommt in den nächsten Tagen.

Flocke 27. Jul 2006 07:15

Re: Eine BigInt Klasse + RSA-Beispiel
 
Zitat:

Zitat von peanut
Hallo,

habe es korrigiert und mich für himitsu's Vorschlag entschieden... Danke für die Hinweise!

Aber das ist gerade die "nicht so gute" Variante gewesen (sorry Himi).

Was shmia vielleicht hätte etwas hervorheben sollen und was Dax auch schon geschrieben hat: du solltest nie die Methode Free überschreiben sondern immer den Destruktor Destroy, und das mit override - dort gehört dein Aufräumcode hinein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr.
Seite 1 von 3  1 23      

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