Last updated on 2021年1月20日
问题描述:
JAVA丢过来一串字符串说是RSA公/私钥,直接用于加密时提示失败。PHP是需要转为pem格式后才能使用,这里记录一下。
环境:
- PHP 72
- 使用openss_*函数簇
代码如下:
pem格式以64位长度换行分割,前后分别加上公私钥分割标志生成。
$publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwwJTNyd42qDZug/sPxzLSddApwfL9IXXqgRiCZ2QDjrpE/KcxrObYHqtU6xQqz1GLJkSbrZWS/2M0/Bf3QE60CMIjOAHkxX6hBE7kfkMXKrMf8w16N8GOcG/RnSIl4HtZGwj9zRIGHDVUKlpjd2EvIzl02cFe7zF8yf8zUiXBvQIDAQAB';
$privateKey = 'MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALDAlM3J3jaoNm6D+w/HMtJ10CnB8v0hdeqBGIJnZAOOukT8pzGs5tgeq1TrFCrPUYsmRJutlZL/YzT8F/dATrQIwiM4AeTFfqEETuR+Qxcqsx/zDXo3wY5wb9GdIiXge1kbCP3NEgYcNVQqWmN3YS8jOXTZwV7vMXzJ/zNSJcG9AgMBAAECgYAbw/TcKuTsYxpB3Bu5S8pxAy7TEHOSTgpO7z6hZYpxgJ9ELQg6pnWQ56h0a4U8gFrH6BgI+IixkcrMzPkazxBNtpLR1YZEIGq/9fY6hfPA7L6sVHULebuU3y4IQX3oZkmnSjTv+4uTE9q2prPsOPkSbRmPmBp+Wk7KLOhDRullRQJBAOtECul2kEvM1aPDo2A3D32+hGQ/zs/fx8DFJaFq9P5KAwaDE4knvLhwwSk3I5V4QljwJL2TnEvaskRcxU5LzusCQQDAVGJARLfMwGGzsVAVHPE1dRc3I87+xSPKxgOZfTSCWywPMi9hynEwsoiTNrjJIrRjid+yfoPhTXqiOFHvvhf3AkEAnR58Cx7bj0PlCdGGMqOS/O9Xi3vxqnJQ/TSsxPihVZIoIxk22spnBuaGmffxE8mUxcDbSKBkKWSM2Yr7WibWsQJBALvBJPEspGmD3V04Wb9is67GEdXIZUidV2WajOUIL3yaWJa1HUBQCtPJVj6wiw//iy4o6HItw7zskC1Q4dwzLN0CQEf+7nEzIAFBp6XzvcDc7x8wn8sn2P6BKowEUd6f6Xrr/orb5E2T3NAz+bH/6gFkFqt+WfdQ/CCwNIB04GG8KLs=';
$pubPem = chunk_split($publicKey,64,"\n");
$pubPem = "-----BEGIN PUBLIC KEY-----\n" . $pubPem . "-----END PUBLIC KEY-----\n";
var_dump($pubPem);
// 验证公钥格式是否正确
$pu_key = openssl_pkey_get_public($pubPem);
if (!$pu_key) die('$pu_key 格式不正确');
$priPem = chunk_split($privateKey,64,"\n");
$priPem = "-----BEGIN PRIVATE KEY-----\n" . $priPem . "-----END PRIVATE KEY-----\n";
var_dump($priPem);
// 验证私钥格式是否正确
$pi_key = openssl_pkey_get_private($priPem);
if (!$pi_key) die('$pi_key 格式不正确');
验证:
使用 openssl_pkey_get_public() 、openssl_pkey_get_private() 来验证,返回值为 true 验证通过
// 验证私钥格式是否正确
$pi_key = openssl_pkey_get_public($priPem);
这里是openssl_pkey_get_private
感谢,已修改