Delphi-PRAXiS
Seite 2 von 5     12 34     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)

KodeZwerg 24. Mai 2018 20:55

AW: Probleme mit DCPcrypt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von gammatester (Beitrag 1402917)
Wäre es nicht sinnvoller den Quellcode zu posten, als ein nacktes EXE?

Das tat ich.
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.

Der Rest vom Quelltext steht in Post #1 vom TE.

edit
Im Anhang der Source zum Sample

gammatester 24. Mai 2018 21:37

AW: Probleme mit DCPcrypt
 
Dein Sourcecode und wohl auch die Exe enthalten kein Entfernen des Paddings und ergeben deshalb Schrott. Mit dieser meiner Änderung funktionierts

Verschlüsseln
'Edit1' -> 'zwag7rEW4OWtTLpCHdbyoA=='

Entschlüsseln:
'zwag7rEW4OWtTLpCHdbyoA==' -> 'Edit1'
Delphi-Quellcode:
function DecryptText():String;
var Cipher : TDCP_rijndael;
    Data, Key, IV : ansistring;
    index, dataLength, bsize, pad: integer;
begin
  key := '12345678901234567890123456789012';
  IV := '1234567890123456';
  Data := DCPBase64.Base64DecodeStr(form1.Edit1.text);
  Cipher := TDCP_rijndael.Create(NIL);
  try
    Cipher.Init(Key[1],128,@IV[1]);
    Cipher.DecryptCBC(Data[1],Data[1],Length(Data));
    pad := 16- ord(Data[length(Data)]);
    for index :=1 to pad do delete(Data,length(Data),1);
  finally
    Cipher.Burn;
    Cipher.Free;
  end;
  form1.Memo1.Lines.Add(Data);
end;

KodeZwerg 24. Mai 2018 21:49

AW: Probleme mit DCPcrypt
 
Zitat:

Zitat von gammatester (Beitrag 1402920)
Dein Sourcecode und wohl auch die Exe enthalten kein Entfernen des Paddings und ergeben deshalb Schrott.

?
Wenn man natürlich stur seinen Willen haben möchte ohne überhaupt mal das andere ausprobiert zu haben.
Nutze mein .exe oder .dpr und bau eigenes .exe
Bedien es wie ich schrieb
Was soll bitteschön Schrott sein?
Hättest Du geschrieben das meine Methode Schrott ist weil sie führende oder abschließende Leerzeichen entfernt, da hät ich Dir Recht gegeben aber Grundlos so etwas zu Schreiben. Ich bin raus.

edit
und das beste, ohne Trim funktioniert dein Source null. Tolle Leistung. Aber mein Source = Schrott.

gammatester 24. Mai 2018 23:03

AW: Probleme mit DCPcrypt
 
Sorry, falls der Ton etwas rauh war.

Aber Dein Programm funktioniert, nur wenn der Text keine Ansizeichen <= 32 am Ende hat. Das ist vielleicht für das Ver/Entschlüsseln von Edit-Felder OK, aber nicht für allgemeine Daten. Aber selbst führende Leerzeichen werden weggetrimmt.

Versuche einmal ' a b c ' mit Deiner Version zu verarbeiten. Mit dem trim gibt das Entschlüsseln 'a b c', und wenn man das trim entfernt: ' a b c ???????' (im Original: Krakel statt ?)

Der Ciphertext ist für beide Versionen 'YEasidM6jJlOuYsjSFIliA=='

Allerdings muss ich sagen, das es für solche eingeschränkten Daten (also ohne führende und angehängte Leer- und Steuerzeichen) in der Tat zu funktioieren scheint, weil die Padding-Bytes <= #16 sind, die beim trim dann entfernt werden.

Und mein Program funktioniert auch nur, wenn das trim entfernt wird (aber das war schon vorhanden, ich wollte nur das De-Padding einbauen, habe das trim jetzt im Code entfernt). Ich verstehe nicht, wieso es mein Code bei Dir nicht funktioniert, wenn das Trim entfernt wird.

Gute Nacht
Gammatester

KodeZwerg 24. Mai 2018 23:48

