AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
Thema durchsuchen
Ansicht
Themen-Optionen

DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

Ein Thema von Aviator · begonnen am 10. Feb 2021 · letzter Beitrag vom 15. Feb 2021
Antwort Antwort
Seite 1 von 3  1 23      
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#1

DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 17:18
Hallo Delphianer,

ich nutze zum ersten Mal DEC in der Version 6.0. Zuvor habe ich noch nicht mit dem DEC gearbeitet und daher auch keine Vorkenntnisse darüber. Besonders viel findet man darüber aktuell auch (noch) nicht im Netz, da die Version ja recht frisch ist. Oder ich hab falsch gesucht.

Konkret geht es mir darum, dass ich eine Verschlüsselung (und logischerweise auch Entschlüsselung) per AES machen möchte. Ich bin auch mittlerweile so weit, dass das Ver- und Entschlüsseln funktioniert, habe aber den Verdacht, dass das einfacher funktionieren muss und ich nur auf dem Schlauch stehe. Vor allem dieses dauerhafte Umwandeln von TArray<Byte> in string und umgekehrt kommt mir recht aufwendig vor. Ich vermute ich kenne einfach nur die Kniffe noch nicht die man anwenden kann.

Speichern wollte ich den verschlüsselten String nachher im Base64 Format in einer JSON Datei. Der IV für die Verschlüsselung wird einfach als Byte Array vor den eigentlichen verschlüsselten Text gehängt. Das funktioniert auch schon.

Beim Entschlüsseln bekomme ich allerdings immer den String mit #0 nach den einzelnen Chars zurück. Ich tippe hier nur auf ein Problem mit den Encoding, konnte aber mit meinen Versuchen keine Lösung erzielen.

Kann mal jemand über meine Klasse und auch die Aufrufe der Methoden drüber schauen und mir ggf. einen Tipp geben was ich besser machen kann?

Delphi-Quellcode:
unit Common.Encryption.AES;

interface

uses
  Common.Interfaces.Aes, Common.Interfaces.AesKeyReader, DECCiphers, DECRandom, System.SysUtils, Logger.Interfaces,
  Logger.Enumerations, Logger.Helpers, DECCipherBase, System.Classes, System.Generics.Collections;

type
  TAes = class(TInterfacedObject, IAes)
  private
    FAesKeyReader: IAesKeyReader;
    FLogger: ILogger;
  public
    constructor Create(Logger: ILogger; AesKeyReader: IAesKeyReader);
    function Decrypt(Cipher: TArray<Byte>): string;
    function Encrypt(PlainText: string): TArray<Byte>; overload;
    function Encrypt(PlainText: string; IV: TArray<Byte>): TArray<Byte>; overload;
  end;

implementation

{ TAes }

constructor TAes.Create(Logger: ILogger; AesKeyReader: IAesKeyReader);
begin
  inherited Create;

  FLogger := Logger;
  FAesKeyReader := AesKeyReader;
end;

function TAes.Decrypt(Cipher: TArray<Byte>): string;
const
  IV_LEN = $10;
var
  AES: TCipher_AES;
  iv, data: TBytes;
  ms: TBytesStream;
  decrypted: TArray<Byte>;
begin
  try
    AES := TCipher_AES.Create;
    try
      ms := TBytesStream.Create(Cipher);
      try
        SetLength(iv, IV_LEN);
        if (ms.Read(iv, IV_LEN) = IV_LEN) then begin
          AES.Mode := cmCBCx;
          AES.Init(FAesKeyReader.GetAesKey, iv);

          SetLength(data, ms.Size - IV_LEN);
          if (ms.Read(data, ms.Size - IV_LEN) = ms.Size - IV_LEN) then begin
            decrypted := AES.DecodeBytes(data);
            Result := TEncoding.Default.GetString(decrypted);
          end;
        end;
      finally
        ms.Free;
      end;
    finally
      AES.Free;
    end;
  except
    on e: Exception do begin
      Result := EmptyStr;
      TLogHelper.LogMessage('Error decrypting given cipher: %s', [e.Message], lcError, FLogger);
    end;
  end;
end;

function TAes.Encrypt(PlainText: string): TArray<Byte>;
var
  IV: TArray<Byte>;
begin
  IV := RandomBytes($10);
  Result := Encrypt(PlainText, IV);
end;

function TAes.Encrypt(PlainText: string; IV: TArray<Byte>): TArray<Byte>;
var
  AES: TCipher_AES;
  Res: TArray<Byte>;
begin
  try
    AES := TCipher_AES.Create;
    try
      AES.Mode := cmCBCx;
      AES.Init(FAesKeyReader.GetAesKey, IV);
      Res := AES.EncodeStringToBytes(PlainText);
      SetLength(Result, Length(Res) + Length(IV));
      TArray.Copy<Byte>(IV, Result, 0, 0, Length(IV));
      TArray.Copy<Byte>(Res, Result, 0, Length(IV), Length(Res));
    finally
      AES.Free;
    end;
  except
    on e: Exception do begin
      Result := nil;
      TLogHelper.LogMessage('Error encrypting given string: %s', [e.Message], lcError, FLogger);
    end;
  end;
end;

end.
Die Funktion FAesKeyReader.GetAesKey() ruft nur den AES Key ab und lädt diesen von der Festplatte. Rückgabe ist in dem Fall auch ein TArray<Byte> .

