当前位置: 首页 > 后端技术 > PHP

PHP之OpenSSL加密延伸学习(二):非对称加密

时间:2023-03-29 23:38:12 PHP

在上一篇文章中,我们学习了对称和非对称加密的一些相关理论知识,也学习了使用OpenSSL进行对称加密的操作。今天,我们就更进一步,学习一下OpenSSL中的非对称加密是如何实现的。生成私钥通过前面的学习,我们知道非对称加密分别需要公钥和私钥。我们先生成一个私钥,就是我们这边保存的密钥。请记住,任何时候,私钥都不能给别人!$config=array("private_key_bits"=>4096,//指定应该使用多少位来生成私钥);$res=openssl_pkey_new($config);//根据配置信息生成私钥openssl_pkey_export($res,$privateKey);//将一个密匙的可输出表示转换为字符串var_dump($privateKey);//-----BEGINPRIVATEKEY-----//MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDFMLW+9t3fNX4C//YBuV0ILSyPAdSYVXtE4CLv32OvNk9yQZgF2nL/ZuIbBGRcYo2Hf5B31doGrAFDGu//NoTR+WA7CBjKROFr/+yValsMFIeiKNtttWMkmBciysDJoEoyd6wjDD+kcHQdoJVo//...//-----ENDPRIVATEKEY-----一个很简单的函数openssl_pkey_new(),接收一个参数,参数是可配置的,可选的。生成的结果是一个私钥句柄,这不是我们可以直接读取的,所以我们再使用openssl_pkey_export()来提取可导出的字符串。评论里的内容是我们生成的私钥信息,私钥信息一般比较多,后面的内容就省略了。提取公钥下一步是生成公钥??。实际上,公钥是从私钥中提取出来的。所以我们在使用加解密的时候,可以使用私钥或者公钥进行互操作。$publicKey=openssl_pkey_get_details($res);//提取公钥信息var_dump($publicKey);//array(4){//["bits"]=>//int(4096)//["key"]=>//string(800)"-----BEGINPUBLICKEY-----//MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtOIImDdS0W0vAr5Ra1+E//hR2AJwQQwxntYKgTku8EmJRBX2vU+x8th8W8SnoGiVM/sOItG0HIe4Egf1UxoZHt//gI6r+jpAp7JbTN0sD/VTPDE09F21+hFGjIVBqrkcLPjuEbf7+tjmgAx8cG8WLGId//G8Hsub70kRANKJe1bCXIBUggRFk0sQGllxA/hxiG5wANqHTrdpJgJba+ahSi2+4H//UWnyCV1O3AaPyz6a12HNUsG4Eio/tWv/hOB9POt6nAqwPHuIbhp56i5bv1ijMJZM//jwRen5f/kwdZ01Ig2fi0uBoTR2y/EEaus7xBYpF/gGzZ/uM7cNUXcDyG5YluM/4R//MEv4msPMVGB72izItED+C6Cqftxl98iBFRDc+PISFbRSgOU/HsuBhKkM5SYzyi3I//Ypaej25++qLPqcA+EDr3JNDhNZ0GOhofCRtPq4dsr7iLLLRnZ0TnhIYe9wAbmO49//uthABNBkM54bG+omOfY4Bkn5n39CKpELbhIiXgOd+lA684XUS/2Aw3Dvelc9Gbag//oIFvb/wljPYsd0Zmd64CXBpTWbfwXC8K4vCKvFLjytcz2Yp4T6fVjbLT5RA6u8su//E0WwE4QTFNKhnM5OvfiMN+NMc3Y/esVfcin3eyvotdz4N6Tt45dkybkf6aQE3Scg//E/JBLIEEA+gjGTveY4cNUiECAwEAAQ==//-----结束公钥-----//"//["rsa"]=>//......$publicKey=$publicKey['key'];useopenssl_pkey_get_details()包含了很多内容,但是我们最需要的内容是key下面的公钥,我们回过头来好好看看公钥和私钥的内容是不是和我们申请的HTTPS证书?.com里面的公钥和私钥的内容看起来是一样的,和系统中openssl命令行生成的本地密钥证书也是一样的,它们是同一个东西HTTPS证书除了非对称加密密钥外,还包含CA信息,如果CA失效,浏览器也会认为证书无效,因此不允许使用自己生成的证书为HTTPS证书,自己生成的一般用于SSH免密登录,或者GitHub的免密码代码仓库操作。对数据进行加解密后,生成了公钥和私钥,接下来我们要进行最重要的加密和解密就完成了。$data='测试非对称加密';//公钥加密数据openssl_public_encrypt($data,$encrypted,$publicKey);var_dump($encrypted);//string(512)"??E??2??~?\d????q??O??=(??Y????3L????0??,??J????s??V??VOUTG~'??20????@??6??d????#Z]??.????1??a??r?????D????????@??S??>??t|??????z~K?,??y?G弬?//yXZ?L#??c`rj睅,nX??@{7?:?qy??nv?o§?@?@,?n&???I??~???z6????oe!8,T????;???6??J@A??f????S]??!????2??b??+O???o?B?N?WM!TN?c?F?/??,5??|????%??c~O)"//??>??)y.fn??q??}//??`//z??{??_D??s`????|y??,g>R??D??%??//??g?0?@Λ|??|z}??bZI2,????~Q_????I??LW~????G&??f??|eq??s??D????L????bC'D??~8:??Z????\??9]C??Kd~F96??S??0??y>??(T??S}??1????T//??!??!!?????