Autor Beitrag
Alstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Di 12.07.05 01:42 
Hallo Leute!

Ich habe ein kleines Testprogramm zu meiner Verschlüsselungs-Unit geschrieben und lasse es nun auf Euch los :wink:

Das Programm kann Dateien ver-/ und entschlüsseln

Obacht:
Das Programm ist nur ein "Test" für meine Verschlüsselungs-Unit. Das "richtige" Programm mit mehr Features etc. wird bald folgen.
Ich habe dieses Programm innerhalb von ca. 1 1/2 Stunden geschrieben und daher ist es sicherlich voller Bugs.

Achtung beim Entschlüsseln: Beim Entschlüsseln wird die Dateiendung abgehangen und mit diesem neuen Dateinamen eine neue Datei angelegt. Wenn die Quelldatei im gleichen Verzeichnis liegt und nichts verändert wurde, wird diese beim Entschlüsseln überschrieben

Also: Bitte postet (wenn möglich) keine Kritik zum Programm, sondern eher zur Verschlüsselung.

Wer herausbekommt, wie diese Verschlüsselung funktioniert, bekommt einen Lollie :wink: Nein, Spaß beiseite. Falls jemand interesse daran hat und wissen möchte, wie diese Verschlüsselung funktioniert, werde ich diese offen darlegen.

Anmerkung: Das Programm wurde mittels UPX komprimiert und nutzt die FlatStyle-Units
Wie immer übernheme ich keine Verantwortung für Schäden jeglicher Art, die auf dieses Programm zurückzuführen sind
Und nun: Viel Spaß beim Crypten!!

Alstar
Einloggen, um Attachments anzusehen!
maxk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1696
Erhaltene Danke: 1

Win XP, Debian Lenny
Delphi 6 Personal
BeitragVerfasst: Di 12.07.05 10:17 
Ich habe zwar von Kryptographie keine Ahnung, aber ich frage trotzdem mal ganz doof: Warum wird eine 17 Byte große Datei nach der Verschlüsslung 4104 Bytes groß?
Ansonsten denke ich, dass du schon sagen solltest, wie dein Algorithmus funktioniert. Eine Verschlüsslung ist nur sicher, wenn sie trotz vorliegendem Algorithmus nur schwer und unter großem Aufwand zu knacken ist.

Gruß,
maxk

_________________
Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Alstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Di 12.07.05 11:27 
Hallo maxk!

Jo ... Die Größe der Ausgangsdatei nimmt (meißtens) zu. Das hängt mit dem Verschlüsselungsprinzip zusammen.
Zur Größe kann ich schonmal folgendes sagen: ist eine Dateigröße der Ausgangsdatei (in Byte) durch 4096 Byte (4 KB) teilbar, wird die Zieldatei verschlüsselt 8 Byte größer.
Kann man die Ausgangsdatei nicht durch 4096 Byte teilen, so wird die Zieldatei so viel Größer, wie man Bytes braucht, um die nächste "4096Byte-Teilung" zu erreichen.
Die Zieldateigröße - 8Bytes (gesprochen: "minus 8 Bytes") ist also immer durch 4096 Bytes teilbar.

Funktionsweise des Systems:
Erster Schritt: Das eingegebene Passwort wird ein einen 256bit Hash (MD5) umgerechnet. (Hier besteht natürlich die Gefahr einer Kollision)

Zweiter Schritt: Aus diesem Password wird eine Transcodierungsmatrix errechnet (Transcodierung -> Vertauschung), die genau 4096-Bytes groß ist (ziemlich komplizierte Sache; auch erklären?)

Dritter Schritt: Soll eine Datei verschlüsselt werden, so werden aus der Datei nacheinander 4096-Byte-Blöcke gelesen. Diese werden dann mit Hilfe des Password-Hashs noch einmal verschlüsselt: Es wird beim ersten Zeichen des Hashs angefangen. Dieses Zeichen (in Binärform) wird mit dem ersten Byte des 4096-B-Blocks addiert und ein modulo 256 ausgeführt. Danach kommt das zweite Zeichen des Passworts und das zweite Byte des Blocks etc. Ist das 32. Byte des Passworthashs genutzt worden, dann wird für das 33. Byte wieder das 1. Byte des Passworts verwendet etc.

Vierter Schritt: Der chiffrierten Bytes des 4096-Byte-Blocks wird dann mit Hilfe der Transcodierungsmatrix in diesem Block vertauscht


Offensichtliche Vorteile des Systems sind offensichtlich, dass kein Angriff auf eine verschlüsselte Datei über den Header begangen werden kann (da dieser ja verteilt in den ersten 4096 Bytes liegt). Außerdem lässt diese Verschlüsselung, selbst wenn sie geknackt wird, meißtens keinen Rückschluss auf das Passwort, sondern nur auf dessen Hash, zu.

Alstar
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Di 12.07.05 19:55 
Da du in dem andren Thread nach meiner Kritik gefragt hast..

