Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Verschlüsselung + binäre datein


elundril - Do 21.12.06 19:10
Titel: Verschlüsselung + binäre datein
ich hab mir folgenden Algorithmus zusammengebastelt für eine asymetrische (ich denke 128 Bit) verschlüsselung.

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:
25:
26:
27:
28:
29:
30:
31:
procedure TForm1.verschlüsselnOnClick(sender: TObject);
var Key: array [1..16of Byte;
    Zeichenindex, Keyindex: integer;
    Zeichen: Byte;
begin
  Key[1]:=56;
  Key[2]:=156;
  Key[3]:=16;
  Key[4]:=51;
  Key[5]:=15;
  Key[6]:=26;
  Key[7]:=196;
  Key[8]:=155;
  Key[9]:=1;
  Key[10]:=12;
  Key[11]:=217;
  Key[12]:=200;
  Key[13]:=58;
  Key[14]:=86;
  Key[15]:=85;
  Key[16]:=93;
  Keyindex:=1;
  Memo2.clear;
  for Zeichenindex:=1 to length(Memo1.text) do begin
    if x>16 then
      x:=1;
    Zeichen:=ord(Memo1.text[Zeichenindex]) XOr Key[x];
    Memo2.text:=chr(b);
    x:=x+1;
  end;
end;


ich wollte mal fragen wie gut diese Verschlüsselungsmethode ist und wie man sie optimieren könnte.

und wie ich das anstellen könnte damit ich z.b.: auch audiodatein oder Bilddatein verschlüsseln könnte.

lg el


Moderiert von user profile iconChristian S.: Topic aus Sonstiges (Delphi) verschoben am Fr 22.12.2006 um 18:49


elundril - Fr 22.12.06 16:37

*push*

is es überhaupt eine 128 Bit verschlüsselung??

lg el


Corpsman - Fr 22.12.06 22:05

Also ich glaube ja nicht das es eine 128 Bit verschlüsselung ist.

Du kannst jede Xbeliebiuge Datei verschlüsseln wenn du es mit einel Filestream machst.

Du lädst die File



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var f,f2:Tfilestream;
   b:Byte;
begin
..
assignfile(f,Dateiname);
Assignfile(f2,Dateiname2);
rewrite(f2);
reset(f);
while not eof(f) do begin
f.read(b,sizeof(b));
b := VerschlüsseleByte(b);
f2.write(b);
end;
closefile(f);
Closefile(f2);


Irgendwie so kannst es machen. Hab das aber mal so blind hingetippt.


elundril - Sa 23.12.06 11:14

ok danke! werd mich mal mit TFilestreams beschäftigen.

was sagst du, is die verschlüsselung halbwegs gut??

lg el


Corpsman - Sa 23.12.06 13:56

nu ich denke es kommt darauf an wie wichtig dir deine Datensicherheit ist.

Aber generell sollte dir klar sein das jedes Verschlüsselungsverfahren Knackbar ist. Die heutigen verfahren beruhen darauf das es sehr schwer ist die Primzahlzerlegung einer Zahl zu berechnen.

Aber selbst diese Verschlüsselungen sind in der Regel binnen 1 Tag geknackt.

Was aber genügt weil ja die meisten Informationen nach einer so langen Zeit nicht mehr geheim sind.

Wenn du nun hergehst und die Bilder deiner Freundin verschlüsselst, so sei dir gesagt das es sicher genug ist. Weil sich die Mühe sicherlich nicht lohnt. Ein entsprechendes Dekodierungsverfahren zu erstellen.

Ich persöhnlich finde aber eine selbst zusammengeschusterte Verschlüsselung grunds#ätzlich besser als eine "Offiziele" da bei deinem Verfahren erst mal jemand dahinter kommen mus wie es funktioniert um sich dann Gedanken zu machen wie er es Knackt.

Nur solltest du dann nicht hergehen und dein Verfahren in Irgendwelchen Foren Posten ;) .

Ich habe auch schon diverse Verschlüsselungen entwickelt. Kann sie aber aus eben diesem Grund nicht veröffentlichen.

