Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Probleme mit DCPcrypt (https://www.delphipraxis.net/196485-probleme-mit-dcpcrypt.html)

DLX 24. Mai 2018 14:10

Probleme mit DCPcrypt
 
Hallo,

ich verwende DCPcrypt zum ver- und entschlüsseln von Text. Das klappt soweit auch Prima, jedoch hab ich das Problem das irgendwelche komischen Sonderzeichen beim entschlüsseln angehängt werden, habt ihr eine Lösung dafür ?

Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,DCPcrypt2, DCPblockciphers, DCPrijndael, DCPbase64,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
function DecryptText():String;
var Cipher : TDCP_rijndael;
    Data, Key, IV : ansistring;
    index, dataLength, bsize, pad: integer;

begin
  key := '12345678901234567890123456789012';
  IV := '1234567890123456';
  Data := form1.Edit1.text;
  Data := DCPBase64.Base64DecodeStr(Data);
  Cipher := TDCP_rijndael.Create(nil);
  try
    Cipher.Init(Key[1],128,@IV[1]);

    Cipher.DecryptCBC(Data[1],Data[1],Length(Data));

  finally
    Cipher.Burn;
    Cipher.Free;
  end;

  form1.Memo1.Lines.Add(Data);


end;

function EncryptText():String;
var Cipher : TDCP_rijndael;
    Data,DataDec, Key, IV : ansistring;
    index, dataLength, bsize, pad: integer;
begin
  key := '12345678901234567890123456789012';
  IV := '1234567890123456';
  //Data := 'thisis128bitstxt';
  Data := form1.edit1.text;

  Cipher := TDCP_rijndael.Create(nil);
  try
    Cipher.Init(Key[1],128,@IV[1]);

    //don't miss padding
    {start padding}
    dataLength := Length(Data);
    bsize := (Cipher.BlockSize div 8);
    pad := bsize - (dataLength mod bsize);
    for index := 1 to pad do
      Data := Data+chr(pad);
    {end padding}

    Cipher.EncryptCBC(Data[1],Data[1],Length(Data));

  finally
    Cipher.Burn;
    Cipher.Free;
  end;

  Data := DCPBase64.Base64EncodeStr(Data);
  form1.Memo1.Lines.Add(Data);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EncryptText();

end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DecryptText();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.
Ich hoffe Ihr habt eine Idee, Danke schonmal :-)

Grüße

KodeZwerg 24. Mai 2018 14:32

AW: Probleme mit DCPcrypt
 
DCPcrypt von welcher Quelle?
eingestelltes Original von David A.W. Barton
von Warren Postma
von Multiple User

DLX 24. Mai 2018 16:21

AW: Probleme mit DCPcrypt
 
DCPcrypt v2.0 written by David Barton

gammatester 24. Mai 2018 16:23

AW: Probleme mit DCPcrypt
 
Das werden die Padding-Bytes sein. Ich sehe sie beim Verschlüsseln aber nicht beim Entschlüsseln. Lösungen:
  • Paddingbytes entfernen beim Entschlüsseln,
  • Kein Padding und 'manuelles' Auffüllen auf 16-Byte-Vielfaches,
  • Anderen Betriebsmodus nehmen (CFB8, CTR, OFB, CBC+Ciphertextstealing).

DLX 24. Mai 2018 16:39

AW: Probleme mit DCPcrypt
 
weiß jemand wie der code für das padding beim entschlüsseln wäre ?

gammatester 24. Mai 2018 16:55

AW: Probleme mit DCPcrypt
 
Zitat:

Zitat von DLX (Beitrag 1402893)
weiß jemand wie der code für das padding beim entschlüsseln wäre ?

Vermutlich ungefähr so in Pseudo-Code:
Code:
pad := ord(Data[length(Data)])
Entferne die letzten pad Bytes/Ansichars von Data
So wie ich den Source für's Verschlüsseln sehe, werden immer 1..16 Bytes angehängt.

KodeZwerg 24. Mai 2018 20:11

AW: Probleme mit DCPcrypt
 
Ersetze bei Dir
Delphi-Quellcode:
  form1.Memo1.Lines.Add(Data);
mit
Delphi-Quellcode:
  form1.Memo1.Lines.Add(Trim(Data));
und dann passt es.
In der DecryptText() funktion, falls das unklar ist.

ps: Ich habe die Sourceforge Variante genommen.
pps: Der Fehler ist das der Speicher überschrieben wird aber keine neue Länge bekommt.

gammatester 24. Mai 2018 20:32

AW: Probleme mit DCPcrypt
 
Zitat:

Zitat von KodeZwerg (Beitrag 1402914)
pps: Der Fehler ist das der Speicher überschrieben wird aber keine neue Länge bekommt.

Huh? Wo wird Speicher überschrieben?

Beim Verschlüsseln wird Data auf ein Vielfaches von 16 aufgefüllt (ohne Speicherüberschreibung).

Ich nehme ja wohl an, dass dieser verschlüsselte Text dann komplett wieder entschlüsselt wird. Da die Länge ein Vielfaches von 16 ist, kann er im CBC-Mode verarbeitet werden. Was übrigbleibt nach dem Entschlüsseln ist der Klartext+Padding, was noch entfernt werden muss.

Das Padding hängt n Bytes AnsiChar(n) an, wobei n = 16 - mod Klartextlänge ist. Mein Pseudocode macht das rückgängig.
Zitat:

Zitat von KodeZwerg (Beitrag 1402914)
Ersetze bei Dir
Delphi-Quellcode:
  form1.Memo1.Lines.Add(Data);
mit
Delphi-Quellcode:
  form1.Memo1.Lines.Add(Trim(Data));
und dann passt es.
In der DecryptText() funktion, falls das unklar ist.

Das wäre natürlich tödlich, da zB auch #9, #10, #13 entfernt würden. Der komplette Ciphertext ist relevant.

Edit: Sehe gerade das über Base64 gegangen wird, da sollte trim kein Problem sein, weil im Base64 keine relevanten Nicht-Ansidaten vorhanden sind. Aber das kann nicht das Problem sein, weil DCPBase64.Base64DecodeStr(Data) einen Fehler werfen müsste, falls ungültige Zeichen auftauchen.

KodeZwerg 24. Mai 2018 20:46

AW: Probleme mit DCPcrypt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang ein dreckiges aber lauffähiges Beispiel.
Umgang:
Bei Erststart tippe da wo Edit1 steht etwas ein was Du verschlüsseln magst
Drücke Knopf Button1
In Memo erscheint der Base64 String kopiere ihn
Ersetze Edit1 mit dem String
Drücke Knopf Button2

Klappts?

gammatester 24. Mai 2018 20:50

AW: Probleme mit DCPcrypt
 
Wäre es nicht sinnvoller den Quellcode zu posten, als ein nacktes EXE?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 Uhr.
Seite 1 von 5  1 23     Letzte »    

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