AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units
Thema durchsuchen
Ansicht
Themen-Optionen

Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

Ein Thema von DieDolly · begonnen am 16. Dez 2020 · letzter Beitrag vom 7. Jan 2021
Antwort Antwort
Seite 1 von 2  1 2      
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 13:53
Wenn ich aus meinem Programm eine Datei verschlüsseln muss und das Programm an jemanden geben möchte, reicht es wenn der da das Passwort eingibt?
Oder muss der dann auch diesesIV eingeben?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 13:57
Du kannst den IV mitgeben,

aber er kann der Einfachheit halber auch "fest" im Programm eingebaut sein.



Die Summe aus IV und Key und Technik (Verschlüsselungsart/Modus, z.B. AES+CBC) ergibt die Verschlüsselung.
> wird Einwas geändert, ergibt es ein anderes Ergebnis
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Dez 2020 um 14:00 Uhr)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 14:04
Klappt bisher genau so wie gewünscht.

Eine kleine Extra-Unit erlaubt mir dann an anderer Stelle einen 1-Zeiler als Aufruf. Die Extra-Unit ist aber ausbaufähig was doppelten Code angeht.
Dieses .encrypted.txt und .decrypted.txt ist nur eine kleine Hilfe für mich bis ich alles richtig habe.

Delphi-Quellcode:
unit Utils.DEC.Crypt;

interface

uses
 System.SysUtils, System.Classes, DECCipherBase, DECCiphers, DECCipherFormats;

type
 TDECCryptUtils = record
 private
  //
 public
  class function AESFileEncrypt(const FileName, Password: string): string; static;
  class function AESFileDecrypt(const FileName, Password: string): string; static;
 end;

implementation

class function TDECCryptUtils.AESFileEncrypt(const FileName, Password: string): string;
var
 Cipher: TCipher_AES;
