Dateiverschlüsselung

  Hauptseite/ Programmieren



Auf dieser Seite wird ein Verschlüsselungsprogramm vorgestellt, welches als Editor getarnt ist. Mit diesem Programm können beliebige Dateien verschlüsselt/ entschlüsselt werden, verschlüsselte Textdateien "online" bearbeitet werden und nebenbei kann das Programm auch noch als gewöhnlicher Texteditor eingesetzt werden.

Merkmale:
- sehr sichere Verschlüsselung,
- als Schlüssel dient eine beliebige Refferenzdatei,
- sehr einfach zu handhaben.


Download: Verschlüsselungsprogramm (edit.zip/ca.250KByte)

Hier ein Auszug aus der Online-Hilfe des Programmes.

Hier eine Liste der möglichen Kommandozeilenparameter.

Um das Verfahren der hier angewendeten Verschlüsselung auch in anderen Projekten nutzen zu können, wird hier der wichtigste Teil des Quellcodes zur freien Verfügung dargestellt.



So sieht das Programm auf dem Bildschirm aus: Bild





Zum besseren Verständnis hier ein Auszug aus der Onlinehilfe des Programmes:
Wer im Menü "Optionen" auf "Erweiterte Anzeige" klickt, merkt daß in diesem Programm noch etwas anderes steckt. Dieser Editor enthält ein Verschlüsselungs-Tool.

Es können verschlüsselte Daten direkt in den Texteditor geladen werden bzw. Daten aus dem Texteditor direkt verschlüsselt gespeichert werden. (Die Daten erscheinen nur im Speicher unverschlüsselt, nicht aber auf der Festplatte!)

Außerdem können unter dem Menüpunkt "Datei" beliebige Dateien ver- bzw. entschlüsselt werden.

Um das Ver- bzw. Entschlüsseln mit individuellen Optionen zu automatisieren, stehen umfangreiche Kommandozeilenparameter zur Verfügung.

Was heißt hier Verschlüsseln?
Dieses Programm verschlüsselt Daten, in dem es jedes einzelne Bit mit einem Bit einer beliebigen Refferenzdatei verrechnet. Die Verschlüsselung ist also sehr sicher, weil man immer diese Refferenzdatei benötigt. Sollte nun trotz aller Vorsichtsmaßnahmen jemand ungewollt an die Refferenzdatei gelangen, so nützt ihm dies auch noch nichts. Um eine Datei zu entschlüsseln, benötigt man nämlich noch ein Paßwort, bestehend aus drei Zahlen. Dieses Paßwort bestimmt welche Bits der Refferenzdatei, wie, mit welchen Bits der Datendatei verrechnet werden.

Hinweise:
  • Die Daten der Refferenzdatei sollten gut durcheinander gewürfelt sein. Sehr gut geeignet sind komprimierte Dateien, wie z.B. JPEG- oder ZIP-Dateien.
  • Beim Versand von supergeheimen Daten, sollten für Datendatei, Refferenzdatei und Paßwort unterschiedliche Kanäle benutzt werden.
  • Um mehrere Dateien zu verschlüsseln, benutzt man entweder eine kleine Batchdatei (verwenden des Betriebssystembefehles FOR) oder man packt die Dateien vorher mit einem Packprogramm zusammen zu einer Datei.




Liste der Kommandozeilenparameter:

 ["]-reff:Refferenzdatei["]
 ["]-in:Quelldatei["]
 ["]-out:Zieldatei oder oder und Zielpfad["]
 -pa:WERT........Paßwort A (Wert: 0..65535 /Verschiebing Refferenzspeicher)
 -pb:WERT........Paßwort B (Wert: 0..255   /XOR-Byte )
 -pc:WERT........Paßwort C (Wert: 0..7     /Byte-Rotationen)
 -code...........starte automatisch Verschlüsselung
 -decode.........starte automatisch Entschlüsselung
 -close..........beende Programm wenn fertig
 -replace........überschreibe ev. bestehende Zieldatei
 -hidden.........verberge Hauptfenster (funktioniert nur wenn -code bzw.
                 -decode und -close angegeben wurde)
 -noprogressbar..verberge Fortschrittsanzeige (funktioniert wenn auch
                 -hidden angegeben wurde)
 -noenter........kein Tastaturabfragen bei Fehlern (Quittungsfenster)
 -extendmenu.....startet direkt im erweiterten Modus
 -viewfile.......zeige Inhalt der verschlüsselten Datei an (Schreibgeschützt)
 -editfile.......bearbeite Inhalt der verschlüsselten Datei als Textdatei



Das wichtigste aus dem Pascal-Quellcode :
(Laden des Refferenzspeichers / Codieren / Decodieren)
        .
        .
const Puffergroesze=524280 {512KB};
      setRefferenzlaenge=928;
      setRefferenzfileMin=100;
        .
        .

var    RefBytes:array[1..setRefferenzlaenge] of byte;
        .
        .
