流沙团
php-rsa 公钥和私钥加密测试
2021-7-25 流沙团


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;
发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容