begin
 Cipher := TCipher_AES.Create;
 try
  try
   // Schlüssel, Initialisierungsvektor, Füllwert um auf Blockgröße aufzufüllen
   Cipher.Init(Password, #1#2#3#4#5#6#7#64, 0);
   Cipher.Mode := cmCBCx;
   // Klartextdatei, verschlüsselte Datei
   Cipher.EncodeFile(FileName, FileName + '.encrypted.txt');
  except
   //
  end;
 finally
  Cipher.Free;
 end;
end;

class function TDECCryptUtils.AESFileDecrypt(const FileName, Password: string): string;
var
 Cipher: TCipher_AES;
begin
 Cipher := TCipher_AES.Create;
 try
  try
   // Schlüssel, Initialisierungsvektor, Füllwert um auf Blockgröße aufzufüllen
   Cipher.Init(Password, #1#2#3#4#5#6#7#64, 0);
   Cipher.Mode := cmCBCx;
   // Klartextdatei, verschlüsselte Datei
   Cipher.DecodeFile(FileName, FileName + '.decrypted.txt');
  except
   //
  end;
 finally
  Cipher.Free;
 end;
end;

end.
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.076 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 14:23
Schön, dass DEC nützlich ist.

Evtl. hält das sogar in GetIt EInzug, da laufen aber nich die Diskussionen
wegen Exportbeschränkungen für cryptographische Algorithmen.
Wenn das so nicht klappt, wird's eine DEC Light für GetIt geben wo dann
halt alles außer den Verschlüsselungsalgorithmen drin ist.
Auch Hashes, CRCs und Zufallszahlengeneratoren sind für den einen oder
anderen nützlich...
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#5

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 14:27
Eine letzte Frage habe ich noch da ich gerade gesehen habe dass man auch den Fortschritt anzeigen lassen kann.
Wie funktioniert das? Eine ProgressBar brauche ich nicht. Ich würde mir gerne ausgeben lassen, wieviele Bytes von der Datei schon verschlüsselt wurden.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#6

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 16. Dez 2020, 22:52
Geht das nicht?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#7

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 17. Dez 2020, 00:32
Schau doch mal in TCipher_AES?

Ob es im Constructor oder eine Methode einen Setter gibt, oder vielleicht gibt es auch ein Property, wo man eine Ereignismethode oder ein Interface zuweisen kann.


[Edit]
Es gibt ein IDECProgress, aber scheinbar nur beim Ver-/Entschlüsseln von Streams
und im Prinzip auch von Dateien (TFileStream).

[Edit2]
Wer die das CodeInsight lesen kann, ist klar im Vorteil.
Delphi-Quellcode:
procedure DecodeFile(const SourceFileName, DestFileName: string;
                     const Progress: IDECProgress = nil);
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (17. Dez 2020 um 01:19 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#8

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 31. Dez 2020, 11:21
Hier!
habe ich mal gezeigt, wie man die Unit von Gammatester/ Wolgang Ehrhardt nutzen kann.

Frohes Neues Jahr!
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 31. Dez 2020, 11:42
vielen Dank Jens01.
Welche units von W. Erhardt hast Du da eingebunden? Alle die er unter AES veröffentlicht hat? Hast Du möglicherweise auch ein kurzes Beispielprogramm zu Deinen Funktionen?
Ich wünsche einen guten Rutsch ins Neue Jahr!
Norbert
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#10

AW: Dateien verschlüssen mit Wolgang Ehrhardts Crypt-Units

  Alt 31. Dez 2020, 13:39
Mit der Zeit muss ich die Methoden etwas geändert haben. Hier die letzte Version aus meinem Gesamtcode.
Sollten Dir die verlinkten Units fehlen, kann ich sie Dir geben.
Probier mal aus...

Delphi-Quellcode:
uses
  TSC, Hash, Whirl512, fcaes256, AES_EAX, mem_util;

procedure GetSalt(var salt: TFCA256Salt);
{ -generate salt for key derivation }
// http://www.wolfgang-ehrhardt.de/crypt_en.html
var
  Ctr : TCtrRec;
  TS : TTimeStamp;
  sctx : THashContext;
  sdig : TWhirlDigest;
  qword: int64;
begin
  { Hash Date, Time, Randseed, size and free space (in byte) on active disk and (normally) TSC }
  _ReadCounter(Ctr);
  Whirl_Init(sctx);
  TS := datetimetotimestamp(now); { get date and time with millisecond precision }
  Whirl_Update(sctx, @TS.date, SizeOf(TS.date));
  Whirl_Update(sctx, @TS.time, SizeOf(TS.time));
  qword := disksize(0);
  Whirl_Update(sctx, @qword, SizeOf(qword)); { size of active disk }
  qword := diskfree(0);
  Whirl_Update(sctx, @qword, SizeOf(qword)); { free space on active disk }
  Whirl_Update(sctx, @Ctr, SizeOf(Ctr));
  Whirl_Update(sctx, @randseed, SizeOf(randseed));
  Whirl_Final(sctx, sdig);
  move(sdig, salt, SizeOf(salt));
end;

function Encrypt1(const AText: string; const APassword: string): string;
{ -Encrypt file InName to OutName using password }
// http://www.wolfgang-ehrhardt.de/crypt_en.html
const
  bufSize = $C000;
var
  N : word;
  len : int64;
  hdr : TFCA256Hdr;
  cxe : TAES_EAXContext;
  auth : TFCA256_AuthBlock;
  TextOut, TextIn: TStringStream;
  buf : array [0 .. bufSize - 1] of Byte;
begin
  randomize;
  TextIn := TStringStream.Create(AText);
  TextOut := TStringStream.Create;
  try
    len := TextIn.Size;
    GetSalt(hdr.salt);

    if FCA_EAX256_initS(cxe, APassword, hdr) <> 0 then
      raise Exception.Create('Fehler'); // Abort('Internal error (FCA_EAX256_init)');

    TextOut.WriteBuffer(hdr, SizeOf(hdr));

    while len > 0 do
    begin
      if len > SizeOf(buf) then
        N := SizeOf(buf)
      else
        N := len;
      TextIn.ReadBuffer(buf, N);
      dec(len, N);
      if FCA_EAX256_encrypt(cxe, buf, N) <> 0 then
        raise Exception.Create('Fehler'); // Abort('Internal error (FCA_EAX256_encrypt)');
      TextOut.WriteBuffer(buf, N);
    end;
    FCA_EAX256_final(cxe, auth);
    TextOut.WriteBuffer(auth, SizeOf(auth));
    Result := Base64EncStr(TextOut.DataString);
  finally
    TextOut.Free;
    TextIn.Free;
  end;
end;

function Decrypt1(const AText: string; const APassword: string): string;
{ -Decrypt file InName to OutName using password sPW }
// http://www.wolfgang-ehrhardt.de/crypt_en.html
const
  bufSize = $C000;
var
  N : word;
  I, len : longint;
  hdrk : TFCA256Hdr;
  hdrf : TFCA256Hdr;
  cxe : TAES_EAXContext;
  cxh : TFCA_HMAC256_Context;
  authf : TFCA256_AuthBlock;
  authc : TFCA256_AuthBlock;
  UseEAX : boolean;
  TextOut, TextIn: TStringStream;
  buf : array [0 .. bufSize - 1] of Byte;
begin
  if AText = 'then
    Exit('');
  TextIn := TStringStream.Create(Base64DecStr(AText));
  TextOut := TStringStream.Create;
  try
    len := TextIn.Size - SizeOf(hdrf) - SizeOf(authf);
    TextIn.ReadBuffer(hdrf, SizeOf(hdrf));

    if (hdrf.FCASig <> C_FCA_Sig) or (hdrf.Flags and $F0 <> $A0) then
      raise Exception.Create('Fehler'); // Abort('Invalid file header');

    if hdrf.Flags and $02 <> 0 then
    begin
      writeln(#7'*** Warning: Found zlib compression flag, use t_zlibex to inflate <outfile>');
    end;

    if not(hdrf.Flags and $04 <> 0) then
    begin
      raise Exception.Create('Fehler'); // writeln('Found: 256 bit key size');
    end;

    hdrk := hdrf;
    UseEAX := odd(hdrf.Flags);
    if UseEAX then
    begin
      if FCA_EAX256_initS(cxe, APassword, hdrk) <> 0 then
        raise Exception.Create('Fehler'); // Abort('Internal error (FCA_EAX256_init)');
    end
    else
    begin
      if FCA_HMAC256_initS(cxh, APassword, hdrk) <> 0 then
        raise Exception.Create('Fehler'); // Abort('Internal error (FCA_HMAC256_init)');
    end;
    if hdrf.PW_ver <> hdrk.PW_ver then
      raise Exception.Create('Fehler'); // Abort('Wrong password');

    while len > 0 do
    begin
      if len > SizeOf(buf) then
        N := SizeOf(buf)
      else
        N := len;
      TextIn.ReadBuffer(buf, N);
      dec(len, N);
      if UseEAX then
      begin
        if FCA_EAX256_decrypt(cxe, buf, N) <> 0 then
          raise Exception.Create('Fehler'); // Abort('Internal error (FCA_EAX256_decrypt)');
      end
      else
      begin
        if FCA_HMAC256_decrypt(cxh, buf, N) <> 0 then
          raise Exception.Create('Fehler'); // Abort('Internal error (FCA_HMAC256_decrypt)');
      end;
      TextOut.WriteBuffer(buf, N);
    end;
    if UseEAX then
    begin
      FCA_EAX256_final(cxe, authc);
    end
    else
    begin
      FCA_HMAC256_final(cxh, authc);
    end;
    TextIn.ReadBuffer(authf, SizeOf(authf));
    for I := 0 to 15 do
    begin
      if authf[I] <> authc[I] then
      begin
        raise Exception.Create('Fehler'); // writeln(' Authentication failure!');
      end;
    end;
    Result := TextOut.DataString;
  finally
    TextOut.Free;
    TextIn.Free;
  end;
end;
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz