Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung (https://www.delphipraxis.net/206940-dec6-0-verstaendnisfrage-aes-ver-entschluesselung.html)

DieDolly 12. Feb 2021 08:03

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
 
Damit meine ich das UI.

himitsu 12. Feb 2021 09:32

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

Zitat von DieDolly (Beitrag 1482809)
Zitat:

Zitat von Rollo62 (Beitrag 1482808)
Zitat:

Zitat von DieDolly (Beitrag 1482720)
Der Rest ist ein Geheimnis für mich.

Genau das ist ja der Sinn der Sache :-D

Damit meine ich das UI.

Klar,

denn vom Code her sollte es ja kein Geheimnis sein.
"security through obscurity" ist nicht per se sicher.

Es ist bekannt, damit kann auch jeder nach Schwachstellen oder absichtlichen Hintertüren schauen,
aber es muß schwer/aufwändig/langsam genug sein, damit man es dennoch nicht so laucht aufbekommt.

Aviator 12. Feb 2021 16:23

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

Zitat von TurboMagic (Beitrag 1482723)
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.

Ich habe mir die DECFormats.pas jetzt mal angeschaut. Allerdings finde ich da jetzt nicht wirklich einen passenden Funktionsaufruf um mein Problem zu lösen. Kannst du mir da noch etwas auf die Sprünge helfen?
[EDIT] Zudem wäre die Frage, ob diese ganze hin und her Konvertiererei da sein muss oder ob das noch einfacher geht. Daher nochmal die Bitte ob sich jemand, der sich nicht über irgendeine UI und obfuscated Code auslassen will, mal meine Klasse in meinem ersten Post anschauen und was dazu sagen kann.[/EDIT]

Ich habe mir aktuell mal damit beholfen, dass ich alle #0 Chars aus meinem String entferne. Aber das ist ja nicht die Lösung. Wichtig ist nochmal, dass ich keine Datei sondern nur einen einfachen String AES verschlüsseln möchte.

TurboMagic 12. Feb 2021 16:57

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

probiere mal den Ansatz (ungetestet):

Delphi-Quellcode:
function TAes.Encrypt(PlainText: string; IV:TBytes):string;
var
  AES: TCipher_AES;
  Res: TArray<Byte>;
begin
  try
    AES := TCipher_AES.Create;
    try
      AES.Mode := cmCBCx;
      AES.Init(FAesKeyReader.GetAesKey, IV);
      result := DECFormat.TFormat_Base64.Encode(IV + AES.EncodeStringToBytes(RawByteString(PlainText)));
    finally
      AES.Free;
    end;
  except
    // snip
  end;
end;
Liefert gleich alles in Base64 zurück.
Seit XE7 kann man Arrays auch einfach so verketten...

Aviator 12. Feb 2021 18:16

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
 
Also mit der Lösung zum Verschlüsseln funktioniert dann auch das Entschlüsseln ohne die #0 Chars. Danke! :thumb:
Allerdings bleibe ich bei der Base64 Encode Methode aus System.NetEncoding, da die mir direkt einen String zurückgibt den ich dann weiterverarbeiten/speichern kann.

Was mir noch etwas Sorge bereitet ist das Trennen des IVs von den eigentlichen Nutzdaten. Wird dafür wirklich ein Stream benötigt oder gibt es hierfür auch einen einfacheren Weg wie beim Verknüpfen von zwei Byte Arrays?

TurboMagic 12. Feb 2021 19:20

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

ich glaube es gibt auch Delete für Arrays seit XE7.
Damals gab's da mehr neues zu Arrays.

Grüße
TurboMagic

EdAdvokat 14. Feb 2021 11:14

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
 
Das Experimentieren mit dem neuen DEC-Projekt 6.1 hat schon seinen Reiz.
Nachdem die Frage nach einer Lösung für encrypt/decrypt von Strings aufgeworfen wurde, habe ich dies mit der Methode EncodeStringToString gelöst
und es funktioniert auch.
Sicher war das wohl nicht sehr anspruchsvoll. Doch hier im Forum wurde die Anwendung der Methode EncodeBytes behandelt und so habe ich mich auch daran
versucht, jedoch bislang ohne durchgreifenden Erfolg.
Zunächst habe ich eine Konsolenanwendung mit EncodeBytes erstellt und die funktioniert auch. Dann wollte ich diese in eine VCL-Anwendung umsetzen und
da tauchten die Probleme auf.
Das Problem scheint die Umwandlung von TArray<Byte> in string für eine Ausgabe des verschlüsselten Textes zu sein und natürlich auch dann wieder
das gleiche Problem zurück bei der Decryptierung.
Ist der Ansatz überhaupt tragfähig, die Konsolenanwendung zur Grundlage zu nehmen? Die hier im Forum dargestellten Beispiele haben mich nicht so richtig
weiter gebracht, denn ich backe eher noch "kleine Brötchen" und mache das alles nur als Hobby mit eher mäßigem Erfolg, doch es reizt mich immer wieder.
Was ist das Besondere an der Methode EncodeBytes? Ist die wesentlich besser als die Methode EncodeStringToString?
Ich wäre daher sehr interessiert an einer Lösung der DEC-Verschlüsselung/Entschlüsselung mit der Methode EncodeBytes im VCL-Programm so etwa mit ButtonClick
auf encode und decode...
Anbei meine bescheidenen Versuche als Konsolenanwendung:
Delphi-Quellcode:
program Format_Console;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  DECFormat,
  DECCipherBase,
  DECCipherModes,
  DECCipherFormats,
  DECCiphers;

var
  Cipher    : TCipher_AES;
  SourceText : RawByteString;
  CipherKey : RawByteString;
  IV        : RawByteString;
  Input,
  Output    : TBytes;
  i         : Integer;

begin
  Cipher := TCipher_AES.Create;
  try
    try
      CipherKey := 'Passwort';
      IV := #0#0#0#0#0#0#0#0;
      Cipher.Init(CipherKey, IV, 0);
      Cipher.Mode := cmCBCx;
      SourceText := 'AES Bytes Beispiel';
      WriteLn('Source text: ' + SourceText);
      Input := System.SysUtils.BytesOf(SourceText);

      // Encrypt
      Output := Cipher.EncodeBytes(Input);
      Write('Encrypted data in hex: ');
      for i := 0 to high(Output) do
        Write(IntToHex(Output[i], 2), ' ');

      WriteLn;

       // Decrypt
      Cipher.Init(CipherKey, IV, 0);
      Output := Cipher.DecodeBytes(Output);
      SourceText := RawByteString(System.SysUtils.StringOf(Output));
      WriteLn('Decrypted data: ' + SourceText);

      ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
    finally
      Cipher.Free;
    end;
    readln;
end.
und in der VCL-Anwendung:

Delphi-Quellcode:
procedure TForm1.btn15Click(Sender: TObject); //enc bytes
var
  Cipher: TCipher_AES;
  Res: TArray<Byte>;
  CipherKey : RawByteString;
  sourceText : RawByteString;
  Input,
  Output    : TBytes;
  i         : Integer;
begin
  try
    Cipher := TCipher_AES.Create;
    try
      Cipher.Mode := cmCBCx;
      CipherKey := 'Passwort';
      //IV := #0#0#0#0#0#0#0#0;
      Cipher.Init(CipherKey);
      SourceText := 'Beispielklartext AES';    
      Input := System.SysUtils.BytesOf(SourceText);
      Res := Cipher.EncodeBytes(Input);
      for i := 0 to High(Res[i]) do
        (mmodecstr.text:=(IntToHex(Res[i], 2)));
    finally
      Cipher.Free;
    end;
  except
    // Fehlerbehandlung später
  end;

procedure TForm1.btn13Click(Sender: TObject); //dec Bytes
var Cipher    : TCipher_AES;
  SourceText : RawByteString;
  CipherKey : RawByteString;
  IV        : RawByteString;
  Input,
  Output    : TBytes;
  i         : Integer;
  out       : string;
  Hexwerte  : TArray<Byte>;

begin
      Cipher := TCipher_AES.Create;
      CipherKey := 'Passwort';
      IV := #0#0#0#0#0#0#0#0;
      Cipher.Init(CipherKey, IV, 0);
      Cipher.Mode := cmCBCx;
      //HexWerte := 56 5B 08 BE A7 D2 4C D7 7C 30 D2 2E EA BF 79 1F 5F 88 F0 80; (über showMessage abgeschrieben)
      Output := Cipher.DecodeBytes(HexWerte); //klappt natürlich nicht

      SourceText := RawByteString(System.SysUtils.StringOf(Output));
      mmodec1.text:= ('Decrypted data: ' + SourceText);
end;

Aviator 14. Feb 2021 11:29

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
 
Naja das hat zwar jetzt eigentlich nicht direkt etwas mit meiner Ausgangsfrage zu tun, aber folgendes ist ja das Problem.

Du verschlüsselst einen beliebigen String. Durch die Verschlüsselung werden Zeichen bzw. Blöcke in unterschiedlichste Byte Abfolgen verschlüsselt die keine lesbaren Zeichen darstellen. Daher auch meine Vorgehensweise mit Base64. Base64 kodiert einen String so, dass die Zeichen immer und überall gelesen, gespeichert und übertragen werden können ohne, dass bspw. irgendwelche Steuerzeichen wie #13 und #10 oder Escape (#27) darin vorkommen die Probleme bereiten könnten.

Ich habe mir die Ausgabe deiner beiden Anwendungen jetzt nicht direkt angeschaut, aber ich vermute mal einfach, dass die Konsolenanwendung durch den ohnehin schon kleineren Zeichensatz da irgendwelche kryptischen Zeichen mit reinhaut die für dich aussehen als würde es "funktionieren".

Ich kann jetzt aber auch komplett daneben liegen, da ich mit dem Thema Verschlüsselung erst recht kurz arbeite und dadurch auch nicht direkt Profi in dieser Sache bin. Ich hatte in C# die Berührungspunkte damit und wollte das nach Delphi übertragen, aber C# hat da von Haus aus schon deutlich mehr und einfacher zu verwendende Methoden. Zumindest empfinde ich das so.

EdAdvokat 14. Feb 2021 12:02

AW: DEC6.0 Verständnisfrage AES Ver-/Entschlüsselung
 
vielen Dank für die schnelle Reaktion.
Das Konsolenprogramm, wie gepostet liefert Hex-werte und daher keine Steuerzeichen. Es funktioniert tatsächlich es entschlüsselt tatsächlich den verschlüsselten string.
Bei meiner Lösung mit EncodeStringToString habe ich das Ergebnis der Verschlüsselung von String in Hex gewandelt und dann zurück bei der Decryptierung wieder von Hex in string.
Das hat geklappt.
Für die EncodeByte-Lösung wäre es mir auch egal ein anderes Ausgabeformat zu wählen, wenn ich nur wüßte wie das konkret geht.

TurboMagic 14. Feb 2021 14:42

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

Zitat von Aviator (Beitrag 1482928)
Ich kann jetzt aber auch komplett daneben liegen, da ich mit dem Thema Verschlüsselung erst recht kurz arbeite und dadurch auch nicht direkt Profi in dieser Sache bin. Ich hatte in C# die Berührungspunkte damit und wollte das nach Delphi übertragen, aber C# hat da von Haus aus schon deutlich mehr und einfacher zu verwendende Methoden. Zumindest empfinde ich das so.

Die Erklärung war ja schon ganz gut so. Mit Strings kann man sich halt schnell Zeichensatzkonvertierungsprobleme etc. einfangen und
TBytes wird auf alle Fälle dann benötigt, wenn binäre Daten wie Bilder verschlpüsselt werden sollen.

Tiefer steige ich jetzt mal gerade nicht ein, da ich gerade noch an der DEC 6.1 Lite für GetIt arbeite...

Meine Frage wäre, was C# da an einfacher zu verwendende Methoden bietet?
In Punkto Kryptographie oder in Punkto String vs. Byte Arrays etc. und deren Umwandlung?

Grüße
TurboMagic


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:28 Uhr.
Seite 2 von 3     12 3      

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