rsa加密解密

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lr199966/article/details/83017395

本文提供使用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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值