php如何生成RSA公钥私钥
未知
2020-05-15 15:51:48
0
问题描述:

  我们公司对接易通的数据。他们要求:

需要接入方自己生成rsa2048位)密钥对,然后将公钥提供给易通。

 

并使用服务商自己申请的RSA私钥(2048位 SHA256WithRSA)对摘要做签名操作

 

刚开始还不知道什么是rsa,公钥和私钥的用处。怎么获取?

php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一个例子来说明如何用php来实现数据的加密解密

先了解一下关于公钥私钥加解密的作用

一、公钥加密
假设一下,我找了两个数字,一个是1,一个是2。我把2保留起来,不告诉你们,当做我的私钥,然后我告诉大家,1是我的公钥。

我有一个文件,不能让别人看,我就用1加密了。别人找到了这个文件,但是他不知道2就是解密的私钥啊,所以他解不开,只有我可以用数字2,就是我的私钥,来解密。这样我就可以保护数据了。

我的好朋友小明用我的公钥1加密了字符a,加密后成了b,放在网上。别人偷到了这个文件,但是别人解不开,因为别人不知道2就是我的私钥,只有我才能解密,解密后就得到a。这样,我们就可以传送加密的数据了。

二、私钥签名
如果我用私钥加密一段数据(当然只有我可以用私钥加密,因为只有我知道2是我的私钥),结果所有的人都看到我的内容了,因为他们都知道我的公钥是1,那么这种加密有什么用处呢?

但是我的好朋友小红说有人冒充我给他发信。怎么办呢?我把我要发的信,内容是‘天涯’,用我的私钥2,加密,加密后的内容是‘冰封’,发给小红,再告诉他解密看看是不是‘天涯’。他用我的公钥1解密,发现果然是‘天涯’。
这个时候,他会想到,能够用我的公钥解密的数据,必然是用我的私钥加的密。只有我知道我的私钥,因此他就可以确认是不是我发的东西。
这样我们就能确认发送方身份了。这个过程叫做数字签名。当然具体的过程要稍微复杂一些。用私钥来加密数据,用途就是数字签名。

三、总结

公钥和私钥是成对的,它们互相解密。

公钥加密,私钥解密。

私钥数字签名,公钥验证。


解决办法:
             $opensslConfigPath = "E:\phpstudy\Extensions\Apache2.4.39\conf\openssl.cnf";//本地openssl.cnf路径
             //$opensslConfigPath="/etc/pki/tls/openssl.cnf"//apache路径

        $config = array(


            "digest_alg" => "sha256",

            "private_key_bits" =>2048,

            "private_key_type" => OPENSSL_KEYTYPE_RSA,

            'config'=> $opensslConfigPath

        );

        //创建密钥对

        $res = openssl_pkey_new($config);

        //生成私钥

        openssl_pkey_export($res, $privkey, null, $config);

        //生成公钥

        $pubKey = openssl_pkey_get_details($res)['key'];
                 file_put_contents("./cert_public.key",$pubKey);//生成在根目录
          file_put_contents("./cert_private.pem",$privkey);

          //生成证书
          $dn = array(   
            "countryName" => 'CH', //所在国家名称    
            "stateOrProvinceName" => 'Shandong', //所在省份名称    
            "localityName" => 'JiNan', //所在城市名称    
            "organizationName" => 'liyajun',   //注册人姓名    
            "organizationalUnitName" => 'guotong', //组织名称    
            "commonName" => 'mySelf', //公共名称    
            "emailAddress" => 'user@domain.com' //邮箱    
        );    
         $privkeypass = '123456'; //私钥密码    
        $numberofdays = 365;     //有效时长    
        $cerpath = "./tests.cer"; //生成证书路径    
        $pfxpath = "./testd.pfx"; //密钥文件路径   
        //生成证书    
        $privkey = openssl_pkey_new($config);    
        $csr = openssl_csr_new($dn, $privkey,$config);
        // $sscert = openssl_csr_sign($csr, null, $privkey, 365, $config);   
        $sscert = openssl_csr_sign($csr,null, $privkey, $numberofdays,$config);
        openssl_pkey_export_to_file($privkey,"server.key",NULL, $config);

        openssl_x509_export_to_file($sscert,"server.crt");
        openssl_csr_export_to_file($csr, "server.csr");

        print_r($privkey);

        echo '<p style="height:100px;background:red">1</p>';

        print_r($pubKey);




相关内容

PHP与SQLSRV数据库...
摘要:本文介绍了PHP与SQLSRV数据库迁移的步骤和注意事项,包...
2024-11-20 11:46:42
PHP与SQLSRV连接数...
PHP与SQLSRV连接SQL Server数据库教程,介绍安装配...
2024-11-20 11:23:44
PHP与SQLSRV连接M...
本文介绍了使用PHP和SQLSRV扩展连接MySQL数据库的实例,...
2024-11-20 11:00:46
PHP中SQLSRV处理大...
摘要:在PHP中使用SQLSRV处理大数据量时,可通过数据库端索引...
2024-11-20 10:46:41
PHP SQLSRV数据库...
本文介绍了使用PHP SQLSRV扩展进行数据库操作的示例,包括连...
2024-11-20 10:23:47
PHP与SQLSRV连接数...
摘要:本文介绍了PHP与SQLSRV连接数据库的性能优化策略,包括...
2024-11-20 10:00:52

热门资讯

tp5 jquery判断手机端... application--common.php中添加如下代码 //函数作用是判断用户打开的是手机端还...
Laravel 5.5 .No... 创建了新的laravel项目后, 运行提示:No application encryption ke...
php 打印date函数出现错... 问题描述: 我使用的是phpstudy,在练习时间函数的时候,打印出现在的时间,date(Y-m-d...
生成随机字符唯一标识符guid... /** * @param $length * @return string * 生成随机字符串 */...
layui缩略图 div class=layui-form-item label class=layui-form-l...
php函数substr_rep... php函数substr_replace从某个位置替换或删除或插入字符串
Laravel 引入自定义类库... 强烈建议引入的类 都是含有命名空间的,这样使用起来就不会出现重名的情况。!!当然,没有命名空间也可以...
object json转化为数... //调用api 程序,通知商户订单异常 20200314 public function callt...
Laravel 查看SQL操作... 方法一:临时打印操作记录 DB::connection()-enableQueryLog(); # ...
php银行开放平台接口:pfx... 问题描述: 对接易通银行,他们的服务开放平台是java开发,而我的是php,现在需要php版本的SD...