Hoffe das Hilft dir weiter. Ansonsten geh her und schau dir mal das RSA Verfahren an. Das ist das wol beliebteste zur Zeit.

Ein passendes Sample dafür gibts Hier [http://tyrann.deadbyte.de/corpsman/klickcounter.php?url=download/rsa.zip]


Horst_H - Sa 23.12.06 14:10

Hallo,

XOR mit einem konstanten Schlüssel, alle 128 Bit ständig wiederangewendet, ist nicht so gut.
http://www.cipherbox.de/kryptologie-einf.html
http://de.wikipedia.org/wiki/Blum-Blum-Shub-Generator
http://www.delphipraxis.net/topic90897,0,asc,0.html

Gruss Horst


DarkLord05 - Sa 23.12.06 14:22

user profile iconCorpsman hat folgendes geschrieben:
Ich persöhnlich finde aber eine selbst zusammengeschusterte Verschlüsselung grunds#ätzlich besser als eine "Offiziele" da bei deinem Verfahren erst mal jemand dahinter kommen mus wie es funktioniert um sich dann Gedanken zu machen wie er es Knackt.

Aber eine Verschlüsselung sollte eig durch die Verschlüsselung an sich sicher sein, und nicht weil geheim ist um was es sich für eine Verschlüsselung handelt ;)


elundril - Sa 23.12.06 14:39

user profile iconCorpsman hat folgendes geschrieben:
Ich persöhnlich finde aber eine selbst zusammengeschusterte Verschlüsselung grunds#ätzlich besser als eine "Offiziele" da bei deinem Verfahren erst mal jemand dahinter kommen mus wie es funktioniert um sich dann Gedanken zu machen wie er es Knackt.

Nur solltest du dann nicht hergehen und dein Verfahren in Irgendwelchen Foren Posten ;) .


tja die Xor verschlüsselungsmethode ist leider schon ziemlich bekannt.

ich hab jetzt nur als beispiel den Schlüssel in einem Array gespeichert und da hab ich irgendwelche zahlen genommen. In meinem Programm hab ich mir eh schon was überlegt um den Schlüssel abzulegen.

lg el


mkinzler - Sa 23.12.06 14:40

Die Annahme, daß ein Verschlüsselungsalgorithmus sicherer ist, wenn er geheim ist, ist ein Trugschluß. Ich würde offene, gut gesteste Verfahre wie z.B. Rijndael (AES) verwenden


elundril - Mi 27.12.06 13:54

user profile iconCorpsman hat folgendes geschrieben:

Du kannst jede Xbeliebiuge Datei verschlüsseln wenn du es mit einel Filestream machst.

Du lädst die File



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var f,f2:Tfilestream;
   b:Byte;
begin
..
assignfile(f,Dateiname);
Assignfile(f2,Dateiname2);
rewrite(f2);
reset(f);
while not eof(f) do begin
f.read(b,sizeof(b));
b := VerschlüsseleByte(b);
f2.write(b);
end;
closefile(f);
Closefile(f2);



Das Funktioniert irgendwie nicht so richtig! ich hab mich auch ein bischen damit herumgespielt aber ich glaub ich hab mich dadurch von der lösung nur noch weiter entfernt.

lg el


Narses - Mi 27.12.06 14:00

Moin!

Ähm, wie wäre es mit Suche in: Delphi-Forum, Delphi-Library TFILESTREAM, Beispiele gibt´s da mal genug. ;)

cu
Narses


elundril - Mi 27.12.06 14:18

*lol* sry wenn ich das so sage aber ich hab keine zeit mir 14 Seiten durchzusehen. (muss noch Spezialgebiet schreiben)
Wäre es so umständlich den Code zu posten und mir damit einen gefallen zu tun?

lg el


Narses - Mi 27.12.06 14:28

Moin!

user profile iconelundril hat folgendes geschrieben:
*lol* sry wenn ich das so sage aber ich hab keine zeit mir 14 Seiten durchzusehen.

