简体   繁体   English

Delphi / PHP LockBox加密AES ECB

[英]Delphi/PHP LockBox Encryption AES ECB

There are a few variations of this question around but i haven't been able to pin the problem down. 这个问题有一些变体,但我无法确定问题所在。 Trying to encrypt/unencrypt in PHP and Delphi I assume I have missed some setting in Delphi and its to do with UTF-8 尝试在PHP和Delphi中进行加密/解密,我想我已经错过了Delphi中的某些设置以及与UTF-8有关的设置

using http://aesencryption.net/ as a PHP Example the result we are trying to get. 使用http://aesencryption.net/作为PHP示例,我们尝试获得的结果。 Image Blow 图像吹
Password = 123 密码= 123
Key = Test 键=测试
128 bit 128位
Encrypts to uuIikEZSC9Sa1HAt/XKfGQ== 加密为uuIikEZSC9Sa1HAt / XKfGQ ==

I want to be able to unencrypt this in Delphi 我希望能够在Delphi中对此进行解密
I'm using Delphi XE5 我正在使用Delphi XE5
with https://github.com/SeanBDurkin/tplockbox https://github.com/SeanBDurkin/tplockbox
I can get encrypt/DeCrypt working inside Delphi but the PHP encrypted version string is different 我可以在Delphi中使用crypto / DeCrypt,但是PHP加密版本字符串不同

Delphi encrypts 123 to vpdeLlfnxTGrSsa2TpbFvg== Delphi将123加密为vpdeLlfnxTGrSsa2TpbFvg ==

Here is a quick example of the Delphi Encrypt 这是Delphi Encrypt的快速示例

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;

Decrypt 解密

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;

Anyone have any suggestions? 有人有什么建议吗?

在此处输入图片说明

Not sure what is wrong with lockbox, but here is code that matches aesencryption using OpenSSL, OverbyteIcsLibeay unit is from ICS library http://wiki.overbyte.be/wiki/index.php/ICS_Download 不确定密码盒有什么问题,但是这里的代码与使用OpenSSL的aesencryption匹配,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.

Also f_EVP_aes_128_ecb function is currently not included in OverbyteIcsLibeay, so you'll need to add this line to interface section 另外,f_EVP_aes_128_ecb函数当前未包含在OverbyteIcsLibeay中,因此您需要将此行添加到接口部分

f_EVP_aes_128_ecb         : function: PEVP_CIPHER; cdecl = nil;

and these lines to LoadLibeay procedure 和这些行到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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM