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. WPF入门(三)->几何图形之矩形(RectangleGeometry)

    原文:WPF入门(三)->几何图形之矩形(RectangleGeometry) 我们可以使用RectangleGeometry来绘制一个矩形或者正方形 RectangleGeometry 类:描 ...

  2. 复杂json解析(json里面嵌套json)

    调用第三方接口,返回一堆json,我只想取得里面的某一个属性,但是返回的比较复杂,无法直接拿到属性,格式类似于这样: {"video":{"id":" ...

  3. boost-1.53源代码编译

    1.下载源代码.首先得明确,boost大多数库都仅仅有头文件.链接时不需Lib文件:下面库须要单独编译成库: Boost.Filesystem Boost.GraphParallel Boost.IO ...

  4. Cordova app 检查更新 ----JS进行调用(二)

    原文:Cordova app 检查更新 ----JS进行调用(二) 1.获取版本号 需要添加 插件 cordova plugin add https://github.com/whiteoctober ...

  5. IWXAPI的使用,发布分享和支付

    今天看代码,看到以前项目的微信支付功能,想做一下记录 首先是在application类里面定义 public static IWXAPI MSGAPI; public static final Str ...

  6. Java背景

    Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言 2009年Oracle甲骨文公司收购Sun公司

  7. Android 平台下Cordova 调用Activity插件开发

    首先建立一个包名为package com.JiajiaCy.CallActivity; package com.JajaCy.CallActivity; import org.apache.cordo ...

  8. webpack打包不引入vue、echarts等公共库

    如果我们打包的时候不想将vue.echarts等公共库包含在内,需要配置两处地方, 以下以基于vue-cli生成的项目为基准: 1webpack配置: // webpack.base.conf.js ...

  9. Android--数据持久化存储概述

    Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentP ...

  10. Boost智能指针-基础知识

    简单介绍 内存管理一直是 C++ 一个比較繁琐的问题,而智能指针却能够非常好的解决问题,在初始化时就已经预定了删除.排解了后顾之忧.1998年修订的第一版C++标准仅仅提供了一种智能指针:std::a ...