Oh, das ist aber schade, so wird dir die Benutzung von TFileStream wohl leider unklar bleiben, ist auch wirklich schwer, seh´ ich schon ein, auch auf TFileStream eintippen und F1 drücken kommt man ja nicht von selber... :roll: ;)

Sag mal, sind wir deine Hausaufgaben-Vorbereiter-Sklaven, oder was? :| Ich unterstütze Faulheit jedenfalls nicht. :?

cu
Narses

//EDIT: Naja, weil ja Weihnachten ist, will ich mal nicht so sein: Klick mich [http://www.delphi-forum.de/viewtopic.php?p=406975#406975], das kann ich dir aber schon zumuten zu lesen, ja? :mrgreen:


GTA-Place - Mi 27.12.06 14:31

Davon abgesehen würde es ja sogar reichen, die 1. Seite der Suchergebnisse angzuucken, da man zufällig auf den Thread "Das Multilevel-Rätsel. Die Auflösung" stößt, wo ich wiederum auf Seite 1, einen TFileStream benutze:
http://www.delphi-forum.de/viewtopic.php?p=408322#408322&highlight=tfilestream


Udontknow - Mi 27.12.06 14:32

Hallo!

Hättest du auch nur einen Blick in die 14 Seiten hineingeworfen, du hättest sofort gewusst, was du falsch gemacht hast. Keine Scheu vor der Hilfe oder anderen Schriftstücken haben!

Hier der überarbeitete Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var f,f2:Tfilestream;  
   b:Byte;  
begin  
  f:=TFileStream.Create('C:\input.dat',fmOpenRead);
  try
    f2:=TFileStream.Create('C:\output.dat',fmCreate);
    try
      while f.Position<f.Size do 
      begin  
        f.readbuffer(b,SizeOf(b));  
        b := VerschlüsseleByte(b);  
        f2.writebuffer(b,SizeOf(b));  
      end;
    finally
      f.Free;
    end
  finally
     f2.Free;
  end
end;


Cu,
Udontknow


elundril - Mi 27.12.06 14:35

user profile iconNarses hat folgendes geschrieben:
Moin!
Oh, das ist aber schade, so wird dir die Benutzung von TFileStream wohl leider unklar bleiben, ist auch wirklich schwer, seh´ ich schon ein, auch auf TFileStream eintippen und F1 drücken kommt man ja nicht von selber... :roll: ;)

Wie man vl aus dem satz "ich hab mich auch ein bischen damit herumgespielt aber ich glaub ich hab mich dadurch von der lösung nur noch weiter entfernt." erkennen kann hab ich sehr wohl F1 gedrückt aber irgendwie ist mein delphi englisch und da versteh ich nicht viel.

user profile iconNarses hat folgendes geschrieben:

Sag mal, sind wir deine Hausaufgaben-Vorbereiter-Sklaven, oder was? :| Ich unterstütze Faulheit jedenfalls nicht. :?

cu
Narses


was soll dieser Satz?? ich frag ja nur um ein Code schnipsel das man mir erklären kann. was hat das mit hausaufgaben zu tun??? und was hat nicht verstehen mit faulheit zu tun?

lg el


elundril - Mi 27.12.06 14:37

@Udontknow: ok danke aber bei mir hat er sich immer beim eof aufgehängt.

lg el


Udontknow - Mi 27.12.06 14:40

Ahja, da hatte ich noch was übersehen. Habe es abgeändert.

Cu,
Udontknow


elundril - Mi 27.12.06 14:47


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var f,f2:Tfilestream;   
   b:Byte;   
begin   
  f:=TFileStream.Create('C:\input.dat',fmOpenRead);    //<-öffnet das file im lesemodus
  try 
    f2:=TFileStream.Create('C:\output.dat',fmCreate);    //<-erstellt ein file oder öffnet das existierende
    try 
      while f.Position<f.Size do     //<-wenn die "cursor" kleiner als die gesamtgröße ist mache...
      begin   
        f.readbuffer(b,SizeOf(b));    //versteh ich nicht was macht das und welche variabeln muss man mitgeben?
        b := VerschlüsseleByte(b);     //wandelt das ausgelesene byte in ein codiertes um
        f2.writebuffer(b,SizeOf(b));    //versteh ich nicht was macht das und welche variabeln muss man mitgeben? 
      end
    finally 
      f.Free;     //speicher freigeben
    end 
  finally 
     f2.Free;     //speicher freigeben
  end 
