AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte VerschlüsselungsProgramm
Thema durchsuchen
Ansicht
Themen-Optionen

VerschlüsselungsProgramm

Ein Thema von devnull · begonnen am 5. Nov 2003 · letzter Beitrag vom 9. Aug 2007
Antwort Antwort
Seite 7 von 9   « Erste     567 89      
Benutzerbild von devnull
devnull
Registriert seit: 5. Okt 2003
Hi,
ich hab jetzt doch mal, angeregt von anderen Tools ein eigenes Programm geproggt.
Dies ist jedoch nur eine Demo-Version, bei der es euch erlaubt ist
> EINFACHE TEXTE
> MAXIMAL 1000 ZEICHEN
zu kodieren.

Naja, über keine Kritik würde ich mich freun.

devnull
Angehängte Dateien
Dateityp: exe datasecure.exe (399,0 KB, 187x aufgerufen)
 
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#61
  Alt 24. Aug 2005, 06:28
Ich muss den Thread noch mal hervor holen, weil ich da jetzt ein kleines Verständnisproblem habe. Bei den Verschlüsselungsalgorithmen ist immer wieder vom Seed die Rede. Was ist das eigentlich, die 'Saat'?

Dann habe ich hier die einfache Variante von Hagens RC4 Implementierung. Wo ist da der/die Seed?

Und an welcher Stelle sieht man, dass es eine 2048 Bit tiefe Verschlüsselung ist?

Dann zeigt Hagen hier wie man den RC4 Algorithmus zu einen Zufallsgenerator umfunktionieren kann. Wo und wie brauche ich das, um mit RC4 ein sicheres Verschlüsselungsprogramm zu schreiben?

Ist es ein Schwachpunkt, wenn ich von den zu verschlüsselnden Daten einen Hash bilde, die Daten verschlüssele und den Hash mit zu den Daten lege, um nach dem Entschlüsseln überprüfen zu können, ob die Daten korrekt entschlüsselt wurden?

Ich überlege nämlich, ob ich mit dem RC4 Algorithmus ein einfaches, kleines nonVCL Verschlüsselungsprogramm schreibe.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#62
  Alt 24. Aug 2005, 06:50
Zitat von Luckie:
Ich muss den Thread noch mal hervor holen, weil ich da jetzt ein kleines Verständnisproblem habe. Bei den Verschlüsselungsalgorithmen ist immer wieder vom Seed die Rede. Was ist das eigentlich, die 'Saat'?

Dann habe ich hier die einfache Variante von Hagens RC4 Implementierung. Wo ist da der/die Seed?
Ich zitiere mal den Beitrag http://www.delphipraxis.net/internal...=211572#211572

Das ist eine Delphi Unit von maximov die den RC4 von Hagen kapselt.

