首页 > 编程语言 >PHP生成公钥私钥,加密解密,签名验签

PHP生成公钥私钥,加密解密,签名验签

时间:2023-08-14 10:14:28浏览次数:28  
标签:公钥 私钥 key openssl private str 验签 encrypt public

<?php
/**
 * ras 生成钥对,加密/解密码,加密验证
 * @author 
 *
 */
class Ras
{
    // 公钥
    private $publicKey = __DIR__ . './ras/publicKey.pem';

    // 私钥
    private $privateKey = __DIR__ . './ras/privateKey.pem';

    //配置需要用到环境配置文件 openssl.cnf
    private $config_path = 'D:/phpstudy_pro/Extensions/Apache2.4.39/conf/openssl.cnf';

    /**
     * 测试生成签名对
     */
    public function testRas()
    {
        // 生成新的公私钥对
        $this->create_ras_key_pair();

        // 要加密的字符串
        $str = 'test123';

        echo "要加密的字符串:{$str} \n\n";

        // 加密生成字符串
        $encrypt_str = $this->public_encrypt($str);
        echo "加密生成的字符串:" . $encrypt_str;

        echo "\n\n ----- \n\n";

        // 解密由加密生成的字符串
        $decrypt_str = $this->private_decrypt($encrypt_str);
        echo "解密生成的字符串:" . $decrypt_str;

        echo "\n\n ----- \n\n";
        
        // 字符串生成签名
        $sign_str = $this->sign($decrypt_str);
        echo "生成签名:" . $sign_str;
        echo "\n\n ----- \n\n";

        // 验证签名生成的字符串
        $res = $this->verify($decrypt_str,$sign_str);
        echo "验证签名:";
        var_dump($res);
    }

    /**
     * 生成公钥和私钥对
     * @return false|void
     */
    public function create_ras_key_pair()
    {
        $config = array(
          'digest_alg' => 'sha512',
          'private_key_bits' => 4096,
          'private_key_type' => OPENSSL_KEYTYPE_RSA,
          'config' => realpath($this->config_path)
        );
    
        $new_key = openssl_pkey_new($config);
        if(!$new_key)
        {
            return false;
        }

        openssl_pkey_export($new_key,$private_key,null,$config);
        $public_key = openssl_pkey_get_details($new_key);
        // 公钥
        file_put_contents($this->publicKey,$public_key['key']);
        // 密钥
        file_put_contents($this->privateKey,$private_key);
//        echo "public_key:\n";
//        var_dump($public_key);
//        echo "\n\n\n\n private_key:\n";
//        var_dump($private_key);
        openssl_free_key($new_key);
    }

    /**
     * 公钥加密
     * @param $str  要加密的明文
     * @return string
     */
    public function public_encrypt($str){
        $public_key = file_get_contents($this->publicKey);
        openssl_public_encrypt($str, $encrypt_str, $public_key);
        return base64_encode($encrypt_str);
    }

    /**
     * 私钥解密
     * @param $encrypt_str  要解密的密文
     * @return mixed
     */
    public function private_decrypt($encrypt_str){
        $private_key_str = file_get_contents($this->privateKey);
        $private_key = openssl_get_privatekey($private_key_str);
        $encrypt_str_result = base64_decode($encrypt_str);
        openssl_private_decrypt($encrypt_str_result,$decrypt_str,$private_key);
        return $decrypt_str;
    }

    /**
     * 私钥签名
     * @param $plain 要签的明文
     * @return false|string|void
     */
    public function sign($plain)
    {
        try{
            $priv_key = file_get_contents($this->privateKey);
            $pkeyid = openssl_get_privatekey($priv_key);
            if(!is_resource($pkeyid)){
                return false;
            }
            openssl_sign($plain, $signature,$pkeyid,OPENSSL_ALGO_SHA256);
            openssl_free_key($pkeyid);
            return base64_encode($signature);
        }catch(Exception $e){
            print_r($e);
        }
    }

