详解PHP使用非对称加密算法RSA

吾爱主题 阅读:140 2021-11-12 16:17:00 评论:0
目录
  • 加密的类型
  • 非对称加密算法
  • 具体实现
    • 1、加密解密的第一步
    • 2、PHP的加密解密类库
  • 调用demo

加密的类型

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

单向加密:通过对数据进行摘要计算生成密文,密文不可逆推还原。算法代表: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的加密解密类库

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 <?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

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?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的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/xiaoweite1/article/details/100680495

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容