AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Eine BigInt Klasse + RSA-Beispiel
Thema durchsuchen
Ansicht
Themen-Optionen

Eine BigInt Klasse + RSA-Beispiel

Ein Thema von peanut · begonnen am 25. Jul 2006 · letzter Beitrag vom 6. Feb 2021
Antwort Antwort
Seite 1 von 3  1 23      
peanut
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 - 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.
Angehängte Dateien
Dateityp: zip bigint_207.zip (7,6 KB, 389x aufgerufen)
Dateityp: zip biginttestsuit_388.zip (9,9 KB, 262x aufgerufen)
 
Dax
 
#2
  Alt 25. Jul 2006, 17:48
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
  Mit Zitat antworten Zitat
shmia

 
Delphi 5 Professional
 
#3
  Alt 26. Jul 2006, 18:12
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;
Andreas
  Mit Zitat antworten Zitat
26. Jul 2006, 18:15
Dieses Thema wurde von "Dax" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.
Passt hier dann doch besser
Benutzerbild von himitsu
himitsu
Online

 
Delphi 12 Athens
 
#5
  Alt 26. Jul 2006, 19:33
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;
  Mit Zitat antworten Zitat
Dax
 
#6
  Alt 26. Jul 2006, 19:40
Himi, du enttäuschst mich

Finalisationscode gehört immer in den Destruktor!

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.
  Mit Zitat antworten Zitat
sir-archimedes

 
Delphi 2006 Professional
 
#7
  Alt 26. Jul 2006, 20:18
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!
  Mit Zitat antworten Zitat
Triples
 
#8
  Alt 26. Jul 2006, 21:46
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
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;
  Mit Zitat antworten Zitat
peanut
 
#9
  Alt 26. Jul 2006, 21:50
Hallo,

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

Zitat von Triples:
könntest du nicht mal ein beispiel Projeckt adden
Ja, kommt in den nächsten Tagen.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

 
Delphi 10.2 Tokyo Professional
 
#10
  Alt 27. Jul 2006, 08:15
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.
Volker
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 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