PHP使用OPENSSL生成密钥、签名、验签

本文介绍了一个使用PHP的OpenSSL扩展进行RSA公钥/私钥生成、签名及验证的示例代码。详细展示了如何配置并使用openssl_pkey_new生成密钥对,以及如何利用私钥对数据进行签名,并使用公钥进行验证的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OPENSSL的php文件

<?php 

class OpensslClass {
    private $prikeypath = "Openssl/key/rsa_private_key.pem"; //私钥文件地址
    private $pubkeypath = "Openssl/key/rsa_public_key.pem"; //公钥文件地址    这两项是不存在的密钥对,使用接口会自动报错,什么都不影响。
	/**
	* 获取私钥公钥(生成公钥私钥)
	* @param array $configargs 配置
	* @return bool [description]
	*/
	public function getPrivateKeyAndPublicKey($configargs = array())
	{

		if (empty($configargs)) {
			$configargs = array(
				'private_key_bits' => 1024, // Size of Key.
				'private_key_type' => OPENSSL_KEYTYPE_RSA
			);
		}
		//$res返回false的时候,检查发现,是window系统缺少了openssl环境变量,解决方法如下:
		$opensslConfigPath = 'F:\xampp\php\extras\openssl\openssl.cnf'; //apache路径下的openssl.conf文件路径  个人使用xampp,这个是本地的openssl文件
		$res = openssl_pkey_new($configargs);////生成一个新的私钥 openssl_pkey_new ([ array $configargs ] ) configargs参数微调密钥的生成(比如private_key_bits 指定应该使用多少位来生成私钥)
		if(!$res) {
			$configargs['config'] = $opensslConfigPath;
			$res = openssl_pkey_new($configargs);
		} 
		openssl_pkey_export($res, $privKey, null, $configargs);//将一个密钥的可输出表示转换为字符串
		$file = fopen($this->prikeypath, 'w');
		// $privKey =str_replace(array("\n","\r"),array("",""),$privKey);
		fwrite($file, trim($privKey));
		fclose($file);
		$pubkey=openssl_pkey_get_details($res);
		$pubkey=$pubkey["key"];
		// $pubkey =str_replace(array("\n","\r"),array("",""),$pubkey);
		$file = fopen($this->pubkeypath, 'w');
		fwrite($file, trim($pubkey));
		fclose($file);
		return true;
	}
	/**
	* 签名(私钥签名)
	* @param string $data 明文
	* @return string 加密信息
	*/
	public function sign($data)
	{
		$pri = file_get_contents($this->prikeypath);
		$prikeyid = openssl_pkey_get_private($pri);//私钥 
		openssl_sign($data, $signMsg, $prikeyid); //注册生成加密信息 
		$sign = base64_encode($signMsg); //base64转码加密信息 加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
		$sign1 = urlencode($sign);
		return $sign1;
	}

	/**
	* 公钥验证签名
	* @param string $data 明文
	* @param string $signMsg 加密信息
	* @return bool 是否验证通过
	*/
	public function verify($data,$signMsg)
	{
		$pubkeyid = openssl_pkey_get_public(file_get_contents($this->pubkeypath));//公钥
		$unsignMsg=base64_decode(urldecode($signMsg));//base64解码加密信息 
		$res = openssl_verify($data, $unsignMsg, $pubkeyid); //验证 
		return $res; //输出验证结果,1:验证成功,0:验证失败 
	}
}
 ?>

使用的时候,要开启openssl.dll,调用方法获取公钥私钥,与对方交换公钥(如果你需要验证对方发过来的信息,不然只需要把公钥交给对方),然后自己调用sign方法加密发送给对方,如果失败可以自己使用公钥验证一下是否正确。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

czlearnunity3d

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值