end;



ok so halbwegs hab ichs verstanden. aber zwei zeilen sind mir unklar!

und braucht man den Filestream gar nicht speichern??


lg el


Narses - Mi 27.12.06 14:48

Moin!

user profile iconelundril hat folgendes geschrieben:
aber irgendwie ist mein delphi englisch und da versteh ich nicht viel.

Aha, ist das unser Problem? ;)

user profile iconelundril hat folgendes geschrieben:
user profile iconNarses hat folgendes geschrieben:
Sag mal, sind wir deine Hausaufgaben-Vorbereiter-Sklaven, oder was? :| Ich unterstütze Faulheit jedenfalls nicht. :?

was soll dieser Satz?? ich frag ja nur um ein Code schnipsel das man mir erklären kann. was hat das mit hausaufgaben zu tun???

OK, sorry, "Hausaufgaben" waren unterstellt. 8)

user profile iconelundril hat folgendes geschrieben:
und was hat nicht verstehen mit faulheit zu tun?

user profile iconelundril hat folgendes geschrieben:
*lol* sry wenn ich das so sage aber ich hab keine zeit mir 14 Seiten durchzusehen.

Da steht nicht, dass du die Beispiele hier (und die sind in deutscher Sprache eingebettet! :mrgreen:) nicht verstehst, sondern dass du sie nicht lesen willst - warum auch immer sollte wohl ebenfalls nicht unser Problem sein, hm? ;)

cu
Narses


Narses - Mi 27.12.06 14:53

Moin!


Delphi-Quelltext
1:
f.readbuffer(b,SizeOf(b));    //versteh ich nicht was macht das und welche variabeln muss man mitgeben?                    

Liest aus der Datei in die Variable "b". Parametererläuterung in der DOH. ;)


Delphi-Quelltext
1:
f2.writebuffer(b,SizeOf(b));    //versteh ich nicht was macht das und welche variabeln muss man mitgeben?                    

Schreibt in die Datei den Inhalt von Variable "b", Rest s.o. ;)

Das Streamobjekt ist nur ein "Hilfsmittel", um Zugriff auf die Daten auf der Platte zu nehmen, deshalb kann man ein Streamobjekt nicht speichern, das machen ja gerade die Methoden oben (lesen/schreiben).

cu
Narses


Udontknow - Mi 27.12.06 14:56

Readbuffer liest aus einem Stream etwas aus. Wenn du ein Byte auslesen willst, übergibst du eine ByteVariable, und SizeOf(B) gibt dann die Größe des auszulesenden Typen in Byte an (Bei B:Byte ist es 1, bei Integer z.B. 4).

WriteBuffer erklärt sich doch dann von selbst, nicht wahr?

Du musst übrigens bei einem Filestream keinen Speicherbefehl aufrufen, weil du bereits mit dem Writebefehl Byte für Byte auf die Platte drückst. Das Laden erübrigt sich auch, denn es wird mit jedem Read ein Byte eben abgerufen.

Cu,
Udontknow


elundril - Mi 27.12.06 15:06

ok danke!!

lg el


Horst_H - Mi 27.12.06 16:58

Hallo,

wo Du jetzt fertig bist, kann ich mal etwas anderes zeigen.
Der Schlüssel wird staendig per Zufallsgenerator mit definiertem Startwert permutiert(schon bei der ersten Verwendung. Edit1.text muss eine Zahl sein ).
Wer den Startwert kennt, hat schon gewonnen, also ist die Sicherheit nicht sehr hoch (~31 Bit oder so, bei dem Zufallsgenerator von Delphi) aber die Sache ist recht schnell.

Gruss Horst