Delphi / PHP Шифрование LockBox AES ECB

Есть несколько вариантов этого вопроса, но я не смог определить проблему. Попытка зашифровать / дешифровать в PHP и Delphi
Я предполагаю, что пропустил некоторые настройки в Delphi, и это связано с UTF-8

с помощью http://aesencryption.net/ в качестве примера PHP результат, который мы пытаемся получить. Удар изображения
Пароль = 123
Ключ = Тест
128 бит
Шифрует в uuIikEZSC9Sa1HAt / XKfGQ ==

Я хочу, чтобы иметь возможность расшифровать это в Delphi
Я использую Delphi XE5
с https://github.com/SeanBDurkin/tplockbox
Я могу получить шифрование / дешифрование, работающее внутри Delphi, но строка зашифрованной версии PHP отличается

Delphi шифрует 123 в vpdeLlfnxTGrSsa2TpbFvg ==

Вот краткий пример шифрования Delphi

function TForm3.EncryptV2(plainText: UTF8String): String;
var CipherText : string;
FLibrary: TCryptographicLibrary;
FCodec: TCodec;
begin
mmo1.Lines.Add('plaintext = ' + plainText);

FLibrary := TCryptographicLibrary.Create(Self);
try
FCodec := TCodec.Create(Self);
try
FCodec.CryptoLibrary := FLibrary;
FCodec.StreamCipherId := BlockCipher_ProgId;
FCodec.BlockCipherId := Format(AES_ProgId, [256]);
FCodec.ChainModeId := ECB_ProgId; ;
FCodec.UTF8Password := 'test';
FCodec.EncryptString( plainText, CipherText, Tencoding.UTF8 );
FCodec.Burn;

result := CipherText;
finally
FCodec.Free;
end;
finally
FLibrary.Free;
end;
end;

расшифровывать

function TForm3.DecryptV2(encryptedText: UTF8String): String;
var plainText : string;
FLibrary: TCryptographicLibrary;
FCodec: TCodec;
begin
FLibrary := TCryptographicLibrary.Create(Self);
try
FCodec := TCodec.Create(Self);
try
FCodec.CryptoLibrary := FLibrary;
FCodec.StreamCipherId := BlockCipher_ProgId;
FCodec.BlockCipherId := Format(AES_ProgId, [256]);
FCodec.ChainModeId := ECB_ProgId; ;
FCodec.UTF8Password := 'test';

mmo1.Lines.Add('Encrypted Text = ' + encryptedText);
FCodec.DecryptString( plainText, encryptedText,Tencoding.UTF8 );
mmo1.Lines.Add('DeCrypted Text = ' + plainText);
result := plainText;
finally
FCodec.Free;
end;
finally
FLibrary.Free;
end;
end;

У кого-нибудь есть предложения?

введите описание изображения здесь

0

Решение

Не уверен, что не так с lockbox, но вот код, который соответствует шифрованию с использованием OpenSSL, модуль OverbyteIcsLibeay из библиотеки ICS http://wiki.overbyte.be/wiki/index.php/ICS_Download

{$APPTYPE CONSOLE}
program aestest;

uses System.SysUtils, System.NetEncoding, OverbyteIcsLibeay;

type
TKey128 = packed array [0..15] of byte;
TIV128  = packed array [0..15] of byte;

function AES128EncryptDecrypt(var Source: TBytes; const Key: TKey128;
const InitializationVector: TIV128; Encrypt: boolean): boolean;
var
IV: TIV128;
CipherCtx: PEVP_CIPHER_CTX;
Dest: TBytes;
OutLen: Integer;
begin
Result := False;
IV := InitializationVector;
LoadLibeayEx;
SetLength(Dest, Length(Source) + Length(Key));
CipherCtx := f_EVP_CIPHER_CTX_new;
try
f_EVP_CIPHER_CTX_init(CipherCtx);
if Encrypt then
begin
if f_EVP_EncryptInit_ex(CipherCtx, f_EVP_aes_128_ecb(), nil, @Key[0], @IV[0]) then
begin
Result := f_EVP_EncryptUpdate(CipherCtx, @Dest[Low(Dest)], OutLen, @Source[Low(Source)], Length(Source));
if Result then
Source := Copy(Dest, Low(Dest), OutLen);
end;
end
else
begin
if f_EVP_DecryptInit_ex(CipherCtx, f_EVP_aes_128_ecb(), nil, @Key[0], @IV[0]) then
begin
SetLength(Source, Length(Source) + Length(Key));
Result := f_EVP_DecryptUpdate(CipherCtx, @Dest[Low(Dest)], OutLen, @Source[Low(Source)], Length(Source));
if Result then
Source := Copy(Dest, Low(Dest), OutLen);
end;
end;
f_EVP_CIPHER_CTX_cleanup(CipherCtx);
finally
f_EVP_CIPHER_CTX_free(CipherCtx);
end;
end;

function AES128Encrypt(var Source: TBytes; const Key: TKey128;
const InitializationVector: TIV128): boolean;
begin
Result := AES128EncryptDecrypt(Source, Key, InitializationVector, True);
end;

function AES128Decrypt(var Source: TBytes; const Key: TKey128;
const InitializationVector: TIV128): boolean;
begin
Result := AES128EncryptDecrypt(Source, Key, InitializationVector, False);
end;

const
DefaultInitializationVector: TIV128 = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var
B: TBytes;
KeyBytes: TBytes;
KeyPass: TKey128;
begin
// padding text with zeroes up to 16 bytes
B := TEncoding.UTF8.GetBytes('123'#0#0#0#0#0#0#0#0#0#0#0#0#0);

// encrypting
KeyBytes := TEncoding.UTF8.GetBytes('test');
Move(KeyBytes[0], KeyPass[0], Length(KeyBytes));
AES128Encrypt(B, KeyPass, DefaultInitializationVector);
Writeln(TNetEncoding.Base64.EncodeBytesToString(B));

// decrypting
AES128Decrypt(B, KeyPass, DefaultInitializationVector);
Writeln(TEncoding.UTF8.GetString(B));
end.

Также функция f_EVP_aes_128_ecb в настоящее время не включена в OverbyteIcsLibeay, поэтому вам нужно добавить эту строку в раздел интерфейса

f_EVP_aes_128_ecb         : function: PEVP_CIPHER; cdecl = nil;

и эти строки в процедуре LoadLibeay

f_EVP_aes_128_ecb := GetProcAddress(GLIBEAY_DLL_Handle, 'EVP_aes_128_ecb');
if not Assigned(f_EVP_aes_128_ecb) then
raise Exception.Create(Msg + 'EVP_aes_128_ecb');
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]