使用PHP实现RSA算法的加密和解密
本文提供使用RSA算法加密解密数据的PHP程序类(签名和验签的实现方式可以查看使用PHP实现RSA算法的签名和验签 这篇文章),封装了格式化公钥和私钥文件的方法,这样无论使用什么格式的公钥或者私钥都可以正常运行,公钥加密后使用私钥解密或者私钥加密后用公钥解密都可以实现。下面是代码:
class RSA{
private $public_key_resource = ''; //公钥资源
private $private_key_resource = ''; //私钥资源
/**
* 构造函数
* @param [string] $public_key [公钥数据字符串]
* @param [string] $private_key [私钥数据字符串]
*/
public function __construct($public_key,$private_key) {
$this->public_key_resource = !empty($public_key) ? openssl_pkey_get_public($this->get_public_key($public_key)) : false;
$this->private_key_resource = !empty($private_key) ? openssl_pkey_get_private($this->get_private_key($private_key)) : false;
}
/**
获取私有key字符串 重新格式化 为保证任何key都可以识别
*/
public function get_private_key($private_key){
$search = [
"-----BEGIN RSA PRIVATE KEY-----",
"-----END RSA PRIVATE KEY-----",
"\n",
"\r",
"\r\n"
];
$private_key=str_replace($search,"",$private_key);
return $search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1];
}
/**
获取公共key字符串 重新格式化 为保证任何key都可以识别
*/
public function get_public_key($public_key){
$search = [
"-----BEGIN PUBLIC KEY-----",
"-----END PUBLIC KEY-----",
"\n",
"\r",
"\r\n"
];
$public_key=str_replace($search,"",$public_key);
return $search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
}
/**
* 生成一对公私钥 成功返回 公私钥数组 失败 返回 false
*/
public function create_key() {
$res = openssl_pkey_new();
if($res == false) return false;
openssl_pkey_export($res, $private_key);
$public_key = openssl_pkey_get_details($res);
return array('public_key'=>$public_key["key"],'private_key'=>$private_key);
}
/**
* 用私钥加密
*/
public function private_encrypt($input) {
openssl_private_encrypt($input,$output,$this->private_key_resource);
return base64_encode($output);
}
/**
* 解密 私钥加密后的密文
*/
public function public_decrypt($input) {
openssl_public_decrypt(base64_decode($input),$output,$this->public_key_resource);
return $output;
}
/**
* 用公钥加密
*/
public function public_encrypt($input) {
openssl_public_encrypt($input,$output,$this->public_key_resource,OPENSSL_PKCS1_OAEP_PADDING);
return base64_encode($output);
}
/**
* 解密 公钥加密后的密文
*/
public function private_decrypt($input) {
openssl_private_decrypt(base64_decode($input),$output,$this->private_key_resource,OPENSSL_PKCS1_OAEP_PADDING);
return $output;
}
}
$rsa = new RSA(file_get_contents('public.txt'),file_get_contents('private.txt'));
//
$str = '这里是待加密的数据';
echo '<hr>公钥加密私钥解密如下:<hr>';
echo '原始数据:',$str,'<br>';
$tmpstr = $rsa->public_encrypt($str); //用公钥加密
echo '加密后的数据:' . $tmpstr,'</br>';
$tmpstr = $rsa->private_decrypt($tmpstr); //用私钥解密
echo '解密结果:' . $tmpstr,'<hr>私钥加密公钥解密如下:<hr>';
////=============================================================
echo '原始数据:',$str,'<br>';
$tmpstr = $rsa->private_encrypt($str); //用私钥加密
echo '加密后的数据' . $tmpstr,'</br>';
$tmpstr = $rsa->public_decrypt($tmpstr); //用公密解密
echo '解密结果:' . $tmpstr,'</br>';
提醒:在对接某些接口的时候一定要注意加密解密的填充模式,在上述代码中私钥加密公钥解密的代码使用了默认的填充模式,如果需要更改填充模式只需要增加一个可选参数就可以。为了通用在公钥加密私钥解密的代码中使用了非默认的OPENSSL_PKCS1_OAEP_PADDING填充模式,这在微信接口中可以正常使用,否则会出现如下错误:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
<err_code>SYSTEMERROR</err_code>
<err_code_des>解密真实姓名或银行卡号出错</err_code_des>
<result_code>FAIL</result_code>
<return_code>SUCCESS</return_code>
<return_msg>参数错误,请检查参数</return_msg>
<mch_id>1444739402</mch_id>
</xml>
使用PHP实现RSA算法的加密和解密的更多相关文章
- RSA算法 JS加密 JAVA解密
有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...
- <密码学入门>关于RSA算法的加密解密及代码实现
RSA算法 是一种公钥加密算法,RSA算法相比别的算法思路非常清晰,但是想要破解的难度非常大.RSA算法基于一个非常简单的数论事实:两个素数相乘得到一个大数很容易,但是由一个大数分解为两个素数相乘却非 ...
- C#使用RSA证书文件加密和解密示例
修改MSDN上的示例,使之可以通过RSA证书文件加密和解密,中间遇到一个小问题. Q:执行ExportParameters()方法时,回报CryptographicException:该项不适于在指定 ...
- 【转】Java Cipher类 DES算法(加密与解密)
Java Cipher类 DES算法(加密与解密) 1.加密解密类 import java.security.*; import javax.crypto.*; import java.io.*; / ...
- RSA加密算法的加密与解密
转发原文链接:RSA加密算法加密与解密过程解析 1.加密算法概述 加密算法根据内容是否可以还原分为可逆加密和非可逆加密. 可逆加密根据其加密解密是否使用的同一个密钥而可以分为对称加密和非对称加密. 所 ...
- C#使用RSA证书文件加密和解密
public class EncrypHelp { static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKey ...
- Angular+Ionic+RSA实现后端加密前端解密功能
因业务需要,需要给android应用安装证书,通过读取证书文件内容实现某些功能的控制: 流程:后台通过publicKey对指定内容的文件进行加密,生成文件共客户下载,客户下载后选择该证书文件读取到应用 ...
- RSA生成、加密、解密、签名。
首先,要会生成RSA密码对. https://app.alipay.com/market/document.htm?name=saomazhifu#page-23 (事例中的密钥对好像有问题,最 ...
- JS到PHP使用RSA算法进行加密通讯
我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到. 在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑 ...
随机推荐
- Python3面向对象—点和矩形类
Python类练习 定义一个类 class Point: '''二维坐标系中代表一个点''' pass print('打印Point:{}'.format(Point)) p1 = Point() p ...
- 基于jQuery实现点击列表加载更多效果
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> < ...
- [P3676]小清新数据结构题
Description: 给你一棵树,每次询问以一个点为根时所有子树点权和的平方和 带修改 Hint: \(n\le 2*10^5\) Solution: 这题只要推出式子就很简单了 如果不换根这个平 ...
- Ubuntu 配置安装PCL
Ubuntu 配置安装PCL 之前一直在Mac下开发,现在入手Ubuntu,也借此学习一下Linux下的源码编译安装过程. PCL简介 PCL(Point Cloud Library)是在吸收了前人点 ...
- 对迭代器操作的python 模块
import itertools import more_itertools 目前用到的more_itertools.ilen(range(10)) --->返回可迭代的数量.这回消耗迭代,小心 ...
- IP欺骗
通过一番测试,我发现当我连续提交3份问卷,再换一个IP提交3个问卷,也就是连续提交了6份问卷,并没有触发网站的反爬虫机制.所以我们可以猜测对方基于IP提交问卷的频率来识别爬虫程序的.看到这里,大家可能 ...
- ProjectEuler && Rosecode && Mathmash做题记录
退役选手打发时间的PE计划 挂在这里主要是dalao们看到有什么想交流的东西可以私聊哦(站内信或邮箱吧) 2017/8/11 PE595 :第一题QAQ 2017/8/12 PE598 2017/ ...
- CSS3_标准盒子模型和怪异盒子模型
#box{ width: 200px; height: 200px; background-color: pink; } 标准盒子模型 box-sizing: content-box; padding ...
- window iis重启
WINDOWS server 任务计划实现定时自动重启IIS编写批处理文件IIS.bat@echo offnet stop iisadmin /yesnet start iisadminnet sta ...
- Android 进程间的通信
localsocket: https://blog.csdn.net/azhengye/article/details/73863404 https://www.cnblogs.com/basta ...