You are not logged in.
Pages: 1
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!!!
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;
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?
Pages: 1