RSA的公钥和私钥验证

1,如果私钥在一行,openssl_pkey_get_private()就会返回false,所以我们要修改格式 

$privateKey = "MIICXgIBAAKBgQDjI484irh8X8+/ahon/+frln74K7azpwHrvei70c2cpjFoW4ghkfQmhBkcqNj/OCyGAcDDw30v/PActXlPGqxT79E7zobAU4PbikkEoqnY440E4DZ8nvbLm1W6+StUahR70nwAS+KfwRilsS+EZwqSGHmKA3hPv82ONUj+uO5F9wIDAQABAoGBAID1moY2tIHhABmkiw80yx9GBfavEv8zDfMjkrS4bK3I6fpfJY4xyNXpYDyWXQWihhzbd+9t2XDaghU6r5JLCZVYmpxRbNDYD48BK8e0STKQkQipTo5BG/DHajirVLWlJN9csQeM/TgHOmieRWzA2XZLG79XdZoAn5qrkHfszV4BAkEA8xFvfBZ8XjNdR5H2h3ktlWbH9+xeSCFv4F34xdE4jCUs7CLEZqaVWwVwBUceVAenEI9xIRNC6q51EMbrl+eS9wJBAO85K3PKyNVoqZKJ+JB2GozuwW29j96Ki5zzOx7jWjVHygO3gnwU0v2VqdftFXj3KLoycdzZjAQDAwWmbPI/JQECQQDH2UIMiIBhA2JiggRshpmQCR3JHjK2o6dUlm8AVnFj6PzyefN5YuXSHLpp3Ht3I4Oc/hNJ2oheZGokDSmPj/spAkEArYBdT4IH3yAlvK5spPnDj+uqRplxuwno8FBI1MI4LuR+U+vIq42+6USfBohhRnacB0+G3ZK6xj4Y9wQZiCjcAQJAUhsoJcGWXVpuT+xfPvnEaEhBkOC6HYoMApgljPng8ZrPGEFaGpk/ZwK13ilB1LOjGmVtNmfDpVDXJtvLStH0WQ==";


$passphrase = '';	// 私钥密码
$key_width = 64;

//私钥
$p_key = array();
//如果私钥是 1行
if( ! stripos( $privateKey, "\n" )  ){
	$i = 0;
	while( $key_str = substr( $privateKey , $i * $key_width , $key_width) ){
		$p_key[] = $key_str;
		$i ++ ;
	}
}else{
	//echo '一行?';
}
$privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . implode("\n", $p_key) ;
$privateKey = $privateKey ."\n-----END RSA PRIVATE KEY-----";

//私钥
$pkeyid = openssl_pkey_get_private( $privateKey , $passphrase);
if (empty($pkeyid)) {  
     echo "private key resource identifier False!";  
     return False;  
}  
$verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
openssl_free_key($pkeyid);

这样就会变成我们想要的格式,从而验证成功,注意:openssl_sign函数中的最后一个参数OPENSSL_ALGO_MD5,这个要看用的是什么加密方式,对应的用什么参数

 openssl_sign 默认signature_alg参数是OPENSSL_ALGO_SHA1

  如果使用DSA加密方式需要使用OPENSSL_ALGO_DSS1参数

  signature_alg 其他参数

  OPENSSL_ALGO_DSS1

  OPENSSL_ALGO_SHA1

  OPENSSL_ALGO_SHA224

  OPENSSL_ALGO_SHA256

  OPENSSL_ALGO_SHA384

  OPENSSL_ALGO_SHA512

  OPENSSL_ALGO_RMD160

  OPENSSL_ALGO_MD5

  OPENSSL_ALGO_MD4

  OPENSSL_ALGO_MD2

下面的openssl_verify函数的最后一个参数一样的,也是要注意是什么加密方式,用什么方式解密

 

2,如果公钥在一行,openssl_pkey_get_public(),也会返回false

$public_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLRDRAO/Yt5g/v8nHTXTxz+0CLac1Y380soIEDhPIIOui2P5L7rijBUsjPq5gNGfg6w0OoiviwzuFFljE3QSB7RGt4iOpI360O7pCim0AzLqLI2wZ2CjNRsFO9LIeo/EkjrxCLJtdTQtu/7u5YH9tarqawdXNZ0rr3qQeC/VCPWQIDAQAB";
if (empty($public_key)){
    echo "Public Key error!";
    return False;
}
  		
$pem = chunk_split($public_key,64,"\n");
$pem = "-----BEGIN PUBLIC KEY-----\n".$pem."-----END PUBLIC KEY-----\n";
$public_key_id = openssl_pkey_get_public($pem);
if (empty($public_key_id)){  
    echo "public key resource identifier False!";
    return False;
}  
$ret = openssl_verify($data, $signature, $public_key_id,OPENSSL_ALGO_MD5);	//$ret返回1是验证成功,0是验证失败
if($ret == 1){
     return true;
}else{
     return false;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值