2

I am trying to encrypt / decrypt a string using Rijndael from php to Delphi and back.

If I decrypt a PHP string from Delphi ... works fine.

If I encrypt a string with Delphi the result string is ok but shorter

for test I used a string with 62 character. the encrypted string with delphi is long 4 char less of PHP

these the strings ... last characters:

PHP: GyLWj1anBJRmE8mBsaO5cvTrcbvvA==

Delphi: GyLWj1anBJRmE8mBsaO5cvTrcbv

thanks for any advices

I use this source code example:

PHP:

function encrypt ($key, $value)
{
  $padSize = 16 - (strlen ($value) % 16) ;
  $value = $value . str_repeat (chr ($padSize), $padSize) ;
  $output = mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $key, $value, MCRYPT_MODE_CBC, 'xxxxxxx') ;
  return base64_encode ($output) ;
}

Delphi encrypt:

function EncryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
  cipher: TDCP_rijndael;
  key, iv, src, dest, b64: TBytes;
  index, slen, bsize, pad: integer;
begin
  //key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
  //iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
  key := TEncoding.ASCII.GetBytes(AKey);
  iv := TEncoding.ASCII.GetBytes(AIv);

  src := TEncoding.ascii.GetBytes(Data);

  cipher := TDCP_rijndael.Create(nil);
  try
    cipher.CipherMode := cmCBC;
    // Add padding.
    // Resize the Value array to make it a multiple of the block length.
    // If it's already an exact multiple then add a full block of padding.
    slen := Length(src);
    bsize := (cipher.BlockSize div 8);
    pad := bsize - (slen mod bsize);
    Inc(slen, pad);
    SetLength(src, slen);

    for index := pad downto 1 do
    begin
      src[slen - index] := pad;
    end;

    SetLength(dest, slen);
    cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
    cipher.Encrypt(src[0], dest[0], slen);

    b64 := Base64EncodeBytes(dest);
    result := TEncoding.Default.GetString(b64);
  finally
    cipher.Free;
  end;
end;

Delphi decrypt ... not works:

function DecryptData3(Data: string; AKey: AnsiString; AIv: AnsiString): string;
var
  key, iv, src, dest: TBytes;
  cipher: TDCP_rijndael;
  slen, pad: integer;
begin
  //key := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AKey));
  //iv := Base64DecodeBytes(TEncoding.UTF8.GetBytes(AIv));
  key := TEncoding.ASCII.GetBytes(AKey);
  iv := TEncoding.ASCII.GetBytes(AIv);

  src := Base64DecodeBytes(TEncoding.UTF8.GetBytes(Data));

  cipher := TDCP_rijndael.Create(nil);
  try
    cipher.CipherMode := cmCBC;
    slen := Length(src);
    SetLength(dest, slen);
    cipher.Init(key[0], 256, @iv[0]); // DCP uses key size in BITS not BYTES
    cipher.Decrypt(src[0], dest[0], slen);
    // Remove the padding. Get the numerical value of the last byte and remove
    // that number of bytes
    pad := dest[slen - 1];
    SetLength(dest, slen - pad);

    // Base64 encode it
    result := TEncoding.Default.GetString(dest);
  finally
    cipher.Free;
  end;
end;
15
  • If want to read all questions/answers or blog articles in the whole WWW dealing with this you can spend some years on. Here on SO this question is asked nearly once a week just in the delphi corner. Commented Feb 9, 2015 at 15:54
  • I found the two answers to the problem ... but it does not solve anything. Commented Feb 9, 2015 at 16:10
  • Ken, the linked answer does not have an accepted answer. Commented Feb 9, 2015 at 16:26
  • Possible duplicates. Commented Feb 9, 2015 at 17:42
  • 1
    To be clear then vA== represents a single byte. So there's a one byte difference between the two encrypted texts. You are clearly close. I'd try to find out what that one byte difference is. Commented Feb 9, 2015 at 19:01

1 Answer 1

2

I don't know if I used a correct way ... but if I convert the Bytes Value in String and I use this Base64Encode in this link:

Simple code to encrypt an .INI file string using a password

now I encrypt correctly. this is the example:

SetString(stringValue, PAnsiChar(@dest[0]), slen); 
result := Base64Encode2(stringValue);
Sign up to request clarification or add additional context in comments.

1 Comment

When are Delphi programmers going to learn that text and binary are not the same. That binary doesn't belong in strings. And that base64 encodes binary to text.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.