问题描述
已知ECC的私钥内容,如下:1
MHQCAQEEIIEkuYgeJcJR2P1cwdG8cY3kwj/3YiU+XwQd2uEgCyoooAcGBSuBBAAKoUQDQgAEVzHUGgk4iVYbdwiWudUf30+bP3cj7a4w2Tbl6jdfduprDTwj5nmxNziK7AcMDQcETf+gLjqkHK+JRMHzFGYouA==
使用PHP代码推算出对应的公钥。
计算过程
下面代码需要php版本7.1以上
转换ECC私钥内容为PEM格式
1
2
3
4
5$private = 'MHQCAQEEIIEku...FGYouA=='; // ECC私钥内容
$startLine = "-----BEGIN EC PRIVATE KEY-----\n"; // PEM起始行
$endLine = "\n-----END EC PRIVATE KEY-----"; // PEM结束行
$privKey = $startLine . implode("\n", str_split($private, 64)) . $endLine; // 内容每64个字符一行
$privRes = openssl_pkey_get_private($privKey); // 转换私钥内容为资源转换私钥资源到CSR
1
2
3
4
5
6$dn = [];
$config = [
'private_key_type' => OPENSSL_KEYTYPE_EC,
'curve_name' => 'secp256k1', // 私钥生成时使用secp256k1曲线生成(需要设置与私钥生成对应的曲线)
];
$csr = openssl_csr_new($dn, $privRes, $config);从CSR中获取公钥
1
$pubKey = openssl_pkey_get_details(openssl_csr_get_public_key($csr))['key']; // 得到PEM格式的公钥内容
从PEM格式的公钥中获取字符串内容
1
2
3
4
5
6$replace = [
'-----BEGIN PUBLIC KEY-----',
'-----END PUBLIC KEY-----',
"\n",
];
$ripePublic = trim(str_replace($replace, '', $public)); // 得到处理后的公钥内容