RSA非对称加密算法实现过程
非对称加密算法有很多,RSA算法就是其中比较出名的算法之一,下面是具体实现过程
1 <?php
2 /**
3 * 使用openssl实现非对称加密 5 */
6 class Rsa
7 {
8 /**
9 * private key
10 */
11 private $_privKey;
12
13 /**
14 * public key
15 */
16 private $_pubKey;
17
18 /**
19 * the keys saving path
20 */
21 private $_keyPath;
22
23 /**
24 * the construtor,the param $path is the keys saving path
25 */
26 public function __construct($path)
27 {
28 if(empty($path) || !is_dir($path)){
29 throw new Exception('Must set the keys save path');
30 }
31
32 $this->_keyPath = $path;
33 }
34
35 /**
36 * create the key pair,save the key to $this->_keyPath
37 */
38 public function createKey()
39 {
40 $r = openssl_pkey_new();
41 openssl_pkey_export($r, $privKey);
42 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);
43 $this->_privKey = openssl_pkey_get_public($privKey);
44
45 $rp = openssl_pkey_get_details($r);
46 $pubKey = $rp['key'];
47 file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);
48 $this->_pubKey = openssl_pkey_get_public($pubKey);
49 }
50
51 /**
52 * setup the private key
53 */
54 public function setupPrivKey()
55 {
56 if(is_resource($this->_privKey)){
57 return true;
58 }
59 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';
60 $prk = file_get_contents($file);
61 $this->_privKey = openssl_pkey_get_private($prk);
62 return true;
63 }
64
65 /**
66 * setup the public key
67 */
68 public function setupPubKey()
69 {
70 if(is_resource($this->_pubKey)){
71 return true;
72 }
73 $file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';
74 $puk = file_get_contents($file);
75 $this->_pubKey = openssl_pkey_get_public($puk);
76 return true;
77 }
78
79 /**
80 * encrypt with the private key
81 */
82 public function privEncrypt($data)
83 {
84 if(!is_string($data)){
85 return null;
86 }
87
88 $this->setupPrivKey();
89
90 $r = openssl_private_encrypt($data, $encrypted, $this->_privKey);
91 if($r){
92 return base64_encode($encrypted);
93 }
94 return null;
95 }
96
97 /**
98 * decrypt with the private key
99 */
100 public function privDecrypt($encrypted)
101 {
102 if(!is_string($encrypted)){
103 return null;
104 }
105
106 $this->setupPrivKey();
107
108 $encrypted = base64_decode($encrypted);
109
110 $r = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
111 if($r){
112 return $decrypted;
113 }
114 return null;
115 }
116
117 /**
118 * encrypt with public key
119 */
120 public function pubEncrypt($data)
121 {
122 if(!is_string($data)){
123 return null;
124 }
125
126 $this->setupPubKey();
127
128 $r = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
129 if($r){
130 return base64_encode($encrypted);
131 }
132 return null;
133 }
134
135 /**
136 * decrypt with the public key
137 */
138 public function pubDecrypt($crypted)
139 {
140 if(!is_string($crypted)){
141 return null;
142 }
143
144 $this->setupPubKey();
145
146 $crypted = base64_decode($crypted);
147
148 $r = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
149 if($r){
150 return $decrypted;
151 }
152 return null;
153 }
154
155 public function __destruct()
156 {
157 @ fclose($this->_privKey);
158 @ fclose($this->_pubKey);
159 }
160
161 }
162
163 //====================demo=======================
164 //以下是一个简单的测试demo,如果不需要请删除
165 $rsa = new Rsa('ssl-key');
166
167 //私钥加密,公钥解密
168 echo 'source:我是老鳖<br />';
169 $pre = $rsa->privEncrypt('我是老鳖');
170 echo 'private encrypted:<br />' . $pre . '<br />';
171
172 $pud = $rsa->pubDecrypt($pre);
173 echo 'public decrypted:' . $pud . '<br />';
174
175 //公钥加密,私钥解密
176 echo 'source:干IT的<br />';
177 $pue = $rsa->pubEncrypt('干IT的');
178 echo 'public encrypt:<br />' . $pue . '<br />';
179
180 $prd = $rsa->privDecrypt($pue);
181 echo 'private decrypt:' . $prd;
182 //========================demo======================
183 ?>
参考链接:RSA非对称加密