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
EdAdvokat

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

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

  Alt 14. Feb 2021, 11:14
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;
Norbert
  Mit Zitat antworten Zitat
Aviator

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

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

  Alt 14. Feb 2021, 11:29
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.
  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 14. Feb 2021, 12:02
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.
Norbert
  Mit Zitat antworten Zitat
TurboMagic

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

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

  Alt 14. Feb 2021, 14:42
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
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 14. Feb 2021, 15:22
Was wird der Unterschied zwischen DEC 6.1 und DEC 6.1 Lite sein?
Wirst du die Lite-Version auch auf GitHub einstellen? Ich kann mit getit nix anfangen und will das auch nicht.
  Mit Zitat antworten Zitat
TurboMagic

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

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

  Alt 14. Feb 2021, 15:28
Naja, die Lite wird zwar als Release auch auf GitHub auftauchen, aber wenn du
die normale benutzt bist du besser bedient. In der Lite fehlen nämlich alle
Verschlüsselungsalgorithmen und was damit sonst noch zusammenhängt (Demos, Unit Tests...),
da EMBT lieber vorsichtig wegen amerikanischer Exportbeschränkungen agiert...

Dadurch wird diese Bibliothek aber immerhin unter GetIt sichtbar...
Und die IsPassword Methode hat noch eine vereinfachte Implementierung bekommen.
Die wandert nacher aber auch gleich in den Development Branch.

Grüße

TurboMagic
  Mit Zitat antworten Zitat
DieDolly

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

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

  Alt 14. Feb 2021, 15:41
Was ist EMBT?
Heißt das also, DEC darf so nicht in den USA verwendet werden?

Bei DEC Lite fehlen alle Verschlüsselungsalgorithmen. Sollte das dann überhaupt noch "DEC" heißen?
  Mit Zitat antworten Zitat
TurboMagic

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

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

  Alt 14. Feb 2021, 16:07
1. EMBT = Embarcadero Technologies.

2. Die wollen einfsch keine Bibliotheken in GetIt die starke Verschlüsselung umsetzen,
dam man sonst möglicherweise mit irgendwelchen US Exportregularien in Konflikt geraten
könnte und man evtl. 'ne Menge Papierkram auszufüllen hat.

3. Das sollte uns aber nicht tangieren und du darfst deine mit der DEC geschriebene Software
auch in die USA verbreiten. Andere tun's auch. Was anderes wäre es evtl. wenn du Kunden im
Iran oder so hättest und denen solche Verschlüsselungstechnologie verfügbar machst.
Da hätten die Amis was dagegen.

Jetzt alles klar? Meiner Meinung nach reine Vorsichtsmaßnahme von EMBT.

=> wenn du GetIt nicht benutzt, interessiert dich die Lite nicht und wenn du die volle Version
kennst und nutzt isntalliere halt, was dir GitHub zur Verfügung stellt. GetIt ist für diese
Bibliothek einfach eine Möglichkeit weitere Nutzer "anzufüttern" ok?

Grüße
TurboMagic
  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 15. Feb 2021, 22:04
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?
Naja es ist wohl eher eine subjektive Wahrnehmung. Man kann sich jetzt über die Syntax streiten. Teilweise kommen mir die Dinge eben einfacher vor was die Schreibweise und die Nutzung angeht. Es kann aber evtl. auch einfach daran liegen, dass die Codevervollständigung in VS deutlich besser ist als bei Delphi und man dadurch "leichter" ans Ziel kommt.

Meine Delphi Klasse habe ich analog meiner C# Klasse aufgebaut. Im Endeffekt erkennt man alles irgendwie wieder.

Code:
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using WAC.Business.Interfaces;

namespace WAC.Business.Encryption
{
    public class AES : IAES
    {
        private readonly IAesKeyReader aesKeyReader;

        public AES(IAesKeyReader aesKeyReader)
        {
            this.aesKeyReader = aesKeyReader;
        }

        public byte[] Encrypt(string plainText)
        {
            using (AesManaged aes = new AesManaged())
            {
                return Encrypt(plainText, aes.IV);
            }
        }

        public string Decrypt(byte[] cipherText)
        {
            string plaintext = null;
            // Create AesManaged
            using (AesManaged aes = new AesManaged())
            {
                // Create the streams used for decryption.
                using (MemoryStream ms = new MemoryStream(cipherText))
                {
                    byte[] iv = new byte[16];
                    ms.Read(iv, 0, 16);

                    // Create a decryptor
                    ICryptoTransform decryptor = aes.CreateDecryptor(aesKeyReader.GetAesKey(), iv);

                    // Create crypto stream
                    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                    {
                        // Read crypto stream
                        using (StreamReader reader = new StreamReader(cs))
                            plaintext = reader.ReadToEnd();
                    }
                }
            }

            return plaintext;
        }

        public byte[] Encrypt(string plainText, byte[] iv)
        {
            byte[] encrypted;
            // Create a new AesManaged.
            using (AesManaged aes = new AesManaged())
            {
                // Create encryptor
                ICryptoTransform encryptor = aes.CreateEncryptor(aesKeyReader.GetAesKey(), iv);
                // Create MemoryStream
                using (MemoryStream ms = new MemoryStream())
                {
                    // Create crypto stream using the CryptoStream class. This class is the key to encryption
                    // and encrypts and decrypts data from any given stream. In this case, we will pass a memory stream
                    // to encrypt
                    using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        // Create StreamWriter and write data to a stream
                        using (StreamWriter sw = new StreamWriter(cs))
                            sw.Write(plainText);
                        encrypted = iv.Concat(ms.ToArray()).ToArray();
                    }
                }
            }
            // Return encrypted data
            return encrypted;
        }
    }
}
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:09 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