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方法加密发送给对方,如果失败可以自己使用公钥验证一下是否正确。