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. 【a703】求逆序对

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 给定一个序列a1,a2...an.如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序 ...

  2. QEMU使用virtio磁盘

    环境 宿主环境:windows 10 pro QEMU版本:3.1 客户机:windows2003 virtio是一种半虚拟化技术,window2003安装盘不带驱动程序,所以首先采用IDE方式安装w ...

  3. matlab 高阶(三)—— 插值(fft、)

    1. FFT 插值 y = interpft(x,n) y = [0, .5, 1., 1.5, 2., 1.5, 1., .5, 0, -.5, -1, -1.5, -2., -1.5, -1., ...

  4. ubuntu grub 操作

    系统开机时,按住 shift 进入 grub 1. 什么是 Grub GNU GRUB(GRand Unified Bootloader 简称"GRUB")是一个来自GNU项目的多 ...

  5. 广义逆高斯分布(Generalized Inverse Gaussian Distribution)及修正贝塞尔函数

    1. PDF generalized inverse Gaussian distribution (GIG) 是一个三参数的连续型概率分布: f(x)=(a/b)p/22Kp(ab−−√)xp−1e− ...

  6. WPF依赖属性(续)(3)依赖属性存储

    原文:WPF依赖属性(续)(3)依赖属性存储          在之前的两篇,很多朋友参与了讨论,也说明各位对WPF/SL计数的热情,对DP系统各抒已见,当然也出现了一些分歧. 以下简称DP为依赖属性 ...

  7. UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)

    Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...

  8. 【Java】使用记事本运行第一个Java程序

    要编写java程序,java sdk必不可少,mac OS系统自带sdk,如果觉得版本太低,可以去官网下载最新的. 打开终端,新建一个HelloWorld.java文件: vim HelloWorld ...

  9. react项目实践——(1)使用webpack创建项目

    1. 新建文件夹,命名为项目名称——myapp,并打开myapp文件夹. mkdir webpack-demo && cd webpack-demo 2. 在./myapp中打开命令行 ...

  10. Angular路由守卫 canActivate

    作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...