AW: Probleme mit DCPcrypt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok gammatester, nur für Dich um Dir zu zeigen was da so passiert bei mir mit Deiner Änderung in Deiner letzten Variante.
Ich habe nun zwei Checkboxen drinn, GUI mini aufgewertet.
Checkbox1 ist dein Padding, On/Off.
Checkbox2 ist mein Trim, On/Off.
GUI ist diesmal beschriftet.

Delphi-Quellcode:
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));

    if form1.CheckBox1.Checked then
    begin
      pad := 16- ord(Data[length(Data)]);
      for index :=1 to pad do delete(Data,length(Data),1);
    end;

  finally
    Cipher.Burn;
    Cipher.Free;
  end;

  if form1.CheckBox2.Checked then
   form1.Memo1.Lines.Add(Trim(Data))
   else form1.Memo1.Lines.Add(Data);
  if form1.CheckBox2.Checked then
   form1.Edit1.Text := Trim(Data)
   else form1.Edit1.Text := Data;

end;
Im Anhang kompilat plus Source.
Sobald ich "mein" häckchen entferne, rate was passiert, das was der TE weg haben wollte erscheint wieder.

gammatester 25. Mai 2018 08:18

AW: Probleme mit DCPcrypt
 
Moin,
ich konnte das Problem mit dem De-Padding reproduzieren. Ich habe in der Hektik meinen eigenen Pseudo-Code falsch umgesetzt :wall:. Mit dieser Änderung Deines Codes sollte es OK sein
Delphi-Quellcode:
    if form1.CheckBox1.Checked then
    begin
      pad := ord(Data[length(Data)]);
      for index :=1 to pad do delete(Data,length(Data),1);
    end;
Natürlich ist das trotzdem noch eine Schnell-Lösung. Ein robuster Code sollte auch noch checken, ob der eingegebene Text für die Entschlüsselung gültiges Base64 ist, ob die Ciphertext-Länge ein Vielfaches von 16 ist, etc.

himitsu 25. Mai 2018 08:35

AW: Probleme mit DCPcrypt
 
Delphi-Quellcode:
for index :=1 to pad do delete(Data,length(Data),1);

wer sieht auch sofort, dass der Herr Mathematik das FOR sofort und mit nur einem Handgriff entfernen kann?


PS: StringOfChar für die andere Richtung.

KodeZwerg 25. Mai 2018 10:02

AW: Probleme mit DCPcrypt
 
Zitat:

Zitat von gammatester (Beitrag 1402940)
Mit dieser Änderung Deines Codes sollte es OK sein

Klappt diesmal!

Zitat:

Zitat von himitsu (Beitrag 1402942)
wer sieht auch sofort

Ich :lol:
Delphi-Quellcode:
      Delete(Data, Length(Data) +1 -pad, pad);
//oder
      SetLength(Data, Length(Data) -pad);
//oder
      Data := Copy(Data, 1, Length(Data) -pad);
Ich glaube SetLength() ist die schnellste von diesen Möglichkeiten. Ich nutze es jedenfalls.

DLX 28. Mai 2018 09:53

AW: Probleme mit DCPcrypt
 
Ich danke euch sehr für eure Hilfe! Klasse... echt !
Eine kurze Frage hab ich noch, kann ich auch Buchstaben als Key wählen ? Und muss dieser immer 32 zeichen lang sein ?

KodeZwerg 28. Mai 2018 10:23

AW: Probleme mit DCPcrypt
 
Delphi-Quellcode:
key := 'Super Geheim';
IV := 'DLX';
Es sind AnsiStrings, trag da ein was auch immer Du magst.

Ps:
Alternativ kannst Du es auch so machen:
Delphi-Quellcode:
function DecryptText(const Key, IV: AnsiString):String;
Und Du rufst die Funktion mit entsprechenden Parameter auf.
Also so:
Delphi-Quellcode:
function DecryptText(const Key, IV: AnsiString):String;
var Cipher : TDCP_rijndael;
    Data : ansistring;
    //Key, IV : ansistring; // <- Das hier rauswerfen
    index, dataLength, bsize, pad: integer;
begin
//  key := '12345678901234567890123456789012'; // <- Das hier rauswerfen
//  IV := '1234567890123456'; // <- Das hier rauswerfen


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 Uhr.
Seite 2 von 5     12 34     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