Code:
...
[b]procedure [/b]RC4Seed([b]const [/b]Seed: [b]String[/b]);
[b]begin [/b]
  RC4Init(RC4Random, [color=#ff0000][b]Seed[/b][/color]);
[b]end[/b];
...
[b]initialization [/b]
  RC4Seed([color=#00008b]'5C103319-9C6F-4F88-BBDC-752779958047'[/color]);
[b]end[/b].
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#63
  Alt 24. Aug 2005, 07:11
Schön, den beitrag kenne ich, aber leider wirft ja gerade der Code die Fragen auf.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

 
Delphi 2006 Professional
 
#64
  Alt 24. Aug 2005, 07:14
Zitat von Luckie:
... Was ist das eigentlich, die 'Saat'?
Hai Michael,
meinst Du Saat oder Salt?
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#65
  Alt 24. Aug 2005, 07:18
Ich habe den englischen Asudruck Seed der immer wieder auftaucht einfach übersetzt, um schon male inen Hinweis zu bekommen. Das ergab das deutsche Wort Saat. hat mir aber auch nicht viel geholfen.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

 
Delphi 2006 Professional
 
#66
  Alt 24. Aug 2005, 07:24
Hai,

der Seed ist der Startzahl die verwendet wird wenn eine Folge von Zufallszahlen erzeugt wird.
Wenn Du also immer den selben Seed setzt bekommst Du immer die selbe Folge von Zufalszahlen. In Delphi wird dies "umgangen" in dem Du Randomize aufrufst und hierbei der Seed auf eine Zahl gesetzt wird die sich (glaube ich) aus der Systemzeit berechnet.
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#67
  Alt 24. Aug 2005, 07:31
Das heißt, verwende ich beim ver- und entschlüsseln einen unterschiedlichen Seed, dann werden die Daten nicht korrekt entschlüsselt. Das heißt wiederum, der Seed entspricht dem Passwort oder?
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

 
Delphi 2006 Professional
 
#68
  Alt 24. Aug 2005, 07:39
Zitat von Luckie:
... Das heißt wiederum, der Seed entspricht dem Passwort oder?
Uff... so genau bin ich da auch nicht eingestiegen

Aber das Passwort zu verwenden macht eigentich keinen Sinn. Denn wenn dieses geknackt wurde wäre ja auch der Seed bekannt.
Bei einer Verschlüsselung verwendest Du ja neben dem Passwort noch einen Salt. Über diesen zusammengesetzten Schlüssel bildest Du dan eine Einweg Hashfunktion und mit Ergebniss verschlüsselst Du die Daten. Der Salt muss dafür natürlich unverschlüsselt in der Datei mit abgelegt werden. Denn Seed (Startwert) den Du benötigst um einen Salt (Zufallswert) erzeugen zu können legst Du in deinem Programm fest (z.B. eine GUID).
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

 
Delphi 2006 Professional
 
#69
  Alt 24. Aug 2005, 07:43
Zitat von Sharky:
Zitat von Luckie:
... Das heißt wiederum, der Seed entspricht dem Passwort oder?
Uff... so genau bin ich da auch nicht eingestiegen

Aber das Passwort zu verwenden macht eigentich keinen Sinn. Denn wenn dieses geknackt wurde wäre ja auch der Seed bekannt.
Bei einer Verschlüsselung verwendest Du ja neben dem Passwort noch einen Salt. Über diesen zusammengesetzten Schlüssel bildest Du dan eine Einweg Hashfunktion und mit Ergebniss verschlüsselst Du die Daten. Der Salt muss dafür [d]natürlich unverschlüsselt[/d] in der Datei mit abgelegt werden. Denn Seed (Startwert) den Du benötigst um einen Salt (Zufallswert) erzeugen zu können legst Du in deinem Programm fest (z.B. eine GUID).
[edit]Das mit dem unverschlüsselt war natürlich unsinn[/edit]
Ich habe hier noch einen Text von Hagen in dem er mir das einal erklärt hat. Ich hoffe er hat nichts dagegen wenn ich ihn hier post
Zitat von negaH:
Du verschlüsselst eine Datei und dabei gibt es wichtige Punkte wie man dies macht
1.) das Passwort muß in einen Sessionkey umgewandelt werden. Dazu wird das Passwort und ein Zufallserzeugter Salt benutzt. Beide Werte werden verbunden, und zwar Salt und dann Passwort. Der Salt sollte mindestens 128 Bit groß sein. Nun wird über diesen binären Wert eine Hashfunktion angewendet. Diese Hashfunktion sollte eine MGF = Mask Generation Funktion sein. Dazu wird eben NICHT einfach nur ein Hash über Salt || Passwort erzeugt, sondern die hashfunktion wird mehrmalig über sich selber angewendet und mit einem Zähler versehen. Also so ähnlich wie beim S/KEY OTP Verfahren.
2.) nun haben wir unseren Sessionkey der nur mit Hilfe des relativ kurzen Passwortes errechenbar ist. Der Salt stellt sicher das ein Angreifer nicht so ohne weiteres eine Dictionary Attacke durchführen kann. Desweiteren Randomisiert der Salt auch den erzeugten Sessionkey, d.h. mit gleichem Passwort wird aber immer ein unterschiedlicher Salt benutzt und somit immer ein unterschiedlicher Sessionkey produziert. Ergo auch die Verschlüsselung der gleichen Inhalte unterscheidet sich, sogar ohne expliziten InitVecter des Ciphers.
3.) nun, es wird nun ein zweiter Salt_2 benötigt, ebenfalls 128 Bit lang. Dieser Salt dient zur Randomisierung der Verschlüsselung. Dazu wird wiederum aus Hash(Salt_2 || Sessionkey) ein Hash produziert. Wie du siehst benutzen wir unseren Sessionkey und einen zweiten Salt dazu. Der erzeugte Hashwert + Salt_2 wird nun VOR die Message gehangen, also Data := Salt_2 || Hash(Salt_2 || Sessionkey) || Message, anschließend wird Data verschlüsselt. Da Salt_2 zufällig ist wird Hash(Salt_2 || Sessionkey) ebenfalls zufällig und die die Message zudem mit Zufallsdaten expandiert.
3.) nachdem so die Nachricht verschlüsselt wurde, muss natürlich noch der 1. Salt davor gehangen werden. Dies benötigen wir damit bei der Entschlüsselung auch der Sessionkey reproduiziert werden kann.

