Entwickler-Ecke
Freeware Projekte - SmartEncoder 1.0
Alstar - Di 12.07.05 01:42
Titel: SmartEncoder 1.0
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
maxk - 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
Alstar - 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 - 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
Alstar - 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.
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:
| 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..4095] of Word; DecodeTranscodeMatrix: Array[0..4095] of Word; CypherPassword: String;
implementation
procedure EncodeBuffer(var Buffer: Array of Byte); var WorkBuffer: Array[0..4095] of Byte; I: Integer; PassPosition: Integer; NewPosition: Integer; begin PassPosition := 0; For I := 0 to 4095 do begin PassPosition := ((PassPosition + 1) mod 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..4095] of 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 + 1) mod 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..4095] of Integer; Value: Integer; Finished: Boolean; begin CypherPassword := MD5Print(MD5String(Password)); PassPosition := 0; For I := 0 to 4095 do begin PassPosition := ((PassPosition + 2) mod 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] > 1) or (OftenMatrix[J] = 0) then 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!