procedure Tframe1.Button4Click(Sender: TObject);
var temp, PasswBLocal, PasswCLocal:byte;
    RefLaenge, RefPos, n,m, PufferPosLesen, PufferPosSchreiben:integer;
    s:string;
    Puffer: array [1..Puffergroesze] of Byte;
    codieren,decodieren:boolean;
begin
        .
        .
if error=0 then begin // lesen der Refferenzdatei
  {$I-}
  AssignFile(refferenz, editRefferenzdatei.Text);
  FileMode := 0;
  Reset(refferenz);
  RefLaenge:=0; while(not eof(refferenz))and(RefLaenge<setRefferenzlaenge)do begin // ermittle Länge der Refferenzdatei
    inc(RefLaenge);
    if RefLaenge<=setRefferenzlaenge then Read(refferenz,RefBytes[RefLaenge]);
  end;
  CloseFile(refferenz);
  {$I+}
  if (IOResult <> 0) or (editRefferenzdatei.text= '') then Error:=2;
end;
if (error=0)and(RefLaenge<setRefferenzfileMin) then error:=5; // Refferenzdatei zu kurz
if error=0 then begin
  //Auffüllen des Refferenzspeichers
  n:=1;m:=RefLaenge+1;
  while m<=setRefferenzlaenge do begin RefBytes[m]:=RefBytes[n];inc(n);inc(m);end;
  //Ermitteln der tatsächlichen RefferenzPossition
  RefPos:=EditPasswortA.Value;
  while RefPos>setRefferenzlaenge do RefPos:=RefPos-setRefferenzlaenge;
  //Durchschieben des refferenzspeichers
  m:=0; while m<editPasswortA.Value do begin
    inc(m);
    temp:=RefBytes[1];
    for n:=1 to setRefferenzlaenge-1 do RefBytes[n]:=RefBytes[n+1];
    RefBytes[setRefferenzlaenge]:=temp;
  end;
end;
        .
        .
if error=0 then begin
  if codieren then begin
   //+++++++++++++++++++ c o d i e r e n +++++++++++++++++++++++++++++
   randomize;
   {$I-}                                 // ANFANG Kopf schreiben
   temp:=0;write(ziel,temp);
   for n:=1 to length(setDateiKennung) do begin
     temp:=ord(setDateiKennung[n]);
     write(ziel,temp);
   end;
   temp:=0;write(ziel,temp);
   s:=ExtractFileName(editQuelldatei.Text);;
   for n:=1 to 293 do begin
     if n<=length(s) then temp:=ord(s[n]) else if n=length(s)+1 then temp:=0 else temp:=random(255);
     write(ziel,temp);
   end;
   {$I+} if ioresult<>0 then error:=10;  // Ende Kopf schreiben
   if error=0 then begin
       n:=1;//reff-zeiger
       repeat
         {$I-}
         blockread(quelle,Puffer,Puffergroesze,PufferPosLesen);
         for m:=1 to PufferPosLesen do begin
           temp:=puffer[m];
           temp:=temp xor refbytes[n];          // Maskieren mit Refferenz
           asm                                  // Maskiere und Rotiere mit Passwort B,C
             MOV AL,temp
             MOV AH,PasswBLocal
             MOV CL,PasswCLocal
             XOR AL,AH
             ROL AL,CL
             MOV temp,AL
           end;
           puffer[m]:=temp;
           inc(n);if n>setRefferenzlaenge then n:=1;
         end;
         blockwrite(ziel,Puffer,PufferPosLesen,PufferPosSchreiben);
         {$I+}
         if ioresult<>0 then error:=8;
       until (PufferPosLesen=0)or(PufferPosLesen<>PufferPosSchreiben)or(error<>0)
   end;
  end;
  if decodieren then begin
   //+++++++++++++++++++ d e c o d i e r e n +++++++++++++++++++++++++++++
   n:=1;
   while (n<=315) and(error=0) do begin
     {$I-} read(quelle,temp);{$I+}
     inc(n);
     if ioresult<>0 then error:=11;
   end;
   if error=0 then begin
       n:=1;//reff-zeiger
       repeat
         {$I-}
         blockread(quelle,Puffer,Puffergroesze,PufferPosLesen);
         for m:=1 to PufferPosLesen do begin
           temp:=puffer[m];
          asm                                  // Maskiere und Rotiere mit Passwort B,C
             MOV AL,temp
             MOV AH,PasswBLocal
             MOV CL,PasswCLocal
             ROR AL,CL
             XOR AL,AH
             MOV temp,AL
           end;
           temp:=temp xor refbytes[n];          // Maskieren mit Refferenz
           puffer[m]:=temp;
           inc(n);if n>setRefferenzlaenge then n:=1;
         end;
         blockwrite(ziel,Puffer,PufferPosLesen,PufferPosSchreiben);
         {$I+}
         if ioresult<>0 then error:=12;
       until (PufferPosLesen=0)or(PufferPosLesen<>PufferPosSchreiben)or(error<>0)
   end;
  end;
end;
{$I-}
CloseFile(ziel);
CloseFile(quelle);
{$I+}
if ioresult<>0 then Error:=7;
        .
        .


  Hauptseite/ Programmieren