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, 关键代码如下

  1. function LoadPrivateKey(filename:string ): PEVP_PKEY;
  2. var
  3. bp : PBIO  ;
  4. A,pkey :PEVP_PKEY ;
  5. begin
  6. a:=nil;
  7. bp := BIO_new(BIO_s_file()) ;
  8. BIO_read_filename(bp, PChar(filename));
  9. pkey := PEM_read_bio_PrivateKey(bp, a, nil,NIL);
  10. BIO_free(bp);
  11. Result:= pkey;
  12. end;
  13. function Sign(filename,msg : String):string;
  14. var
  15. ctx : EVP_MD_CTX   ;
  16. buf_in:Pchar;
  17. m_len,outl :cardinal;
  18. pKey : PEVP_PKEY;
  19. m,buf_out:array   [0..1024]   of   char;
  20. p:array   [0..255]   of   char;
  21. i:Integer;
  22. begin
  23. buf_out:='';
  24. if filename='' then
  25. begin
  26. Result:='';
  27. Exit;
  28. end;
  29. pKey := LoadPrivateKey(filename);
  30. buf_in := PChar(msg);
  31. EVP_MD_CTX_init(@ctx);            //初始化
  32. EVP_SignInit(@ctx,EVP_sha1());    //将需要使用的摘要算法存入ctxl中
  33. EVP_SignUpdate(@ctx,buf_in,Length(buf_in));//存入编码值
  34. EVP_DigestFinal(@ctx,m,m_len);    //求取编码的长度为m_len摘要值存入m中
  35. rSA_sign(EVP_sha1()._type,m,m_len,buf_out,@outl,pkey.pkey.rsa); //64为SHA1的NID
  36. EVP_MD_CTX_cleanup(@ctx);
  37. Result:=EncodeString(StrPas(buf_out)) ;
  38. end;

如果有疑问,可以找我:13498714

http://blog.csdn.net/wingleo/article/details/52067838

http://blog.csdn.net/wingleo/article/details/52703541

支付宝RSA签名之Delphi实现的更多相关文章

  1. 支付宝RSA签名

    1.参考网上相关文章,开放php中的openssl,但使用网上例子调用openssl_pkey_new,一直报100013错误.后改用用支付宝提供的SDKdemo程序 发现使用提供的privkye,可 ...

  2. 开发支付宝支付用DELPHI实现 RSA签名

    近来根据业务需求 在ERP中集成了微信支付,支付宝支付,开发支付宝支付时最大的障碍就是RSA签名,找了很多资料,最终用 下了个libeay32.pas  根据网上资料最终解决了问题 function  ...

  3. PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  4. PHP实现RSA签名生成订单功能【支付宝示例】

    //组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的1 ...

  5. Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】

    作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...

  6. ThinkPHP3.2 整合支付宝RSA加密方式

    RSA核心加密验证算法 <?php /** * RSA签名 * @param $data 待签名数据 * @param $private_key 商户私钥字符串 * return 签名结果 */ ...

  7. RSA签名验签学习笔记

    RSA私钥签名时要基于某个HASH算法,比如MD5或者SHA1等.之前我一直认为签名的过程是:先对明文做HASH计算,然后用私钥直接对HASH值加密.最近才发现不是那么简单,需要对HASH后的数据进行 ...

  8. RSA签名验签

    import android.util.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import ...

  9. thinkphp整合系列之支付宝RSA加密方式

    thinkphp整合系列之支付宝RSA加密方式上篇博客写的是MD5加密方式:thinkphp整合系列之支付宝MD5加密方式扫码支付http://baijunyao.com/article/75 但是呢 ...

随机推荐

  1. java命名规则(转)

    1. JAVA源文件的命名 JAVA源文件名必须和源文件中所定义的类的类名相同. 2. Package的命名 Package名的第一部分应是小写ASCII字符,并且是顶级域名之一,通常是com.edu ...

  2. 开源项目学习之------AG-Admin环境搭建

    原文地址: https://blog.csdn.net/u011781521/article/details/79056974 一.框架简介 AG-Admin是基于Spring Cloud微服务化开发 ...

  3. Servlet接口的实现类,路径配置映射,ServletConfig对象,ServletContext对象及web工程中文件的读取

    一,Servlet接口实现类:sun公司为Servlet接口定义了两个默认的实现类,分别为:GenericServlet和HttpServlet. HttpServlet:指能够处理HTTP请求的se ...

  4. Hibernate——(5)持久化对象和一级缓存机制

    一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...

  5. Python 格式化输出 —— 小数转化为百分数

    比如将 0.1234 转化为 12.34% 的形式: rate = .1234 print('%.2f%%' % (rate * 100)) 第一个百分号和 .2f 相连,表示浮点数类型保留小数点后两 ...

  6. 面试问题:Vista与XP的Session 0与Session X的区别

    面试问题:Vista与XP的Session 0与Session X的区别 在XXXXX的一次面试中,笔试问题的题目曾提到Session 0.Session 1在Vista和Xp中的区别?现在把答案发上 ...

  7. BCGControlBar介绍

    第一次翻译有诸多不正确的地方,还忘各位指正,谢谢! 英文原文:http://www.bcgsoft.com/bcgcontrolbarpro.htm BCGControlBar是MFC的一个扩展库其英 ...

  8. Erlang实现进程池

    开发工作中,经常会碰到进程池或者线程池,或者其它的资源池.在这里,用erlang实现一个简单的进程池. erlang进程是非常轻量级的,这个进程池的主要目的是用一种通用的方式去管理和限制系统中运行的资 ...

  9. Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

    在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...

  10. Theano 编程核心

    1. 求偏导.更新以及模型的训练 以 LogisticRegression 为例: 求损失函数关于参数的偏导: import theano.tensor as T g_W = T.gradient(c ...