Nochmal als Formel:
Ciphertext = Ck(Key, Plaintext) ist die verschlüsselung.
Digest = MGF(Data, Index) ist eine Mask Generation Funktion mit hilfe eines hashs.
Salt_Key = > 128 Bit Zufallswert für den Sessionkey
Salt_Msg = > 128 Bit Zufallswert für die Nachricht
|| = Konkatenation, Zusammenhängen von binären Daten
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

 
Delphi 10 Seattle Enterprise
 
#70
  Alt 24. Aug 2005, 07:49
Zitat von Luckie:
Das heißt, verwende ich beim ver- und entschlüsseln einen unterschiedlichen Seed, dann werden die Daten nicht korrekt entschlüsselt. Das heißt wiederum, der Seed entspricht dem Passwort oder?
Im Prinzip ja:

Wie schon in dem gutem altem Turbo Pascal, kannst Du bei den Zufallszahlen auch den Seed setzten.
Früher hatte ich mal so verschlüsselt

@Hagen: Bitte nicht hauen (Ich bin mir ziemlich sicher, das diese Verschlüsselung nicht sicher ist)
  • [edit]
    Ich wusste doch, das Hagen dazu was geschieben hat, war sogar in diesem Thread.
    [equote="Hagen schieb in http://www.delphipraxis.net/internal...=207146#207146 "]Die Verwendung von Random() in der Kryptographie scheint meiner Meinung nach die meist empfohlene und die schwachsinnigste Idee unter Delphi Programmierern zu sein.[/equote]
    Also nicht benutzen, das Beispiel dient nur zur Demostration was der Seed ist. (Initialisierungswert eines Zahlengenerators)
    Und das der Seed durchaus auch das Passwort sein kann.
    [/edit]
Delphi-Quellcode:
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  s: string;
begin
  s := 'Test';

  // Verschlüsseln
  RandSeed := 5;
  for i := 1 to length(s) do
  begin
    s[i] := chr(ord(s[i]) XOR Round(random(255)));
  end;

  // Entschlüseln (Copy und Paste (ohne Änderung) von Verschlüsseln)
  RandSeed := 5;
  for i := 1 to length(s) do
  begin
    s[i] := chr(ord(s[i]) XOR Round(random(255)));
  end;

  // string ausgeben (Kontrolle)
  Caption := s;
end;
...
Aber in der Hilfe von Delphi steht:
Zitat:
Um den Zufallszahlengenerator zu initialisieren, rufen Sie Randomize einmal auf oder weisen der Variable RandSeed vor dem Aufruf von Random einen Wert zu.

Hinweis: Die Implementierung der Funktion Random kann sich bei einer anderen Compiler-Version ändern. Sie sollten Random daher nicht für Verschlüsselungen oder andere Einsatzbereiche verwenden, in denen reproduzierbare Pseudozufallszahlen benötigt werden.
Falls Du das mal Testen willst, hier das Ganze als Funktion:
Delphi-Quellcode:
function MachWas(s: string; Schluessel: LongInt): string;
var
  i: Integer;
begin
  RandSeed := Schluessel;
  for i := 1 to length(s) do
  begin
    s[i] := chr(ord(s[i]) XOR Round(random(255)));
  end;
  Result := s;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 9   « Erste     567 89      


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 16: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