Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rijndael decrypt mit Passwort & IV als Passphrase (https://www.delphipraxis.net/195384-rijndael-decrypt-mit-passwort-iv-als-passphrase.html)

totti14 23. Feb 2018 18:21

Rijndael decrypt mit Passwort & IV als Passphrase
 
Hallo,
ich versuche gerade einen Block mit TDCP_Rijndael zu entpacken aber ich habe den Key & IV als String.
In den C Rijndael's gibt es dort ein MakeKey(...
Hat jemand einen Tip wie das hier gemacht wird ?

Ich kann ja wahrscheinlich den Key&IV als String nicht so übergeben ?

Danke

Delphi-Quellcode:

var
  Cipher : TDCP_Rijndael;
begin
  Cipher := TDCP_Rijndael.Create(nil);
  try
    Cipher.MakeKey('Key16_123456789!','Vector16_1234567',16,16);  <<<< ???

    Cipher.Init(aKey, Length(aKey)*8, aPVector);  
    Cipher.CipherMode := cmEBC;
    Cipher.DecryptStream(aInData, aOutData, aInData.Size);

gammatester 23. Feb 2018 18:45

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
Zitat:

Zitat von totti14 (Beitrag 1394534)
Hallo,
ich versuche gerade einen Block mit TDCP_Rijndael zu entpacken aber ich habe den Key & IV als String.
In den C Rijndael's gibt es dort ein MakeKey(...
Hat jemand einen Tip wie das hier gemacht wird ?
Delphi-Quellcode:
//
    Cipher.MakeKey('Key16_123456789!','Vector16_1234567',16,16);  <<<< ???

    Cipher.Init(aKey, Length(aKey)*8, aPVector);  
    Cipher.CipherMode := cmEBC;

In welchen C Rijndael's? Gib das doch als Vorlage hier an. Mit den gezeigten Werten vermute ich Blockgröße 16, 128-Bit Schüssel: also eigentlich AES-128. Allerdings gibt es keinen EBC-Modus sondern ECB, der ist aber nicht empfehlenswert und hat keinen IV.

Makekey erweckt die Vorstellung, daß aus einer Passwort-Phrase ein Schlüssel erstellt werden soll: Welche KDF wird in C verwendet? Allerdings könnten die 16 Zeichen/Bytes eines Ansi-Strings auch direkt als Schlüssel verwendet werden. Sicherheitshalber sollte der Schüssel aber als Bytes vorliegen, sonst gibt es eventuell Problem mit 2-Byte-Unicode-Strings.

totti14 23. Feb 2018 18:53

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
Hallo gammatester,

das war die C Funktion dazu.

Code:
//Expand a user-supplied key material into a session key.
// key       - The 128/192/256-bit user-key to use.
// chain     - initial chain block for CBC and CFB modes.
// keylength - 16, 24 or 32 bytes
// blockSize - The block size in bytes of this Rijndael (16, 24 or 32 bytes).
void CRijndael::MakeKey(char const* key, char const* chain, int keylength, int blockSize)
Der falsche Mode ist da aus einen Copy&Paste reingerutscht :)

gammatester 23. Feb 2018 19:34

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
OK, nehmen wird an, das ECB mit 128-Bit key vorliegt, dann sollte
es ungefähr so gehen
Delphi-Quellcode:
var
  AES: TDCP_rijndael;

const
  key128: array[0..15] of Ansichar = 'Key16_123456789!';
var
  plain,ct: array[0..15] of byte
...
  AES.Init(key128,128,nil);
  AES.EncryptECB(plain,ct);
Das Problem mit DCPCrypt (so wie ich es kenne, zB dcpcrypt2-2010.zip) ist, daß EncryptECB nur einen 16-Byte-Block akzeptiert. Du mußt also in einer Schleife entschlüsseln.

Zu Testen kannst Du zB http://jacquelin.potier.free.fr/CryptoStuff/ hernehmen. Wenn's dann wirklich ECB ist kannst Du auch meine AES-Routinen http://www.wolfgang-ehrhardt.de/crypt_de.html#AES verwenden.

totti14 23. Feb 2018 19:44

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
Mode ist CBC und dann a' 64 Byte Blöcke.
Das entpacken usw bekomme ich ja noch hin aber ich habe keine Ahnung von der Initialisierung mit den beiden String.

Hier ist mal ein Beispiel von der C Unit

https://www.codeproject.com/Articles...ncryption-Decr

Das CryptoTool ist ja sehr schön. Kannte ich gar nicht.
Damit hat das AES entpacken funktioniert wenn ich dort meine beiden Strings unter Key & IV eingebe.

gammatester 23. Feb 2018 20:14

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
Hier ein volständiges Programm analog zu C mit Ver- und Entschlüssseln (ich benutze Deinem IV in C hat man 16 0-Bytes).
Delphi-Quellcode:
program T_DCP;

{$apptype console}

uses
  SysUtils,
  Classes,
  DCPcrypt2,
  DCPblockciphers,
  DCPrijndael;

var
  AES: TDCP_rijndael;

var
  sm_chain0: array[0..15] of Ansichar = 'Vector16_1234567';
  key: array[0..15] of Ansichar = '1234567890123456';
  szDataIn1: array[0..47] of Ansichar = 'ababababccccccccababababccccccccababababcccccccc';

procedure TestCBCDP;
var
  i: integer;
var
  tmp,szDataOut: array[0..47] of Ansichar;
begin
  //fillchar(sm_chain0, sizeof(sm_chain0), 0);
  //Verschlüsseln
  AES.CipherMode := cmCBC;
  AES.Init(key,128,@sm_chain0);
  AES.EncryptCBC(szDataIn1,szDataOut,sizeof(szDataIn1));
  writeln('Verschuesseln: ');
  writeln(szDataOut);

  //Entschlüsseln
  AES.CipherMode := cmCBC;
  AES.Init(key,128,@sm_chain0);
  AES.DecryptCBC(szDataOut,tmp,sizeof(szDataIn1));
  writeln('Ver + Entschuesseln: ',tmp);
end;

begin
  AES := TDCP_rijndael.Create(nil);
  TestCBCDP;
end.
Und das Ergebnis
Code:
C:\TMP\yy>T_DCP.exe
Verschuesseln:
à¤&#9484;é&#9524;&#9568;7}Ê©&#9604;ÒáÁ¬, 3{&#9488;Wf&#9556;&#9827;&#9571;[G&#9786;
Ver + Entschuesseln: ababababccccccccababababccccccccababababcccccccc

totti14 24. Feb 2018 09:52

AW: Rijndael decrypt mit Passwort & IV als Passphrase
 
Danke gammatester funzt perfekt.:)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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