View Single Post
  #4  
Old 03-06-2020, 16:06
phroyt phroyt is offline
Friend
 
Join Date: May 2018
Posts: 77
Rept. Given: 0
Rept. Rcvd 8 Times in 4 Posts
Thanks Given: 35
Thanks Rcvd at 106 Times in 40 Posts
phroyt Reputation: 8
Cool

After some time, I got this solved.

The DEC 3.0 library (Delphi Encryption Compedium Part I), allow you to inform one Key in the object creation with any length.

PHP Code:
Key := 'd90cwjipoybs3usoh6bs0yn53jk0nlijyy3eocr1lmp0hbdv8o1u3fer7m8bgcpz';
Cipher := TCipher_Rijndael.Create(Keynil); 
Behind the TCipher.Create method, it is used a THash_RipeMD256 to create a DigestKey, 32 bytes long.
And the Initialization of Cipher is done too.

I mislead to think that the AES code was wrong, because the result text still scrambled.
But after taking a little more debugging I found a nasty XOR with a fixed key.

Voilá!

Below is the correct code, that has no dependency on DEC Version.
Compiles on D7 to D10.2, only need to change DEC unit names:

PHP Code:
implementation

{$R *.dfm}

uses
  Cipher
Cipher1Hash;

procedure SimpleXOR(VPAnsiStringXPAnsiString);
var
  
I,J,K,LInteger;
begin
  L 
:= 0;
  
:= Length(V^);
  if (
1then
  begin
    K 
:= Length(X^);
    for 
:= 1 to J do
    
begin
      Inc
(L);
      if (
L>Kthen
        L 
:= 1;
      
V^[I] := AnsiChar(Ord(V^[I]) xor Ord(X^[L]));
    
end;
  
end;
end;

function 
DecodeFile(FilenameString): AnsiString;
const
  
CodeAnsiString =
    
#$CE#$E1#$FB#$BF#$E8#$AE#$F1#$83+
    #$23#$24#$25#$26#$3F#$7D#$2A#$28+
    #$3C#$3E#$5E#$3B#$B4;
  
KeyAnsiString =
    
'd90cwjipoybs3usoh6bs0yn53jk0nli'+
    
'jyy3eocr1lmp0hbdv8o1u3fer7m8bgcpz';
var
  
CipherTCipher_Rijndael;
  
HashTHash_RipeMD256;
  
KString;
  
F1TFileStream;
  
S1TStringStream;
  
DataAnsiString;

begin
  Result 
:= '';
  if 
FileExists(Filenamethen
  begin
    F1 
:= TFileStream.Create(FilenamefmOpenRead+fmShareDenyNone);
    
S1 := TStringStream.Create('');

    
//DEC 3.0
    
Cipher := TCipher_Rijndael.Create(''nil);
    
Hash := THash_RipeMD256.Create(nil);
    
Hash.Init;
    
Hash.Calc(PAnsiChar(Key)^, Length(Key));
    
Hash.Done;
    
Cipher.Init(Hash.DigestKey^, Hash.DigestKeySizenil);
    
Cipher.EncodeBuffer(Hash.DigestKey^, Hash.DigestKey^, Hash.DigestKeySize);
    
Cipher.Done;

    
F1.Position := 0;
    
S1.Size := F1.Size;
    
S1.Position := 0;
    
Cipher.DecodeStream(F1S1F1.Size);
    
FreeAndNil(Cipher);

    
S1.Position := 0;
    
SetLength(DataS1.Size);
    
Data := S1.DataString;
    
FreeAndNil(F1);
    
FreeAndNil(S1);

    
SimpleXOR(PAnsiString(@Data), PAnsiString(@Code));
    
Result := Data;
  
end;
end;

procedure TForm1.btn1Click(SenderTObject);
var
  
FPString;
  
F1TFileStream;
begin
  P 
:= ExtractFilePath(ParamStr(0));
  
:= P+'somefile.bin';
  
mmo1.Text := DecodeFile(F);
end

Reply With Quote
The Following User Gave Reputation+1 to phroyt For This Useful Post:
niculaita (03-28-2020)
The Following 5 Users Say Thank You to phroyt For This Useful Post:
Abaddon (03-06-2020), chants (03-06-2020), niculaita (03-07-2020), ontryit (04-13-2020), ziapcland (04-13-2020)