PHP使用非对称加密算法RSA


Posted in PHP onApril 21, 2021

加密的类型

在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明文加密成复杂的密文。目前主流加密手段大致可分为单向加密和双向加密。

单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原。算法代表:Base64,MD5,SHA;

双向加密:与单向加密相反,可以把密文逆推还原成明文,双向加密又分为对称加密和非对称加密。

对称加密:指数据使用者必须拥有相同的密钥才可以进行加密解密,就像彼此约定的一串暗号。算法代表:DES,3DES,AES,IDEA,RC4,RC5;

非对称加密:相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。算法代表:RSA,DSA。

以前一直对客户端传给服务器的信息加密这一块一脸懵,如果app里面的用户登录信息被抓包拿到了,大写着 username:root,password:123456,  那不是很尴尬。

偶然做版权输入的时候遇到了rsa,在支付宝支付的时候也接触过,当时不知道这是啥子,现在才知道。

他能保证,客户端给出的信息,只有拥有私钥的服务器才能看,其他人看的都是乱码。

非对称加密算法

需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

注意以上的一个点,公钥加密的数据,只有对应的私钥才能解密

在日常使用中是酱紫的:将私钥private_key.pem用在服务器端,公钥发放给android跟ios等前端

客户端用公钥加密过后,数据只能被拥有唯一私钥的服务器看懂。

具体实现

1、加密解密的第一步

生成公钥、私钥对,私钥加密的内容能通过公钥解密(反过来亦可以)

下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令:

openssl genrsa -out rsa_private_key.pem 1024

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem

第二条命令将原始 RSA私钥转换为 pkcs8格式

第三条生成RSA公钥 rsa_public_key.pem

上面几个就可以看出:通过私钥能生成对应的公钥

也有一些网站提供生成rsa公钥私钥的服务:http://www.bm8.com.cn/webtool/rsa/

2、PHP的加密解密类库

<?php
 
 
class Rsa {
 
    /**     
     * 获取私钥     
     * @return bool|resource     
     */    
    private static function getPrivateKey() 
    {        
        $abs_path = dirname(__FILE__) . '/rsa_private_key.pem';
        $content = file_get_contents($abs_path);    
        return openssl_pkey_get_private($content);    
    }    
 
    /**     
     * 获取公钥     
     * @return bool|resource     
     */    
    private static function getPublicKey()
    {   
        $abs_path = dirname(__FILE__) . '/rsa_public_key.pem';
        $content = file_get_contents($abs_path);    
        return openssl_pkey_get_public($content);     
    }
 
    /**     
     * 私钥加密     
     * @param string $data     
     * @return null|string     
     */    
    public static function privEncrypt($data = '')    
    {        
        if (!is_string($data)) {            
            return null;       
        }        
        return openssl_private_encrypt($data,$encrypted,self::getPrivateKey()) ? base64_encode($encrypted) : null;    
    }    
 
    /**     
     * 公钥加密     
     * @param string $data     
     * @return null|string     
     */    
    public static function publicEncrypt($data = '')   
    {        
        if (!is_string($data)) {            
            return null;        
        }        
        return openssl_public_encrypt($data,$encrypted,self::getPublicKey()) ? base64_encode($encrypted) : null;    
    }    
 
    /**     
     * 私钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public static function privDecrypt($encrypted = '')    
    {        
        if (!is_string($encrypted)) {            
            return null;        
        }        
        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, self::getPrivateKey())) ? $decrypted : null;    
    }    
 
    /**     
     * 公钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public static function publicDecrypt($encrypted = '')    
    {        
        if (!is_string($encrypted)) {            
            return null;        
        }        
    return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, self::getPublicKey())) ? $decrypted : null;    
    }
}

调用demo

<?php
require_once "Rsa.php";
$rsa = new Rsa();
$data['name'] = 'Tom';
$data['age']  = '20';
$privEncrypt = $rsa->privEncrypt(json_encode($data));
echo '私钥加密后:'.$privEncrypt.'<br>';
 
$publicDecrypt = $rsa->publicDecrypt($privEncrypt);
echo '公钥解密后:'.$publicDecrypt.'<br>';
 
$publicEncrypt = $rsa->publicEncrypt(json_encode($data));
echo '公钥加密后:'.$publicEncrypt.'<br>';
 
$privDecrypt = $rsa->privDecrypt($publicEncrypt);
echo '私钥解密后:'.$privDecrypt.'<br>';

代码截图实例:

PHP使用非对称加密算法RSA

以上就是PHP使用非对称加密算法RSA的详细内容,更多关于PHP使用RSA的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP编码规范-php coding standard
Mar 16 PHP
PHP 数字左侧自动补0
Mar 31 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
PHP 文件上传全攻略
Apr 28 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
Mar 03 PHP
PHP Filter过滤器全面解析
Aug 09 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 PHP
laravel ajax curd 搜索登录判断功能的实现
thinkphp 获取控制器及控制器方法
Apr 16 #PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
PHP实现考试倒计时功能代码
Apr 16 #PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
PHP 对接美团大众点评团购券(门票)的开发步骤
PHP 技巧 * SVG 保存为图片(分享图生成)
Apr 02 #PHP
You might like
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
ext jquery 简单比较
2010/04/07 Javascript
confirm的用法示例用于按钮操作时确定是否执行
2014/06/19 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
Python中的random()方法的使用介绍
2015/05/15 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
itchat接口使用示例
2017/10/23 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python修改文件内容的3种方法详解
2019/11/15 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
linux比较文件内容的命令是什么
2015/09/23 面试题
酒店保安员岗位职责
2014/01/31 职场文书
企业党员个人自我评价
2014/09/20 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python