如何利用PHP进行RSA加密解密

PHP 电脑笔记网 219浏览 0评论

在开始说今天的如何利用PHP进行RSA加密解密之前,电脑笔记网先来普及一下RSA加密解密,RSA公开密钥密码体制,所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。

PHPRSA加密解密

在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。

密钥和公钥

开始前需要准备openssl环境,linux 需要安装openssl工具包,下载地址:http://www.openssl.org/source/,Window 下需要安装 openssl 的程序,下载地址:http://slproweb.com/products/Win32OpenSSL.html。

密钥生成

openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。

1
openssl genrsa -out rsa_private_key.pem 1024

-out 指定生成的密钥的文件名,可以随意定义,但是最好为意义的名字,在此生成的密钥文件为 rsa_private_key.pem

在此生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。

公钥生成

Rsa命令用于处理RSA密钥、格式转换和打印信息

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

其中

-in filename:输入的RSA密钥文件,在此为上面生成的密钥 rsa_private_key.pem。

-pubout:设置此选项后,保存公钥值到输出文件中。

-out filename:输出文件,在此我们定义成rsa_public_key.pem

PHP用RSA加解密

开始前需要准备php openssl环境,开启PHP openssl扩展,Window 将php的配置文件php.ini中的php_openssl.dll开启。

extension=php_openssl.dll

下面代码演示:

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
80
<?php

    date_default_timezone_set('PRC');
    header("Content-type:text/html;charset=utf-8");

    /**
     * date:2016-09-02
     * Class encry
     * author phperblog.cn
     */
    final  class encry{

        const PRIVARY_KEY="rsa/client_private_key.pem";
        const PUBLIC_KEY="rsa/client_public_key.pem";

        /**
         * Rsa加密
         * @param string $orignData
         * @return string
         */
        public function encode($orignData) {
            //密钥文件的路径
            $privateKeyFilePath = self::PRIVARY_KEY;

            extension_loaded('openssl') or die('php需要openssl扩展支持');

            (file_exists($privateKeyFilePath)) or die('密钥的文件路径不正确');

            //生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
            $privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));

            ($privateKey) or die('密钥不可用');

            //加密以后的数据,用于在网路上传输
            $encryptData = '';

            ///////////////////////////////用私钥加密////////////////////////
            if (openssl_private_encrypt($orignData, $encryptData, $privateKey)) {
                return $encryptData;
            } else {
                die('加密失败');
            }
        }


        /**
         * Rsa解密
         * @param string $encryptData
         * @return string
         */
        public function decode($encryptData) {
            //公钥文件的路径
            $publicKeyFilePath = self::PUBLIC_KEY;

            extension_loaded('openssl') or die('php需要openssl扩展支持');

            (file_exists($publicKeyFilePath)) or die('公钥的文件路径不正确');

            //生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
            $publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));

            ($publicKey) or die('公钥不可用');

            //解密以后的数据
            $decryptData = '';

            ///////////////////////////////用公钥解密////////////////////////
            if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
                return $decryptData;
            } else {
                die('解密失败');
            }
        }
    }
    $obj=new encry();
    $str="name是phperblog.cn,密码是9you9.cn";
    $result=base64_encode($obj->encode($str));
    echo '加密后为:'.base64_encode($obj->encode($str)); //一般base64_encode后方便在网址中传输或者打印,否则打印为乱码
    echo '<br>';
    echo '解密后为:'.$obj->decode(base64_decode($result));

转载请注明:PcBiJi.COM » 如何利用PHP进行RSA加密解密

与本文相关的文章

  • 暂无相关文章!