    /**
     * @param $plain 要签的明文
     * @param $signature 生成的签名
     */
    public function verify($plain,$signature){
        $signature = base64_decode($signature);
        $cert = file_get_contents($this->publicKey);
        $pubkeyid = openssl_get_publickey($cert);
        if(!is_resource($pubkeyid)){
            return false;
        }
        $ok = openssl_verify($plain, $signature,$pubkeyid,OPENSSL_ALGO_SHA256);
        @openssl_free_key($pubkeyid);
        if($ok == 1){
            return true;
        }
        return false;
    }


}
(new Ras())->testRas();

/*
 
要加密的字符串:test123 

加密生成的字符串:KSd7kRWCiWiCapmFeWfrO3Zuy4iG+wg6zmAWPDp5x2117BZO/++ECRTFKU+JNtXLaODJwo3a/nUACVgp/aKGDNyWNOi60K/GQYDeOIBJbv9CwUfHUL/3U9+qmyGA25+Br/AfnUyTLXw2xAGpO0wsx71uJdg19rWiPLoSxM7PO+WS1q3ekqK3dktOIzeS8EwtIhuC8G9WG6HoMeNZl8CzVUtEr/s34qtA7npgDjje8DziCrXCmJk0nMGuKZaYJc9MGQ6F1/ULpPilm2HQxj5ZhTmJc5Z5fQtfEVrIbg7Z+wQOlSjXSR4wU4SHdVOyjyIzC/CV6+lB2isNMCWCnE9kj+TJ+hM7e3bZr+v1KLcyXi0NirGO/SOd8Mh49Vf22eahME2pwKm/B0hFcuMTsDTNLcjA93c9akfjo4w2PFGY+rpvFqB6WTQhgZVfKmFosiHqyGmBg3H/rVS2NRZ7VCvBwt+RN2DDH/2Wpcrod7x3JylYVbZBK+BTRUpVPoVN+l3e62a0iqLKlM4fdHB/vHn/OD3OBw1OTCZzZdzbIra0ykDgrkW+IqQI/HDALUcPRfp6klAi7IEjsW3Z4VTgKAhNzPUarWkjaKm5oaVXSaT5NTcoPOpSC2hK6Vcd+wChKuXC8iScxjTjKJoG8tnMtNC6SfBQkXneDjTuBpZ2w1rns8g=

 ----- 

解密生成的字符串:test123

 ----- 

生成签名:TuELg67wti693pURJjZ4V9NeqoZQscUVL72uuNyu4QGI0ed0JrJQEPMeNWA6T7kAtHra5rSKIgVb9vhOpPSy4fycqXp4TJyDsKvY2DIqAdzYDx62HCBMZSjwOjLDHGn+4B/j2B//x2igdgpxUOSmD5iXvutuLASlvSkTQI8KoKOfc13IYy8kIrgrd464wC8nePfFy+oKFw4Efl0ZWwRZ3UzRW+ip8BFJSnMMjkuB6JdcdlphqdCniN8I7WenJnuOy0OGEj7uQHbUjDeaJDr7sKvyASuh8eWieNzbUMMLXLwC2vcJX2IGu+ozYvAmIEBUXZmBkTiD0GWHEWTCg0/V93AoJYAINP87TCQuzuM4O7cjlmicVtfXlQwT9ShxOgJvki/hrLrE9noElpiaFXJ81RO7qMlFz4nMNofDNAVDD8DibiBlVONgf2JpAGiidDAoo6ct6VdsGvAs9nV+WddoXyhtv/lBlo9JN4pUaiKfzkCL2WfbAxTWiU58jkwe7EjfbH0HiIJDtEDLgbtdNIauhXOXbced61VScaFHh9jk4grXgVtqBL+K0aOweq/Q9Gqx2PYuVE2kYuFDYhjYLoGVssgB9PGDgeHeIPzDvudkcsydexaM3BtSIMPyvu3TR3GnRv9kdEWNwaJPFkpf6dRvo0RSK+ZPidxqI01Qg6I5i+k=

 ----- 

验证签名:bool(true)
*/

 

标签:公钥,私钥,key,openssl,private,str,验签,encrypt,public
From: https://www.cnblogs.com/lin3615/p/17627874.html

