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
    评论
中国电信掌上营业厅客户端说明: 中国电信掌上营业厅客户端这种软件没什么好说的,如果你是电信用户,装一个是没错,可以清楚自己的话费定制信息情况,在一个就是有的操作可以不用跑营业厅了。 官方介绍 下载中国电信掌上营业厅,超值优惠等你拿!详情请登录中国电信掌厅客户端,快来下载吧!   简介:   中国电信掌上营业厅客户端是一款面向智能手机用户的自助服务软件。具备自动识别电信用户身份功能,无需输入账号密码即可实现登录;更有贴心、简洁的界面设计让信息一目了然,让操作更方便、更快捷;同时集结了优惠促销、自助查询、充值交费、玩转3G、业务办理、帮助支持等6大最常用的电信服务功能,让您随时随地想"查"就"查"、想"办"就"办"、想"充"就"充"、想"玩"就"玩",享受一键办理的便捷服务! 二、适用范围 本客户端业务目前支持中国电信133/153/189客户以及其他异网用户。 本客户端适用于Android2.1以上、IOS、Brew、BlackBerry OS手机操作系统用户,随着客户端不断优化升级,将会为更多用户提供更多优质服务功能! 三、产品优势 ● 界面简洁生动 采用系统友好的用户界面,操作简单、快捷、方便;ICON图标色彩丰富,形象生动。 ● 功能响应迅速 界面元素存放在本地,采用数据接口同步数据,查询及办理功能响应迅速。 ● 自动登录,方便快捷 CTWAP网络条件下,自动获取UIM卡信息,本机号码自动认证,无需输入密码等繁琐操作,一键登录客户端。 ● 更多信息,更省流量 客户端提供多种查询及办理信息,以文字及小图标方式展现,无需下载大量页面图片,减少用户流量。 ● 数据共享,同步及时 客户端用户及业务数据与网厅系统共享,信息统一,精确同步 四、业务功能 移动客户端向用户提供多种功能,具体有: ● 自助查询 提供费用查询、业务查询、我的信息、积分服务等功能,可进行相关费用和业务信息的查询。 ● 充值交费 提供充值卡充值及支付功能,可进行相关费用及账单的支付。 ● 玩转3G 提供软件、游戏、音乐、阅读、视频、动漫、玩转手机、热门终端下载与查看等功能。可进行相关应用程序的下载及相关内容的浏览。   更新日志:   1.有奖推荐下载 推荐朋友下载客户端,就有机会获得小礼物哦 分享=美德 礼物 2、小区宽带查询 家里的宽带可以提速了?!小区进光纤了?! 随时查一查,早日用光网 3、流量防盗 轻松设置,自动节流 流量,不能白流到天亮 4、流程优化(支付、帮助中心) 只是页面、流程的一点点优化 希望给您带来的方便不只一点点

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值