0x01 公钥和私钥
公钥:公开的密码
私钥:私有备份的密码
不对称的加解密算法,比较出名的就是RSA
0x02 主要用处
数据传输
公钥加密-> 私钥解密: 主要用于数据传输过程,不担心数据泄露的问题
私钥加密-> 公钥解密: 主要用于数字认证,加密后的数据无法伪造.
0x03 代码示例
主要的功能:
1: 生成公钥和私钥
2: 公钥加密->私钥解密
3: 私钥加密-> 公钥解密
<?php
/**
* 生成RSA的公钥和私钥
* 正常情况,分开存储, 服务器只保存私钥即可
* @return array
*/
function generateRsaKey()
{
$config = array(
'config'=>'D:\phpstudy_pro\Extensions\php\php7.1.9nts\extras\ssl\openssl.cnf',//安装PHP7会自带这个配置文件
'digest_alg'=> 'sha256', //可以用openssl_get_md_methods() 查看支持的加密方法
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $private_key_pem,null,$config);
$details = openssl_pkey_get_details($res);
$public_key_pem = $details['key'];
return [
"public_key"=>$public_key_pem,
"private_key"=>$private_key_pem
];
}
/**
* 公钥-私钥配对验证
* @param $private_key_pem
* @param $public_key_pem
* @return int 1 if the signature is correct, 0 if it is incorrect, and
* -1 on error.
*/
function checkRsa($private_key_pem,$public_key_pem)
{
$data = "PHP";
openssl_sign($data, $signature, $private_key_pem, OPENSSL_ALGO_SHA256);
$result = openssl_verify($data, $signature, $public_key_pem, OPENSSL_ALGO_SHA256);
return $result;
}
/**
* 公钥加密
* @param $str -> 要加密的字符串
* @param $public_key -> 公钥
* @return string -> base64编码后的字符串
*/
function encrypt_by_public($str,$public_key)
{
//第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
$return_en = openssl_public_encrypt($str,$crypted, $public_key);
if(!$return_en){
return('加密失败,请检查RSA秘钥');
}
$str_encrypt_base64 = base64_encode($crypted);
return $str_encrypt_base64;
}
/**
* 私钥解密
* @param $str -> 要解密的字符串
* @param $private_key -> 私钥
* @return string -> 解密后的字符串
*/
function decrypt_by_private($str,$private_key)
{
$return_de = openssl_private_decrypt(base64_decode($str), $decrypted, $private_key);
if(!$return_de){
return('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
/**
* 私钥加密
* @param $str
* @param $private_key
* @return string
*/
function encrypt_by_private($str,$private_key)
{
$return_en = openssl_private_encrypt($str, $crypted, $private_key);
if(!$return_en){
return('加密失败,请检查RSA秘钥');
}
$str_encrypt_base64 = base64_encode($crypted);
return $str_encrypt_base64;
}
/**
* 公钥解密
* @param $str
* @param $public_key
* @return string
*/
function decrypt_by_public($str,$public_key)
{
$return_de = openssl_public_decrypt(base64_decode($str), $decrypted, $public_key);
if(!$return_de){
return('解密失败,请检查RSA秘钥');
}
return $decrypted;
}
$key = generateRsaKey();
if(checkRsa($key["private_key"],$key["public_key"])!=1){
die("rsa秘钥验证无效!");
}
//待加密字符串
$to_encrypt_string = "www.gyarmy.com——流沙";
/*
//加密
$str_encrypt = encrypt_by_public($to_encrypt_string,$key["public_key"]);
echo $str_encrypt;
echo "<br/>";
//解密
$str_decrypt = decrypt_by_private($str_encrypt,$key["private_key"]);
echo $str_decrypt;
*/
$str_encrypt = encrypt_by_private($to_encrypt_string,$key["private_key"]);
echo $str_encrypt;
echo "<br/>";
$str_decrypt = decrypt_by_public($str_encrypt,$key["public_key"]);
echo $str_decrypt;
0则评论给“php-rsa 公钥和私钥加密测试”