相关文章

  • 禁用账号密码使用ssh私钥登录服务器
    1、生成ssh信息id_rsa为私钥,id_rsa.pub为公钥。私钥自己下载到本地电脑妥善保存(丢失后就无法再登陆了)建议删除服务器端的私钥。公钥则可以任意公开。ssh-keygen-trsa--------------------------------------输入生成的名称密码确认密码2、公钥导入到系统中cat/roo......
  • 公钥 & 数字证书 & 分布式身份DID (上)
    主页个人微信公众号:密码应用技术实战个人博客园首页:https://www.cnblogs.com/informatics/引言密码技术中最令人兴奋的密码算法简介类别算法描述对称加密算法AES(AdvancedEncryptionStandard)使用不同密钥长度(128位、192位、256位),广泛用于数据保密。DE......
  • 文章学习 | MPC 是下一代私钥安全的7大原因
    文章学习:MPC是下一代私钥安全的7大原因前言多重签名钱包与单一密钥钱包相比,因其提升了资产安全性,如今已成为机构管理加密货币的标准做法。然而,最近在多方计算(MPC)领域的密码学突破正引领私钥安全的新一代发展。麻省理工学院数字货币倡议部门的区块链研究高级顾问迈克尔·J·......
  • 禁用账号密码使用ssh私钥登录服务器
    1、生成ssh信息id_rsa为私钥,id_rsa.pub为公钥。私钥自己下载到本地电脑妥善保存(丢失后就无法再登陆了)建议删除服务器端的私钥。公钥则可以任意公开。ssh-keygen-trsa--------------------------------------输入生成的名称密码确认密码2、公钥导入到系统中cat/roo......
  • C#.NET 国密SM2 签名验签 与JAVA互通 ver:20230807
    C#.NET国密SM2签名验签与JAVA互通ver:20230807 .NET环境:.NET6控制台程序(.netcore)。JAVA环境:JAVA8(JDK8,JAVA1.8),带maven的JAVA控制台程序。 1.最好要到对方源码(DEMO+JAR包也可以),可以用IDEA反编译(Ctrl+鼠标左键),看它过程逻辑和结果格式。2.常说的SM2签名,指的就......
  • post请求,go源码会把“+”字符转成了空格导致的验签失败问题
    问题描述:安卓7.29的包客户端书城男女图书页面显示异常,冷启动、下拉刷新等都无法恢复,个别用户清除缓存数据后恢复。(说明:安卓从72880开始的包,客户端书城接口升级为v7:/api/v7/book-store,post请求) 问题原因:线上书城男女图书v7接口part1的post接口请求,个别手机出现401验签失败。......
  • RSA的私钥和公钥
    RSA的公钥和私钥在F(N)上互为逆元,F(N)为模N的欧拉函数。模N为素数时,F(N)=N-1模N为两素数p和q乘积时,F(N)=(q-1)(p-1)模N为多个素数x1、x2……xn乘积时,F(N)=(x1-1)(x2-1)……(xn-1)一个数E在N上有逆元的充分必要条件是gcd(E,N)=1。故在选取公钥E时,需要保证E和欧拉函数F(N)互......
  • Mac中使用Keytool生成证书以及获取公钥方案实现
    Keytool是java中提供的一个证书管理工具如何生成证书?首先在Mac中新建一个文件夹,名为jks,如下图所示:新建jks文件夹然后在聚焦搜索里面搜索终端,打开terminal相当于windows中的cmd命令窗口,打开之后输入以下命令cdjkskeytool-genkeypair-aliastest-keyalgRSA-keypasstes......
  • JavaScript学习 -- RSA算法应用实例及公钥私钥的生成方法
    正文:RSA算法是一种非对称加密算法,用于加密、解密和数字签名等场景。本文将介绍如何在JavaScript中使用RSA算法,并提供一个实际的案例,同时也会说明如何生成公钥和私钥。首先,确保您已经引入了jsencrypt库。以下是一个使用RSA算法进行加密和解密的示例,同时也包含了公钥和私钥的生成方法......
  • CentOS 7.9配置SSH白名单用户、白名单IP和基于公钥认证实现免密登录
    一、演示环境:IPHostnameOS192.168.0.200server1CentOS7.9192.168.0.201server2CentOS7.9192.168.0.202server3CentOS7.9说明:1、上述3台主机都关闭了firewalld和SELinux;2、每一次演示后,所有主机都会恢复默认配置。二、配置SSH白名单用户登录:1、server1中创建测试用户user1、user2......