function LoadPrivateKey(filename:string ): PEVP_PKEY;
var bp : PBIO;
a, pkey : PEVP_PKEY;
begin
a := nil;
bp := BIO_new(BIO_s_file()) ;
BIO_read_filename(bp, PChar(filename));
pkey := PEM_read_bio_PrivateKey(bp, a, nil, nil);
BIO_free(bp);
Result := pkey;
end;
function LoadpublicKey(filename : string) : PEVP_PKEY;
var bp : PBIO;
a,pkey : PEVP_PKEY;
begin
a := nil;
bp := BIO_new(BIO_s_file());
BIO_read_filename(bp, PChar(filename));
pkey := PEM_read_bio_PUBKEY(bp, a, nil, nil);
BIO_free(bp);
Result:= pkey;
end;
function Sign(filename, msg : String):string;
var ctx : EVP_MD_CTX;
buf_in : Pchar;
m_len,outl: cardinal;
pKey : PEVP_PKEY;
m,buf_out : array [0..1024] of char;
p : array [0..255] of char;
i : Integer;
begin
buf_out := '';
if filename = '' then
begin
Result := '';
Exit;
end;
pKey := LoadPrivateKey(filename);
if pKey <> nil then
begin
buf_in := PChar(msg);
EVP_MD_CTX_init(@ctx);
EVP_DigestInit(@ctx, EVP_sha1());
EVP_DigestUpdate(@ctx, buf_in, Length(buf_in));
{此过程也可以用
EVP_SignInit(@ctx,EVP_sha1());
EVP_SignUpdate(@ctx,buf_in,Length(buf_in));
}
EVP_DigestFinal(@ctx, m, m_len);
RSA_sign(EVP_sha1()._type, m, m_len, buf_out, @outl, pkey.pkey.rsa);
EVP_MD_CTX_cleanup(@ctx);
Result := EncodeString(StrPas(buf_out)) ;
end
else
begin
showmessage('读取私钥失败!');
end;
end;
function Sign2(filename, msg : String):string;
var ctx : EVP_MD_CTX;
buf_in : Pchar;
m_len,outl: cardinal;
pKey : PEVP_PKEY;
m,buf_out : array [0..1024] of char;
p : array [0..255] of char;
i : Integer;
begin
buf_out := '';
if filename = '' then
begin
Result := '';
Exit;
end;
pKey := LoadPrivateKey(filename);
if pKey <> nil then
begin
buf_in := PChar(msg);
EVP_MD_CTX_init(@ctx);
EVP_SignInit(@ctx, EVP_sha256());
EVP_SignUpdate(@ctx, buf_in, Length(buf_in));
{此过程也可以用
EVP_SignInit(@ctx,EVP_sha1());
EVP_SignUpdate(@ctx,buf_in,Length(buf_in));
}
EVP_DigestFinal(@ctx, m, m_len);
RSA_sign(EVP_sha256()._type, m, m_len, buf_out, @outl, pkey.pkey.rsa);
EVP_MD_CTX_cleanup(@ctx);
Result := EncodeString(StrPas(buf_out)) ;
end
else
begin
showmessage('读取私钥失败!');
end;
end;
function Verify(filename, msg : string; sign : pansichar) : string;
var ctx : EVP_MD_CTX;
buf_in : Pchar;
m_len,outl : cardinal;
pbub : pX509;
m,buf_out : array[0..1024] of char;
p : array [0..255] of char;
i : Integer;
pKey : pEVP_PKEY;
begin
buf_out := '';
OpenSSL_add_all_digests(); //使EVP_Digest系列函数支付所有有效的信息摘要算法
pKey := LoadpublicKey(filename);
if pKey <> nil then
begin
buf_in := PChar(msg);
EVP_MD_CTX_init(@ctx); //这个与libeay32.dll版本有关
EVP_DigestInit(@ctx, EVP_sha1());
EVP_DigestUpdate(@ctx, buf_in, Length(buf_in));
{此过程也可以用
EVP_VerifyInit(@ctx, EVP_sha1());
EVP_VerifyUpdate(@ctx, buf_in, Length(buf_in));
}
EVP_DigestFinal(@ctx, m, m_len);
i := RSA_verify(EVP_sha1()._type, m, m_len, sign, pointer(Length(sign)), pKey.pkey.rsa);
EVP_MD_CTX_Cleanup(@ctx); //这个与libeay32.dll版本有关
result := IntToStr(i);
end
else
showmessage('读取公钥失败!');
end;
procedure TFrm_Main.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
edit1.Text := ExpandFileName(OpenDialog1.FileName);
end;
procedure TFrm_Main.Button4Click(Sender: TObject);
begin
if OpenDialog1.Execute then
edit2.Text := ExpandFileName(OpenDialog1.FileName);
end;
procedure TFrm_Main.Button2Click(Sender: TObject);
var vstr : string;
begin
Memo2.Clear;
vstr := 'app_id=2014072300007148&biz_content={"out_trade_no": "201503022001","scene":"bar_code","auth_code": "283863507735868877",'+
'"total_amount":"88.88","discountable_amount":"8.88","undiscountable_amount ": "80","subject": "条码支付",'+
'"goods_detail": [{"goods_id": "apple-01","goods_name": "ipad","goods_category":"7788230","price": "88.88","quantity": "1"}],'+
'"operator_id": "op001","store_id":"pudong001","terminal_id": "t_001","time_expire": "2015-01-24 03:07:50"}'+
'&charset=utf8&method=alipay.trade.pay&sign_type=RSA×tamp=2014-07-24 03:07:50';
vstr := AnsiToUTF8(vstr);
Memo2.Lines.Append(Sign(Edit1.Text, vstr));
end;
procedure TFrm_Main.Button3Click(Sender: TObject);
var vstr, sign : string;
begin
Memo1.Clear;
vstr := 'app_id=2014072300007148&biz_content={"out_trade_no": "201503022001","scene":"bar_code","auth_code": "283863507735868877",'+
'"total_amount":"88.88","discountable_amount":"8.88","undiscountable_amount ": "80","subject": "条码支付",'+
'"goods_detail": [{"goods_id": "apple-01","goods_name": "ipad","goods_category":"7788230","price": "88.88","quantity": "1"}],'+
'"operator_id": "op001","store_id":"pudong001","terminal_id": "t_001","time_expire": "2015-01-24 03:07:50"}'+
'&charset=utf8&method=alipay.trade.pay&sign_type=RSA×tamp=2014-07-24 03:07:50';
vstr := AnsiToUTF8(vstr);
sign := Memo2.Text;
Memo1.Lines.Append(Verify(Edit2.Text, vstr, PAnsiChar(DecodeString(sign))));
end;