php格式化RSA公钥私钥字符串

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, "
");
 2 $pubPem = "-----BEGIN PUBLIC KEY-----
" . $pubPem . "-----END PUBLIC KEY-----
";
 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, "
");
10 $priPem = "-----BEGIN PRIVATE KEY-----
" . $priPem . "-----END PRIVATE KEY-----
";
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-----
";
 4         $end_key = "-----END PRIVATE KEY-----
";
 5     } else {
 6         $begin_key = "-----BEGIN PUBLIC KEY-----
";
 7         $end_key = "-----END PUBLIC KEY-----
";
 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) . "
";
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);
原文地址:https://www.cnblogs.com/firstlady/p/11326963.html