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的String类代码
Apr 20 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
如何使用php输出时间格式
Aug 31 PHP
php实现快速排序的三种方法分享
Mar 12 PHP
PHP中单引号与双引号的区别分析
Aug 19 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
PHP实现的简单缓存类
Jul 29 PHP
php微信开发之关注事件
Jun 14 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 07 PHP
php数值计算num类简单操作示例
May 15 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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文本转图片自动换行的方法
2013/03/13 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
关于JavaScript中事件绑定的方法总结
2016/10/26 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
vue data变量相互赋值后被实时同步的解决步骤
2020/08/05 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
Python中threading模块join函数用法实例分析
2015/06/04 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
Python爬虫定时计划任务的几种常见方法(推荐)
2021/01/15 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
计算机专业个人简短的自我评价
2013/10/23 职场文书
2014年会演讲稿范文
2014/01/06 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
2016教师六五普法学习心得体会
2016/01/21 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle