支付宝RSA签名之Delphi实现
Delphi有个很大的问题就是,厂商的不作为(没有封装标准的Cipher类库),让大家自己造轮子。
今天的轮子就是RSA签名,由于Delphi没有封装Cipher类库,所以只的自己写了。
因为要在Firemokey中实现RSA算法,用于手机端,心里有二个方案:
1. 实现RSA算法
2. 通过Java封装一个实现了RSA的包,通过Delphi来调用
当然结果通过了1实现,参考了网上的资源,实现方式其实就是调用SSL库来实现RSA Sign, 解决的难点在于密钥的格式,及SSL库的Delphi封装(需要引用libeay32.dll, 已经有人封装了libeay32.pas)。我自己是通过Indy的源码来实现了这个方法。
网上比较有指导性的网址:http://blog.csdn.NET/star1010/article/details/47809449, 关键代码如下
- 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 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);
- buf_in := PChar(msg);
- EVP_MD_CTX_init(@ctx); //初始化
- EVP_SignInit(@ctx,EVP_sha1()); //将需要使用的摘要算法存入ctxl中
- EVP_SignUpdate(@ctx,buf_in,Length(buf_in));//存入编码值
- EVP_DigestFinal(@ctx,m,m_len); //求取编码的长度为m_len摘要值存入m中
- rSA_sign(EVP_sha1()._type,m,m_len,buf_out,@outl,pkey.pkey.rsa); //64为SHA1的NID
- EVP_MD_CTX_cleanup(@ctx);
- Result:=EncodeString(StrPas(buf_out)) ;
- end;
如果有疑问,可以找我:13498714
http://blog.csdn.net/wingleo/article/details/52067838
http://blog.csdn.net/wingleo/article/details/52703541
支付宝RSA签名之Delphi实现的更多相关文章
- 支付宝RSA签名
1.参考网上相关文章,开放php中的openssl,但使用网上例子调用openssl_pkey_new,一直报100013错误.后改用用支付宝提供的SDKdemo程序 发现使用提供的privkye,可 ...
- 开发支付宝支付用DELPHI实现 RSA签名
近来根据业务需求 在ERP中集成了微信支付,支付宝支付,开发支付宝支付时最大的障碍就是RSA签名,找了很多资料,最终用 下了个libeay32.pas 根据网上资料最终解决了问题 function ...
- PHP 做 RSA 签名 生成订单(支付宝例子)
/组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...
- PHP实现RSA签名生成订单功能【支付宝示例】
//组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的1 ...
- Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】
作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...
- ThinkPHP3.2 整合支付宝RSA加密方式
RSA核心加密验证算法 <?php /** * RSA签名 * @param $data 待签名数据 * @param $private_key 商户私钥字符串 * return 签名结果 */ ...
- RSA签名验签学习笔记
RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...
- RSA签名验签
import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import ...
- thinkphp整合系列之支付宝RSA加密方式
thinkphp整合系列之支付宝RSA加密方式上篇博客写的是MD5加密方式:thinkphp整合系列之支付宝MD5加密方式扫码支付http://baijunyao.com/article/75 但是呢 ...
随机推荐
- HDU1074 Doing Home Work - 状压dp
传送门 题目大意: 有n(\(\le 15\))个作业,每个作业有个name, deadline(截止日期),cost(做作业花的时间),如果没有按时完成某个作业,惩罚分数为超出的时间,求一个合理的顺 ...
- BZOJ 1260 - 区间dp
Magic Door 题目大意: 给一个字符串,问需要至少覆盖多少次. 题目分析 区间dp: dp[i][j]表示达到i~j这个状态的最少覆盖次数,分两种情况: s[i] == s[j]: 此时内层可 ...
- 空间同构(isomorphic)
1. introduction 对于一个 M22 矩阵空间,其 dimM22=4,基的构成如下: {(1000)(0010)(0100)(0001)} 则:M22≅R4 对于 P3 多项式空间,也即: ...
- mingw-w64线程模型:posix vs win32(posix允许使用c++11的std:: thread,但要带一个winpthreads,可能需要额外dll)
我正在安装 mingw-w64 on Windows,有两个选项: win32线程和posix线程. 我知道win32线程和pthreads之间的区别,但是我不明白这两个选项之间的区别. 我怀疑如果我 ...
- JS高级程序设计拾遗
<JavaScript高级程序设计(第三版)>反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的.记不清的地方记录下来,方便以后巩固. 0. <script& ...
- ASP.NET中进度条的简单应用
<html xmlns="http://www.w3.org/1999/xhtml" id="mainWindow"> <head> & ...
- 权限控制方案之——基于URL拦截
概述: 在系统开发过程中需要考虑的一个重要的问题就是权限问题,权限问题也是安全问题的一个范畴,我们要求在用户登录系统之后,要控制用户可以访问的系统资源,使得用户只可以访问到系统事先分配好的资源:这里的 ...
- POJ 1988 Cube Stacking (种类并查集)
题目地址:POJ 1988 这道题的查找合并的方法都能想的到,就是一点没想到,我一直天真的以为查询的时候,输入后能立即输出,这种话在合并的时候就要所有的结点值都要算出来,可是经过路径压缩之后,没办法所 ...
- Android--在Android应用中愉快地写C/C++代码(转)
1 前言 一直想在android层面写c进程,然后java可以与c进程交互,以前在android源码中想玩就可以直接在init.rc中加上交叉编译好的c进程就可以了,而在ide中,也就是ndk编译后各 ...
- C++于public、protected和private说明(From MSDN)
public(C# 參考): https://msdn.microsoft.com/zh-cn/library/yzh058ae.aspx protected(C# 參考):https://msdn. ...