#1 Re: mORMot 1 » TAESCBC compatibility » 2014-02-03 02:07:26

Ok, switched to AES 256 and moved away from PHP mcrypt to phpseclib due to '\0' padding in data.

Here's the code in case anyone needs.

PHP:

// http://phpseclib.sourceforge.net/
set_include_path('include/phpseclib0.3.5');
include('Crypt/AES.php');

$my_key = 'testkey';
$my_iv = '1234567890ABCDEF';

$cipher = new Crypt_AES(); // could use CRYPT_AES_MODE_CBC
// keys are null-padded to the closest valid size
// longer than the longest key and it's truncated
//$cipher->setKeyLength(256);
$cipher->setKey(hash('SHA256', $my_key, true));
$cipher->setIV($my_iv); // defaults to all-NULLs if not explicitely defined
//$cipher->disablePadding();

echo base64_encode(@$cipher->encrypt('testdata'));

Delphi:

Uses SynCommons, SynCrypto;

procedure TForm1.Button1Click(Sender: TObject);
const
  my_key = 'testkey';
  my_iv  = '1234567890ABCDEF';
var
  key : TSHA256Digest;
  aes : TAESCBC;
  iv  : TAESBlock;
begin
  HexToBin(Pointer(SHA256(my_key)), @key, 32);
  Move(TEncoding.ANSI.GetBytes(my_iv)[0], iv[0], 16);
  aes := TAESCBC.Create(key, 256, iv);
  try
    Edit1.Text := BinToBase64(aes.EncryptPKCS7('testdata'));
  finally
    aes.Free;
  end;
end;

P.S. Thank you so much Synopse!!!

#2 Re: mORMot 1 » TAESCBC compatibility » 2014-02-03 01:18:28

Found the problem in my code. Thanks!

New delphi code:

Uses ...SynCommons, SynCrypto...

procedure TForm1.Button1Click(Sender: TObject);
var
  aes: TAESCBC;
  iv: TAESBlock;
begin
  FillChar(iv, 16, 65); // 65 = A
  aes := TAESCBC.Create(AnsiString('AAAAAAAAAAAAAAAA'), 128, iv);
  Edit1.Text := BinToBase64(aes.EncryptPKCS7('test'));
  aes.Free;
end;

#3 mORMot 1 » TAESCBC compatibility » 2014-02-02 16:44:45

Swanty
Replies: 5

So basically I'm trying to use SynCrypto TAESCBC in my Delphi application and PHP.

The code that I have in php:

<?php
function addpadding($string, $blocksize = 16)
{
    $len = strlen($string);
    $pad = $blocksize - ($len % $blocksize);
    $string .= str_repeat(chr($pad), $pad);
    return $string;
}

function encrypt($data) 
{ 
    $iv = "AAAAAAAAAAAAAAAA";
    $key = 'AAAAAAAAAAAAAAAA';

    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, addpadding($data), MCRYPT_MODE_CBC, $iv));
}

echo encrypt('test');
?>


Code that I have in C#:

        private string AES_Key = @"AAAAAAAAAAAAAAAA";
        private string AES_IV = @"AAAAAAAAAAAAAAAA";

        private String AES_encrypt(String Input)
        {
            var aes = new RijndaelManaged();
            aes.KeySize = 128;
            aes.BlockSize = 128;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;
            aes.Key = Encoding.UTF8.GetBytes(AES_Key);
            aes.IV = Encoding.UTF8.GetBytes(AES_IV);

            var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
            byte[] xBuff = null;
            using (var ms = new MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
                {
                    byte[] xXml = Encoding.UTF8.GetBytes(Input);
                    cs.Write(xXml, 0, xXml.Length);
                }
                xBuff = ms.ToArray();
            }

            String Output = Convert.ToBase64String(xBuff);
            return Output;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(AES_encrypt("test"));
        }


Code in Delphi:

Uses ...SynCommons, SynCrypto...

procedure TForm1.Button1Click(Sender: TObject);
var
  aes: TAESCBC;
  iv: TAESBlock;
begin
  FillChar(iv, 16, 65); // 65 = A
  aes := TAESCBC.Create('AAAAAAAAAAAAAAAA', 128, iv);
  Edit1.Text := BinToBase64(aes.EncryptPKCS7('test'));
  aes.Free;
end;

Results:
PHP    = 1E6FuveraIZPdP85AP4j7Q==
C#     = 1E6FuveraIZPdP85AP4j7Q==
Delphi = OfDDh/gm/SZtrVCo2l6R6A==

What am I doing wrong?

Board footer

Powered by FluxBB