Recent

Author Topic: AES-128 ECB decrypt example  (Read 419 times)

CC

  • Full Member
  • ***
  • Posts: 142
AES-128 ECB decrypt example
« on: January 29, 2021, 02:27:27 am »
Hi,

as the title says it.
I have looked around but I could not find anything truly useful.

lainz

  • Hero Member
  • *****
  • Posts: 4007
  • Leandro Diaz
Re: AES-128 ECB decrypt example
« Reply #1 on: January 29, 2021, 03:53:02 am »
In other words Rijndael.

https://wiki.freepascal.org/DCPcrypt

Check that package, it has useful demos.
https://lainz.github.io/ - My Website :)
https://lazpaint.github.io/ -  Download LazPaint

trev

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 1379
  • Former Delphi 1-7, 10.2 User
Re: AES-128 ECB decrypt example
« Reply #2 on: January 29, 2021, 03:54:50 am »
You didn't look very far... this post for example.
Lazarus 2.1 r64861 FPC 3.3.1 r49035 macOS 10.14.6 Xcode 11.3.1
Lazarus 2.1 r65006 3.3.1 r49213 macOS 11.2.3 aarch64 Xcode 12.4
Lazarus 2.1 r61574 3.3.1 r42318 FreeBSD 12.1 amd64 VMware VM
Lazarus 2.1 r61574 3.0.4 Ubuntu 20.04 Parallels VM
Lazarus 2.0.10 3.2.0 Win10 Parallels VM

CC

  • Full Member
  • ***
  • Posts: 142
Re: AES-128 ECB decrypt example
« Reply #3 on: January 29, 2021, 12:31:55 pm »
I have spent quite a few hours on this before asking and I did find the exact links provided here. Just figured that copy-pasting an example would be the least time consuming help. Faster then looking at my code. But here it is anyway. I know the format  the result should be, but it currently is gibberish.

The input length is 87.

Code: Pascal  [Select][+][-]
  1. function TForm1.AES128_ECB_Decrypt(AString, aKey: string): string;
  2. var
  3.   inData  : TBytes;
  4.   outData : TBytes;
  5.   StreamSize: Int64;
  6.   KeySizeInBytes, BlockSize: integer;
  7.   inStream,outStream: TStringStream;   //inStream
  8. begin
  9.   inStream:= TStringStream.Create(AString);
  10.   StreamSize:=  inStream.Size;
  11.   outStream:= TStringStream.Create;
  12.    try
  13.      KeySizeInBytes:= 16;
  14.      BlockSize:= KeySizeInBytes;
  15.      SetLength(inData, BlockSize);
  16.      SetLength(outData, BlockSize);
  17.      //AES_Cipher := TDCP_rijndael.Create(nil); // already exists
  18.      AES_Cipher.Init(aKey , 128, nil );
  19.  
  20.      While StreamSize > 0 do
  21.      begin
  22.        inStream.ReadBuffer(inData[0], BlockSize);
  23.        AES_Cipher.DecryptECB(inData[0], outData[0]);
  24.        outStream.WriteBuffer(outData[0], BlockSize);
  25.        Log(inData);
  26.        Log(outData);
  27.        Dec(StreamSize, BlockSize);
  28.        if StreamSize < KeySizeInBytes then  // Last block less then key size
  29.        begin
  30.           BlockSize:= StreamSize;
  31.           SetLength(inData, BlockSize);
  32.           SetLength(outData, BlockSize);
  33.        end;
  34.      end;
  35.      result:= outStream.DataString;
  36.    finally
  37.      inStream.Free;
  38.      outStream.Free;
  39.    end;
  40. end;                                

Result:
Quote
??M??.?I???RM?4?(%?=?6????ro?Id??m
??)\??
NO[??5??.????܊??r>?w𷋊xլ?k
« Last Edit: January 29, 2021, 01:10:13 pm by CC »

CC

  • Full Member
  • ***
  • Posts: 142
Re: AES-128 ECB decrypt example
« Reply #4 on: January 29, 2021, 08:17:45 pm »
I still do not see what is wrong with the above code, but I got it working with mORMot lib SynCrypto.TAESECB.
It is higher level solution, only few lines of code to use it. Base64 decoding may be necessary  first though.
« Last Edit: January 29, 2021, 11:25:08 pm by CC »

 

TinyPortal © 2005-2018