Der aktuelle Testschlüssel mit dem ich verschlüssele sieht so aus (Byte Folge): C9 58 F5 C6 26 1C A9 C6 3D 55 AE 1F AE A5 03 39 07 06 2E 8F 90 FF AA 13 2C 56 5E 32 3C 83 B3 48 .
Input ist das Wort TestString welches im Zwischenschritt vor dem Base64Encode Aufruf (also nur mit der AES Verschlüsselung) die folgende Byte-Folge zurückgibt: F3 CA 54 23 0C DF 17 72 C1 94 5D 17 07 4F 8D 14 8A DF 7B 8C 71 D1 92 BD 4B 69 54 75 F1 A9 BF 2E 5B F0 66 E9 .
Der verwendete InitVector sieht so aus: F3 CA 54 23 0C DF 17 72 C1 94 5D 17 07 4F 8D 14 .
Base64Encoded sieht das dann so aus: 88pUIwzfF3LBlF0XB0+NFIrfe4xx0ZK9S2lUdfGpvy5b8Gbp .

Wenn ich den Base64 String nun wieder zurückwandele und das Ergebnis von FAes.Decode() zurück kommt, dann erhalte ich dieses Ergebnis: 'T'#0'e'#0's'#0't'#0'S'#0't'#0'r'#0'i'#0'n'#0'g'#0 .
Also den korrekten String nur eben mit #0 nach jedem einzelnen Char.

Der Aufruf der Methoden geschieht damit. Und hier vermute ich mein Problem und denke auch, dass das einfacher gehen müsste. FAes ist eine Instanz vom Typ IAes .

Delphi-Quellcode:
var
  s: string;
  Base64Decoded: TArray<Byte>;
  Result: string;

begin
  s := TEncoding.Default.GetString(TNetEncoding.Base64.Encode(FAes.Encrypt('TestString')));
  Base64Decoded := TNetEncoding.Base64.Decode(TEncoding.Default.GetBytes(s));
  Result := FAes.Decrypt(Base64Decoded);
end;

Geändert von Aviator (10. Feb 2021 um 17:34 Uhr) Grund: try ... finally hinzugefügt, da TBytesStream einen Memory Leak verursachte
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 17:40
Hallo Aviator,
nachdem TurboMagic einige Fehlerkorrekturen am DEC 6.0 vorgenommen hat, habe ich gleich mal mit dem letzten Stand des DEC (09.02.2021) etwas herumprobiert.
Damit ist es möglich, eine Klartextdatei mit AES zu verschlüsseln/entschlüsseln. Zugleich habe ich die verschiedenen Betriebsmodi integriert und auch einige Hash-Tools mit
gegeben. Einfach mal darüberschauen. Da Markus (TurobMagic) eine ähnliche Demo bereits erstellt hat, gehe ich davon aus, dass es auch im Sinne des "Schöpfers" ist.
Seine Intension für die Demo war zwar eher die Verwendung des Progress-Balkens.
Norbert

Geändert von EdAdvokat (10. Feb 2021 um 17:51 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 17:54
irgendwas mit dem Hochladen der Datei hat nicht geklappt. Hier nochmals ein Versuch.
Angehängte Dateien
Dateityp: zip DECProgress2.zip (217,2 KB, 9x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
DieDolly

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 18:06
Irgendwie sehr kompliziert diese Demo.
Ich verschlüssle gerade eine 25 GB große Datei und der visuelle Progress ist halt "nicht da".
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 19:25
25 GB ist ja fast das gepackte deutsche Internet
Da wirft das Programm klar die Hufe hoch. Ich habe es ebenfalls probiert. Doch mit einer Datei 407 MB läuft die Sache wie die Polizei in die Häuser...
Was ist denn so kompliziert an dem Programm?
Norbert
  Mit Zitat antworten Zitat
DieDolly

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 20:31
Ich verstehe, wie man eine Datei reinlädt, sie ver- und entschlüsselt. Der Rest ist ein Geheimnis für mich.
  Mit Zitat antworten Zitat
TurboMagic

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 20:41
Habe mir den Anhang noch nicht anschauen können, empfehle aber aus verschiedenen Gründen den Development Zweig zu nutzen.

Dort ist das mit dem Progress schon so umgebaut wie es mit V6.1 veröffentlicht werden wird. Sollte einfacher als das aus DEC 6.0 sein. Und ja ein einfaches Demo Programm ist da auch dabei.

Zu Base64: in der Format.pas ist da was passendes für drin...
Und Methoden die auf RawByte Strings arbeiten sind auch vorhanden, da sollte es auch keine Unicode String #0 Probleme geben.
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 21:55
die in #3 hochgeladene Demo ist auf Basis der Version 6.1 von DEC (Develelopment-Zweig) erstellt worden. Hinsichtlich der Progress-Funktion habe ich mich für die 3. Variante "anonymous method as progress event" entschieden. Auch die anderen in der Demo von TurboMagic aufgeführten Varianten wären möglich.
Die Demo ist also auf dem neusten Stand des DEC 6.1.
Norbert
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 10. Feb 2021, 22:20
Ich schaue mir die Format.pas morgen mal genauer an sofern ich die Zeit dazu finde. Danke schonmal für den Hinweis. Um das Verschlüsseln einer Datei geht es hier nicht im Geringsten sondern um das Verschlüsseln eines einzelnen Strings.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.094 Beiträge
 
Delphi 12 Athens
 
#10

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung

  Alt 12. Feb 2021, 09:01
Der Rest ist ein Geheimnis für mich.
Genau das ist ja der Sinn der Sache
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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