Ich weiß, das hier ist zwar die Freeware, aber wie maxk bereits gesagt hat, kann man die Sicherheit eines Algos nur "nachweisen", wenn er, auch wenn der komplette Source offen liegt, nicht geknackt werden kann. Ich behaupte nicht, dass der Algo sicher ist nur weil ich ihn nicht knacken kann (dazu kenn ich mich auch nicht gut genug aus), aber falls ich es schaffe ihn zu knacken, ist er sicher nicht sicher! ;)

Daher mein Vorschlag - häng den Source für Ver/Entschlüsselung an und ich werde ihn mir mal ansehen und versuchen zu knacken. Ich werde dir dann auch meine allgemeinen Kritikpunkte aufzählen (werd ich aber auch, falls du den Code nicht rausrücken willst ;)).

Gruß, Motzi

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Alstar Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Di 12.07.05 20:01 
Nene, es ist in Ordnung, ich hänge den Code an. Allerdings ist er "unsauber" geschrieben (Keine Kommentare, unsinnige begin-end-blöcke etc.). Vllt kannst du aber tortzdem was mit anfangen.

ausblenden volle Höhe 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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
// ############################################
// #      C R Y P T I O N - U N I T           #
// #                                          #
// #        V E R S I O N  1 . 1              #
// ############################################
//         (c)2005 by Alexander Balke
unit crypt;

interface

uses
  Classes, MD5;

procedure OpenCryptSystem(Password: String);
procedure EncodeBuffer(var Buffer: Array of Byte);
procedure DecodeBuffer(var Buffer: Array of Byte);
procedure CloseCryptSystem;

var
  TranscodeMatrix: Array[0..4095of Word;
  DecodeTranscodeMatrix: Array[0..4095of Word;
  CypherPassword: String;

implementation

procedure EncodeBuffer(var Buffer: Array of Byte);
var
  WorkBuffer: Array[0..4095of Byte;
  I: Integer;
  PassPosition: Integer;
  NewPosition: Integer;
begin
  PassPosition := 0;
  For I := 0 to 4095 do
    begin
      PassPosition := ((PassPosition + 1mod 32) + 1;
      WorkBuffer[I] := (Buffer[I] + Byte(CypherPassword[PassPosition])) mod 256;
    end;
  For I := 0 to 4095 do
    begin
      NewPosition := TranscodeMatrix[I];
      Buffer[NewPosition] := WorkBuffer[I];
    end;
end;

procedure DecodeBuffer(var Buffer: Array of Byte);
var
  WorkBuffer: Array[0..4095of Byte;
  I: Integer;
  PassPosition: Integer;
  Value: Integer;
begin
  For I := 0 to 4095 do
    WorkBuffer[DecodeTranscodeMatrix[I]] := Buffer[I];
  PassPosition := 0;
  For I := 0 to 4095 do
    begin
      PassPosition := ((PassPosition + 1mod 32) + 1;
      Value := (WorkBuffer[I] - Byte(CypherPassword[PassPosition])) mod 256;
      WorkBuffer[I] := Value;
    end;
  For I := 0 to 4095 do
    Buffer[I] := WorkBuffer[I];
end;


procedure OpenCryptSystem(Password: String);
var
  I, J, K: Integer;
  PassPosition: Integer;
  OftenMatrix: Array[0..4095of Integer;
  Value: Integer;
  Finished: Boolean;
begin
  CypherPassword := MD5Print(MD5String(Password));
  PassPosition := 0;
  For I := 0 to 4095 do
    begin
      PassPosition := ((PassPosition + 2mod 32) + 1;
      TranscodeMatrix[I] := (((I + Byte(CypherPassword[PassPosition]))) +
                            ((I + Byte(CypherPassword[PassPosition+1])))) mod 4096;
    end;

  For I := 0 to 4095 do
    OftenMatrix[I] := 0;
  For I := 0 to 4095 do
    begin
      Value := TranscodeMatrix[I];
      Inc(OftenMatrix[Value], 1);
    end;
  Finished := False;
  repeat
    For I := 0 to 4095 do
      begin
        if OftenMatrix[I] > 1 then
          begin
            For J := 0 to 4095 do
              if OftenMatrix[J] = 0 then
                begin
                  For K := 0 to 4095 do
                    if TranscodeMatrix[K] = I then
                      begin
                        TranscodeMatrix[K] := J;
                        Inc(OftenMatrix[J]);
                        Dec(OftenMatrix[I]);
                        Break;
                      end;
                  if OftenMatrix[I] = 1 then Break;
                end;
          end;
      end;
    For J := 4095 downto 0 do
      if (OftenMatrix[J] > 1or (OftenMatrix[J] = 0then
        Break
      else
        if J = 0 then Finished := True;
  until
    Finished;
  For I := 0 to 4095 do
    DecodeTranscodeMatrix[TranscodeMatrix[I]] := I;
end;

procedure CloseCryptSystem;
var
  I: Integer;
begin
  For I := 0 to 4095 do
    TranscodeMatrix[I] := 0;
  CypherPassword := '';
end;

end.


In der Prozedur "OpenCryptSystem" wird das Passwort in den Hash umgewandelt und die TranscodeMatrix erstellt (DecodeTranscodeMatrix ist nur die optimierte Version für das Entschlüsseln).
Die Prozeduren DecodeBuffer und EncodeBuffer erwarten ein Array[0..4095] of Byte...

Alstar