在上一篇文章中,我们学习了对称和非对称加密的一些相关理论知识,也学习了使用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]??.??
