OpenSSLで暗号化、復号化 ~Delphiソースコード集
(OpenSSLを使用せずにAES暗号化復号化したい場合は
DelphiでAES暗号化AES復号化ができるユニット(クラス)
を参照)
OpenSSLを使って、
AES-256-ECB(鍵長32バイト、ブロック長16バイト)暗号化と復号化、
AES-256-CBC(鍵長32バイト、ブロック長16バイト、初期ベクトル16バイト)暗号化と復号化を行います。
(1)libeay32.dll、ssleay32.dllファイルの入手
https://indy.fulgan.com/SSL/等からOpenSSLファイルをダウンロードし、解凍してlibeay32.dll、ssleay32.dllファイル を、パスの通った場所(c:\windows等)又は今から作成するプログラムと同じ位置に配置します。
(2)MamOpenSSL.pasファイルのダウンロード
MamOpenSSL.pasファイルをダウンロードします。(3)ソースコードの記述
uses MamOpenSSl;
procedure TForm1.Button1Click(Sender: TObject);
var KeyS,IvS:AnsiString;
Key,iv:TBytes;
DecDataS:String;
DecData:TBytes;
res:boolean;
EncDataBase64:string;
begin
//鍵の準備
KeyS:='12345678901234567890123456789012';
Key:=TEncoding.ASCII.GetBytes(KeyS);
//初期ベクトルIVの準備
ivS :='1234567890123456';
iv:=TEncoding.ASCII.GetBytes(ivS);
//暗号化するデータの準備
DecDataS:='暗号化したい文字列';
//暗号化する文字列を文字コードUTF8としてバイト型配列に代入
DecData:=TEncoding.UTF8.GetBytes(DecDataS);
//AES256ECBで暗号化(BASE64エンコード)する
res:=MamEncAes256Ecb(DecData,key,EncDataBase64);
if res then
begin
memo1.Lines.Add(EncDataBase64);
end;
//AES256ECBで復号化する
res:=MamDecAes256Ecb(DecData,key,EncDataBase64);
if res then
begin
DecDataS:=TEncoding.UTF8.GetString(DecData);
memo1.Lines.Add(DecDataS);
end;
//AES256CBCで暗号化(BASE64エンコード)する
res:=MamEncAes256Cbc(DecData,key,iv,EncDataBase64);
if res then
begin
memo1.Lines.Add(EncDataBase64);
end;
//AES256CBCで復号化する
res:=MamDecAes256Cbc(DecData,key,iv,EncDataBase64);
if res then
begin
DecDataS:=TEncoding.UTF8.GetString(DecData);
memo1.Lines.Add(DecDataS);
end;
end;
(4)実行結果
暗号化したBASE64文字列:rv89qBijJzMOez3uiSswKYo8Xps+1nsjzweLVDlrKn0=
復号化した文字列 :暗号化したい文字列
AES-256-CBC
暗号化したBASE64文字列:aA6ctZehh3WAe1RcMn4oACec3IPf+AMdJGvrh5otVyk=
復号化した文字列 :暗号化したい文字列
(5)PHPでの実行結果と同じか確認する
<?php //UTF-8ファイル $data="暗号化したい文字列"; $key="12345678901234567890123456789012"; $iv ="1234567890123456"; $enc=openssl_encrypt($data, 'AES-256-ECB', $key, 0, null);//暗号化 echo $enc."<br>\n"; $dec=openssl_decrypt($enc, 'AES-256-ECB', $key, 0, null);//複合化 echo $dec."<br>\n"; $enc=openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);//暗号化 echo $enc."<br>\n"; $dec=openssl_decrypt($enc, 'AES-256-CBC', $key, 0, $iv);//複合化 echo $dec."<br>\n"; ?>rv89qBijJzMOez3uiSswKYo8Xps+1nsjzweLVDlrKn0=
暗号化したい文字列
aA6ctZehh3WAe1RcMn4oACec3IPf+AMdJGvrh5otVyk=
暗号化したい文字列
(6)参考:MamOpenSSL.pasファイルのソース
{ ******* OpenSSL ライブラリ Copyright 2018 Mam ******* }
unit MamOpenSSL;
interface
uses System.SysUtils,IdSSLOpenSSLHeaders,system.NetEncoding,WinApi.Windows;
//AES-128-ECB暗号化(暗号化したいデータ,キー(16バイト) out:暗号化データ)
function MamEncAes128Ecb(
DecData,Key:TBytes;out EncData:TBytes):Boolean;overload;
//AES-128-ECB暗号化(暗号化したいデータ,キー(16バイト) out:暗号化データのBASE64)
function MamEncAes128Ecb(
DecData,Key:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-192-ECB暗号化(暗号化したいデータ,キー(24バイト) out:暗号化データ)
function MamEncAes192Ecb(
DecData,Key:TBytes;out EncData:TBytes):Boolean;overload;
//AES-192-ECB暗号化(暗号化したいデータ,キー(24バイト) out:暗号化データのBASE64)
function MamEncAes192Ecb(
DecData,Key:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-256-ECB暗号化(暗号化したいデータ,キー(32バイト) out:暗号化データ)
function MamEncAes256Ecb(
DecData,Key:TBytes;out EncData:TBytes):Boolean;overload;
//AES-256-ECB暗号化(暗号化したいデータ,キー(32バイト) out:暗号化データのBASE64)
function MamEncAes256Ecb(
DecData,Key:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-128-ECB複合化(out:複合化されたデータ,キー(16バイト) ,暗号化データ)
function MamDecAes128Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
//AES-128-ECB複合化(out:複合化されたデータ,キー(16バイト) ,暗号化データのBASE64)
function MamDecAes128Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
//AES-192-ECB複合化(out:複合化されたデータ,キー(24バイト) ,暗号化データ)
function MamDecAes192Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
//AES-192-ECB複合化(out:複合化されたデータ,キー(24バイト) ,暗号化データのBASE64)
function MamDecAes192Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
//AES-256-ECB複合化(out:複合化されたデータ,キー(32バイト) ,暗号化データ)
function MamDecAes256Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
//AES-256-ECB複合化(out:複合化されたデータ,キー(32バイト) ,暗号化データのBASE64)
function MamDecAes256Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
//AES-128-CBC暗号化(暗号化したいデータ,キー(16バイト),初期ベクトル(16バイト) out:暗号化データ)
function MamEncAes128Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
//AES-128-CBC暗号化(暗号化したいデータ,キー(16バイト),初期ベクトル(16バイト) out:暗号化データのBASE64)
function MamEncAes128Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-192-CBC暗号化(暗号化したいデータ,キー(24バイト),初期ベクトル(16バイト) out:暗号化データ)
function MamEncAes192Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
//AES-192-CBC暗号化(暗号化したいデータ,キー(24バイト),初期ベクトル(16バイト) out:暗号化データのBASE64)
function MamEncAes192Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-256-CBC暗号化(暗号化したいデータ,キー(32バイト),初期ベクトル(16バイト) out:暗号化データ)
function MamEncAes256Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
//AES-256-CBC暗号化(暗号化したいデータ,キー(32バイト),初期ベクトル(16バイト) out:暗号化データのBASE64)
function MamEncAes256Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
//AES-128-CBC複合化(out:複合化されたデータ,キー(16バイト),初期ベクトル(16バイト) ,暗号化データ)
function MamDecAes128Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
//AES-128-CBC複合化(out:複合化されたデータ,キー(16バイト),初期ベクトル(16バイト) ,暗号化データのBASE64)
function MamDecAes128Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
//AES-192-CBC複合化(out:複合化されたデータ,キー(24バイト),初期ベクトル(16バイト) ,暗号化データ)
function MamDecAes192Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
//AES-192-CBC複合化(out:複合化されたデータ,キー(24バイト),初期ベクトル(16バイト) ,暗号化データのBASE64)
function MamDecAes192Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
//AES-256-CBC複合化(out:複合化されたデータ,キー(32バイト),初期ベクトル(16バイト) ,暗号化データ)
function MamDecAes256Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
//AES-256-CBC複合化(out:複合化されたデータ,キー(32バイト),初期ベクトル(16バイト) ,暗号化データのBASE64)
function MamDecAes256Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
implementation
function MamEncAes128Ecb(
DecData,Key:TBytes;out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<16 then
begin
l:=length(Key);
SetLength(Key,16);
ZeroMemory(@Key[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_128_ecb,nil,@key[0],nil);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes128Ecb(
DecData,Key:TBytes;out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes128Ecb(DecData,Key,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamEncAes192Ecb(
DecData,Key:TBytes;out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<24 then
begin
l:=length(Key);
SetLength(Key,24);
ZeroMemory(@Key[l],24-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_192_ecb,nil,@key[0],nil);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes192Ecb(
DecData,Key:TBytes;out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes192Ecb(DecData,Key,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamEncAes256Ecb(DecData,Key:TBytes;
out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<32 then
begin
l:=length(Key);
SetLength(Key,32);
ZeroMemory(@Key[l],32-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_256_ecb,nil,@key[0],nil);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes256Ecb(DecData,Key:TBytes;
out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes256Ecb(DecData,Key,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamDecAes128Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<16 then
begin
l:=length(Key);
SetLength(Key,16);
ZeroMemory(@Key[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_128_ecb,nil,@key[0],nil);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes128Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes128Ecb(DecData,Key,EncData);
end;
function MamDecAes192Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<24 then
begin
l:=length(Key);
SetLength(Key,24);
ZeroMemory(@Key[l],24-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_192_ecb,nil,@key[0],nil);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes192Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes192Ecb(DecData,Key,EncData);
end;
function MamDecAes256Ecb(
out DecData:TBytes;Key,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<32 then
begin
l:=length(Key);
SetLength(Key,32);
ZeroMemory(@Key[l],32-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_256_ecb,nil,@key[0],nil);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes256Ecb(
out DecData:TBytes;Key:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes256Ecb(DecData,Key,EncData);
end;
function MamEncAes128Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<16 then
begin
l:=length(Key);
SetLength(Key,16);
ZeroMemory(@Key[l],16-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_128_cbc,nil,@key[0],@Iv[0]);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes128Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes128Cbc(DecData,Key,Iv,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamEncAes192Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<24 then
begin
l:=length(Key);
SetLength(Key,24);
ZeroMemory(@Key[l],24-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_192_cbc,nil,@key[0],@Iv[0]);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes192Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes192Cbc(DecData,Key,Iv,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamEncAes256Cbc(
DecData,Key,Iv:TBytes;out EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Encl,Padl:integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<32 then
begin
l:=length(Key);
SetLength(Key,32);
ZeroMemory(@Key[l],32-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_EncryptInit_ex(ctx,EVP_aes_256_cbc,nil,@key[0],@Iv[0]);
setLength(EncData, (length(DecData) div 16+1)*16);
EVP_EncryptUpdate(ctx,@EncData[0],@Encl,@DecData[0],length(DecData));
EVP_EncryptFinal_ex(ctx,@EncData[Encl],@Padl);
EVP_CIPHER_CTX_free(ctx);
SetLength(EncData,Encl+Padl);
unload;
Result:=true;
end;
function MamEncAes256Cbc(
DecData,Key,Iv:TBytes;out EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
result:=MamEncAes256Cbc(DecData,Key,Iv,EncData);
EncData:=TNetEncoding.Base64.Encode(EncData);
EncDataBase64:=TEncoding.ASCII.GetString(EncData);
end;
function MamDecAes128Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<16 then
begin
l:=length(Key);
SetLength(Key,16);
ZeroMemory(@Key[l],16-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_128_cbc,nil,@key[0],@Iv[0]);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes128Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes128Cbc(DecData,Key,Iv,EncData);
end;
function MamDecAes192Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<24 then
begin
l:=length(Key);
SetLength(Key,24);
ZeroMemory(@Key[l],24-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_192_cbc,nil,@key[0],@Iv[0]);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes192Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes192Cbc(DecData,Key,Iv,EncData);
end;
function MamDecAes256Cbc(
out DecData:TBytes;Key,Iv,EncData:TBytes):Boolean;overload;
var ctx:PEVP_CIPHER_CTX;
Decl,Padl:Integer;
l:integer;
begin
Result:=false;
if not load then exit;
if length(Key)<32 then
begin
l:=length(Key);
SetLength(Key,32);
ZeroMemory(@Key[l],32-l);
end;
if length(Iv)<16 then
begin
l:=length(Iv);
SetLength(Iv,16);
ZeroMemory(@Iv[l],16-l);
end;
ctx:=EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(ctx);
EVP_DecryptInit_ex(ctx,EVP_aes_256_cbc,nil,@key[0],@Iv[0]);
setLength(DecData,length(EncData));
EVP_DecryptUpdate(ctx,@DecData[0],LongWord(pointer(@Decl)),
@EncData[0],Length(EncData));
EVP_DecryptFinal_ex(ctx,@DecData[Decl],LongWord(Pointer(@Padl)));
setlength(DecData,Decl+Padl);
unload;
Result:=True;
end;
function MamDecAes256Cbc(
out DecData:TBytes;Key,Iv:TBytes;EncDataBase64:String):Boolean;overload;
var EncData:TBytes;
begin
EncData:=TEncoding.ASCII.GetBytes(EncDataBase64);
EncData:=TNetEncoding.Base64.Decode(EncData);
Result:=MamDecAes256Cbc(DecData,Key,Iv,EncData);
end;
end.
