php openssl, RSA私钥有PKCS#1和PKCS#8,均包含有公钥

php openssl, RSA私钥有PKCS#1和PKCS#8, 以及 GMSSL(sm2)均包含有公钥;

image

 

 将PKCS#1私钥由BASE转为HEX后, 提取从24位开始到522个字符,转为BASE就是公钥;

 将PKCS#8私钥由BASE转为HEX后, 提取从76位开始到522个字符,转为BASE就是公钥;

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAk7mpX9YSPdY/3rqDJ4vIlSlTJMN+q2aQtC5yWNewQXb0lawe
Sdg0g8rNgWNPehAWz4h5uzjg89ETNYAYWCGVScxSuwYhqvCM20SK6TrzscH22kdN
QUAKJWtdT8LOqGvtQ7YP5b+fwuLKkPW6X7BbXk908Y32P1DktDAYqhjZWxRBkTsO
WDSYBSf5XRIhDfCoktI0muH4QIr903lCxgk9GJRaGBzr5oxhQaG+BaxToWSk6nDS
5Uf0s3sbhcLor+IgZ911HZLiAgGmVqdETCP5vq1hpNwB+DAnXodVP4rsviUrNory
vDyhyK1cO+jUTLuTpVOAISh3mA9OU0MMicIYiwIDAQABAoIBAAPtySpqWBva6eHz
le9kUVZePf7ZUDIgzTJtlc71FZP4JPMiG8AdBvCGYUbSrFdzvBeS6qHnFlyFr/wZ
Rwx5AC5xR7X/qL+SHDzsqsEfN0IABZ+yi8RzfpGWNGodpT9nd2z4l52lpgsZ2wdV
8bn/x75PYK3X97ehYCPGr7E+bfF1IxKnWWA19FUQ13HTGc//i5A7NmUzGTpkbgkg
CrhniJWpGQrA63V2dofVlcCE42c4cR/skp7HJTeePwQkTn7DiLqM6eqya+rf0lai
GWOZnpj2AgMJyBGFNhjFQmFf5f1nifNI/jWboOKI5jeb+KExrFFUB/Bu/vm2zhGW
NlAGJbECgYEA1JlSmlLqyYZboD9PXwBK6h6bqW9fhNrM85ivm652oPMWt3NM5B4n
tXDST8AyyBqVTIgnbK7iiel4XLElng6QngUA5kDZ82hkft/NJQ1zDuCvrs1Wb/7/
T1KjO511j4763XX2C8IUrB1rP31IOjrjDp/H+whORCZBTntwGPve3dMCgYEAseH2
QURlMTDuDdG/SU8ZsPl1wQMMAhYKWeZ4mfRuxkVDE5xyS0nMziPsbO8qieUgEyck
KQ/NjQuYUOmR44PK5rArXD+Es6kS6kxXZtD5vM+CLqYz5J5hzxcARxIbVQ/NuLOq
Rep257EqNVg6owE0Yxf/83o9Iif1r+Lx9NdnT2kCgYEAt9uE8UuGGxRkBxjZZnpV
T1V7HzPfMoEawAwqyoM9uoGgArTnKVze0G4qo6e/AwjiVxZkqfwwlD5hxh+5PZCx
Bsei+H3bP0LnrkWUH1gbSiGMLasM9rxbRdlcq4DIG4f2cjHCwHZu9E5Y4sZRAXLN
zGboRrPvI8bFsb7UufaQzdsCgYA4o0zoXSGnNwAlMEqqyd/RRKykpxa0t1XWaBaw
Vm7K/JSt8ttFc5sda7zEtqYhv+2li4ns9RYqua1m3efQvE7nguJbffH/zm6yYVpW
52UNJDk8JzlQqslTyewRtQc031JOZA5sMopnnTZmQ9BvxFtszeB2Is7CSFznAuit
X8SKOQKBgFFcg2CvZGLEEIWxOZ/gduyCnvF07+xn8n8HLzBiESlliQ6NPaRImhs1
ak2vQltFS1HFTdotVoePtCoHxvD6z54Onvqy8BTmVN07P6It75TWTQTTGhQcLZtQ
m6LaANCDqDcRtLRQt4j8qdKyLdmXgJSIrtjgAbnhzoRmblSWgtrC
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7mpX9YSPdY/3rqDJ4vI
lSlTJMN+q2aQtC5yWNewQXb0laweSdg0g8rNgWNPehAWz4h5uzjg89ETNYAYWCGV
ScxSuwYhqvCM20SK6TrzscH22kdNQUAKJWtdT8LOqGvtQ7YP5b+fwuLKkPW6X7Bb
Xk908Y32P1DktDAYqhjZWxRBkTsOWDSYBSf5XRIhDfCoktI0muH4QIr903lCxgk9
GJRaGBzr5oxhQaG+BaxToWSk6nDS5Uf0s3sbhcLor+IgZ911HZLiAgGmVqdETCP5
vq1hpNwB+DAnXodVP4rsviUrNoryvDyhyK1cO+jUTLuTpVOAISh3mA9OU0MMicIY
iwIDAQAB
-----END PUBLIC KEY-----

验证地址:

http://tool.chacuo.net/cryptrsakeyvalid

 给出封装函数:

function hexToBase64($str){
	$result = base64_encode(hex2bin($str));
	return chunk_split($result, 64, "\n");
}
function base64ToHex($str){
	$result = bin2hex(base64_decode($str));
	return $result;
}
function prikeyTopubkey($privateKey, $pkcs = 1){
	
	if($pkcs === 1){                       //PKCS#1
		$beginStr = '-----BEGIN RSA PRIVATE KEY-----';
		$endStr = '-----END RSA PRIVATE KEY-----';
		$lenStr = 24;
	}else{                    //PKCS#8
		$beginStr = '-----BEGIN PRIVATE KEY-----';
		$endStr = '-----END PRIVATE KEY-----';
		$lenStr = 76;
	}
	$cleanedKey = str_replace([$beginStr,$endStr, "\n", "\r", " "],'',$privateKey);
	
	$privateKeyHex = base64ToHex($cleanedKey);
	$pubKeyHex = substr($privateKeyHex, $lenStr, 522);
	$dataArr = array(
		'30820122',
		'300d06092a864886f70d01010105000',
		'382010f003082010a0',
		'282010100',
		$pubKeyHex
	);
	$result = "-----BEGIN PUBLIC KEY-----\n" . hexToBase64(implode('',$dataArr)) . "-----END PUBLIC KEY-----";
	return $result;	
}

  

posted @ 2025-11-22 14:57  钢锅  阅读(4)  评论(0)    收藏  举报