rsa公私鑰加密解密以及驗證相信大家都很熟悉了,如果提供的公私鑰直接是pem文件格式的,【rsa_private_key.pem】和【rsa_public_key.pem】,內容是這樣的
那么我們直接使用以下方法即可
1 $rsa_private_key = openssl_get_privatekey(file_get_contents('rsa_private_key.pem'));//獲取私鑰資源
2 $rsa_public_key = openssl_get_publickey(file_get_contents('rsa_public_key.pem'));//獲取公鑰資源
但是,如果我們得到的公私鑰不是文件而是字符串呢,像這樣的
如果直接拿這種字符串去運行程序,則會報錯不是正確的公私鑰文件,所以我們就需要把字符串格式的公私鑰做一下格式化處理才能正常使用,當然了有了第一種的用法,我們可以通過把字符串寫入到文件然后再讀取,但是感覺有點畫蛇添足,下面使用一種新方法
1 $pubPem = chunk_split($publicKey, 64, "\n"); 2 $pubPem = "-----BEGIN PUBLIC KEY-----\n" . $pubPem . "-----END PUBLIC KEY-----\n"; 3 var_dump($pubPem); 4 5 // 驗證公鑰格式是否正確 6 $pu_key = openssl_pkey_get_public($pubPem); 7 if (!$pu_key) die('$pu_key 格式不正確'); 8 9 $priPem = chunk_split($privateKey, 64, "\n"); 10 $priPem = "-----BEGIN PRIVATE KEY-----\n" . $priPem . "-----END PRIVATE KEY-----\n"; 11 var_dump($priPem); 12 13 // 驗證私鑰格式是否正確 14 $pi_key = openssl_pkey_get_public($priPem); 15 if (!$pi_key) die('$pi_key 格式不正確');
不用生成pem文件,直接代碼控制即可正常使用。
如果需要把字符串的公私鑰生成pem文件 ,可以參考如下方法,也可以直接將上面方法得到的$pubPem或者$priPem寫入文件
1 function setKeyPem ($keyStr, $type = 'public') { 2 if ($type == 'private') { 3 $begin_key = "-----BEGIN PRIVATE KEY-----\r\n"; 4 $end_key = "-----END PRIVATE KEY-----\r\n"; 5 } else { 6 $begin_key = "-----BEGIN PUBLIC KEY-----\r\n"; 7 $end_key = "-----END PUBLIC KEY-----\r\n"; 8 } 9 10 $filename = dirname(__FILE__) . "/rsaKey.pem"; 11 @chmod($filename, 0777); 12 @unlink($filename); 13 14 $fp = fopen($filename, 'ab'); 15 $len = fwrite($fp, $begin_key, strlen($begin_key)); 16 17 $raw = strlen($keyStr) / 64; 18 $index = 0; 19 $keyData = ''; 20 while ($index <= $raw) { 21 $line = substr($keyStr, $index * 64, 64) . "\r\n"; 22 if (strlen(trim($line)) > 0) 23 $len += fwrite($fp, $line, strlen($line)); 24 $index++; 25 } 26 $len += fwrite($fp, $end_key, strlen($end_key)); 27 fclose($fp); 28 return $len; 29 }
30
31 $keyStr = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCQulGSsEGYGuEEMbc7kgIDmOYGai3tdN3+QDKKq1AXhRLnnzJ204uSrb902CYX+4qQ2/Mbsve1TWhTPmj60+qoAlUYrmGRU6Q8fv9/fS9+dAJD2qP8/gj9cnf5D+NLsL7JioIMEkO1/dclZtpLulT429KTGo+QVCBumIRxRWdMLQIDAQAB";
32 setKeyPem($keyStr);