本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可以正常运行,公钥加密后使用私钥解密或者私钥加密后用公钥解密都可以实现。下面是代码:

  1. class RSA{
  2. private $public_key_resource = ''; //公钥资源
  3. private $private_key_resource = ''; //私钥资源
  4. /**
  5. * 构造函数
  6. * @param [string] $public_key [公钥数据字符串]
  7. * @param [string] $private_key [私钥数据字符串]
  8. */
  9. public function __construct($public_key,$private_key) {
  10. $this->public_key_resource = !empty($public_key) ? openssl_pkey_get_public($this->get_public_key($public_key)) : false;
  11. $this->private_key_resource = !empty($private_key) ? openssl_pkey_get_private($this->get_private_key($private_key)) : false;
  12. }
  13. /**
  14. 获取私有key字符串 重新格式化 为保证任何key都可以识别
  15. */
  16. public function get_private_key($private_key){
  17. $search = [
  18. "-----BEGIN RSA PRIVATE KEY-----",
  19. "-----END RSA PRIVATE KEY-----",
  20. "\n",
  21. "\r",
  22. "\r\n"
  23. ];
  24. $private_key=str_replace($search,"",$private_key);
  25. return $search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1];
  26. }
  27. /**
  28. 获取公共key字符串 重新格式化 为保证任何key都可以识别
  29. */
  30. public function get_public_key($public_key){
  31. $search = [
  32. "-----BEGIN PUBLIC KEY-----",
  33. "-----END PUBLIC KEY-----",
  34. "\n",
  35. "\r",
  36. "\r\n"
  37. ];
  38. $public_key=str_replace($search,"",$public_key);
  39. return $search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
  40. }
  41. /**
  42. * 生成一对公私钥 成功返回 公私钥数组 失败 返回 false
  43. */
  44. public function create_key() {
  45. $res = openssl_pkey_new();
  46. if($res == false) return false;
  47. openssl_pkey_export($res, $private_key);
  48. $public_key = openssl_pkey_get_details($res);
  49. return array('public_key'=>$public_key["key"],'private_key'=>$private_key);
  50. }
  51. /**
  52. * 用私钥加密
  53. */
  54. public function private_encrypt($input) {
  55. openssl_private_encrypt($input,$output,$this->private_key_resource);
  56. return base64_encode($output);
  57. }
  58. /**
  59. * 解密 私钥加密后的密文
  60. */
  61. public function public_decrypt($input) {
  62. openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource);
  63. return $output;
  64. }
  65. /**
  66. * 用公钥加密
  67. */
  68. public function public_encrypt($input) {
  69. openssl_public_encrypt($input,$output,$this->public_key_resource,OPENSSL_PKCS1_OAEP_PADDING);
  70. return base64_encode($output);
  71. }
  72. /**
  73. * 解密 公钥加密后的密文
  74. */
  75. public function private_decrypt($input) {
  76. openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource,OPENSSL_PKCS1_OAEP_PADDING);
  77. return $output;
  78. }
  79. }
  80. $rsa = new RSA(file_get_contents('public.txt'),file_get_contents('private.txt'));
  81. //
  82. $str = '这里是待加密的数据';
  83. echo '<hr>公钥加密私钥解密如下:<hr>';
  84. echo '原始数据:',$str,'<br>';
  85. $tmpstr = $rsa->public_encrypt($str); //用公钥加密
  86. echo '加密后的数据:' . $tmpstr,'</br>';
  87. $tmpstr = $rsa->private_decrypt($tmpstr); //用私钥解密
  88. echo '解密结果:' . $tmpstr,'<hr>私钥加密公钥解密如下:<hr>';
  89. ////=============================================================
  90. echo '原始数据:',$str,'<br>';
  91. $tmpstr = $rsa->private_encrypt($str); //用私钥加密
  92. echo '加密后的数据' . $tmpstr,'</br>';
  93. $tmpstr = $rsa->public_decrypt($tmpstr); //用公密解密
  94. echo '解密结果:' . $tmpstr,'</br>';

