Delphi支付宝RSA签名验签

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&timestamp=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&timestamp=2014-07-24 03:07:50';
  vstr := AnsiToUTF8(vstr);
  sign := Memo2.Text;
  Memo1.Lines.Append(Verify(Edit2.Text, vstr, PAnsiChar(DecodeString(sign))));
end;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值