提醒:在对接某些接口的时候一定要注意加密解密的填充模式,在上述代码中私钥加密公钥解密的代码使用了默认的填充模式,如果需要更改填充模式只需要增加一个可选参数就可以。为了通用在公钥加密私钥解密的代码中使用了非默认的OPENSSL_PKCS1_OAEP_PADDING填充模式,这在微信接口中可以正常使用,否则会出现如下错误:

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <xml>
  3. <err_code>SYSTEMERROR</err_code>
  4. <err_code_des>解密真实姓名或银行卡号出错</err_code_des>
  5. <result_code>FAIL</result_code>
  6. <return_code>SUCCESS</return_code>
  7. <return_msg>参数错误,请检查参数</return_msg>
  8. <mch_id>1444739402</mch_id>
  9. </xml>

使用PHP实现RSA算法的加密和解密的更多相关文章

  1. RSA算法 JS加密 JAVA解密

    有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...

  2. <密码学入门>关于RSA算法的加密解密及代码实现

    RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非 ...

  3. C#使用RSA证书文件加密和解密示例

    修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...

  4. 【转】Java Cipher类 DES算法(加密与解密)

    Java Cipher类 DES算法(加密与解密) 1.加密解密类 import java.security.*; import javax.crypto.*; import java.io.*; / ...

  5. RSA加密算法的加密与解密

    转发原文链接:RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所 ...

  6. C#使用RSA证书文件加密和解密

    public class EncrypHelp { static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKey ...

  7. Angular+Ionic+RSA实现后端加密前端解密功能

    因业务需要,需要给android应用安装证书,通过读取证书文件内容实现某些功能的控制: 流程:后台通过publicKey对指定内容的文件进行加密,生成文件共客户下载,客户下载后选择该证书文件读取到应用 ...

  8. RSA生成、加密、解密、签名。

    首先,要会生成RSA密码对. https://app.alipay.com/market/document.htm?name=saomazhifu#page-23    (事例中的密钥对好像有问题,最 ...

  9. JS到PHP使用RSA算法进行加密通讯

    我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到. 在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑 ...

随机推荐

  1. UWB DWM1000 智能跟踪小车 --[蓝点无限]

    蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 UWB 智能跟踪小车:一共三个UWB模块,手持一个,小车上两个. 通过测量小车上两个模块与手持模块之间的距离, ...

  2. Git Sever搭建与相关错误处理

    搭建 安装git: sudo apt-get install git 创建一个git用户,用来运行git服务:(用自己的用户也可以,其实) sudo adduser git 创建证书登录: 收集所有需 ...

  3. 如何在 code blocks中使用 mkl库

    为了安装caffe, 所以安装了mkl, 现在想在codeblock的项目中使用mkl. 设置mkl环境变量: mkl安装好后默认是在/opt/intel/mkl中,其中/opt/intel/mkl/ ...

  4. 作用域和闭包(二)this

    this 要在执行时才确认,定义时无法确认 1. 作为构造函数执行 2. 作为对象属性执行 3.作为普通函数执行 4. call,apply,bind 改变this

  5. c#关键字和常用类型表快查

    类型 字节 取值范围 说明 bool 1 true/false/null 布尔类型 char 2 0x0000~0xffff Unicode 16 位字符 byte 1 0~255 无符号的 8 位整 ...

  6. PropertyEditor、Formatter、Converter的应用

    @ResponseBody @RequestMapping("date.do") public String data(Date date) { return date.toStr ...

  7. CSS3_标准盒子模型和怪异盒子模型

    #box{ width: 200px; height: 200px; background-color: pink; } 标准盒子模型 box-sizing: content-box; padding ...

  8. [LeetCode] Quad Tree Intersection 四叉树相交

    A quadtree is a tree data in which each internal node has exactly four children: topLeft, topRight,  ...

  9. DEV_TreeList使用经验小结

    1. 点击叶子节点是希望Open键显示,点击非叶子节点时希望隐藏.实践中发现点击到了非叶子节点图标,Open没有隐藏,如何解决? 增加一个判断: if (_hitInfo.HitInfoType != ...

  10. html页面转成jsp页面之后样式变化的问题解决方法

    转载:https://blog.csdn.net/zeb_perfect/article/details/51172859