工作中用到了非对称加密:RSA加解密及签名验证,根据查到的信息及工作中的问题总结,现在整理如下:
1. 准备好公钥和私钥,使用openssl工具生成RSA公钥和私钥对
1)生成RSA私钥:
genrsa -out rsa_private_key.pem 1024
该命令会生成1024位的私钥,可以在当前路径下看到rsa_private_key.pem文件。
2)把RSA私钥转换成PKCS8格式
输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt,并回车
得到生成功的结果,这个结果就是PKCS8格式的私钥,这个将密钥转换为PKCS8格式格式的只用在java语言中,PHP中不需要使用
3) 生成RSA公钥
输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem,并回车,
得到生成成功的结果,此时,我们可以看到一个文件名为rsa_public_key.pem的文件,打开它,可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的字符串,这个就是公钥。
2. RSA加密解密,项目中加解密使用的公私钥可能不同,但思路都是一样,以下贴出我加解密的方法及需要注意的问题:
<?php
/**
* RSA私钥加密,使用规定的私钥进行加密
* @param $data array 需要加密的数据,加密数据的格式是json还是其他格式字串需要根据项目需求来确定
* @return $encrypted String 加密后的数据
*/
public function rsaPrivateEncrypt($data){
// $pi_key = key($this->_shangmei_privateKey, 'private'); // 私钥,调用key()函数拼接正确格式私钥字串,并验证私钥可用
$pri_key = file_get_contents('./Public/RSA/rsa_private_key.pem'); // 私钥,直接读取私钥文件,获取私钥
$pi_key = openssl_pkey_get_private($pri_key); // 获取私钥,这个函数可用来判断公钥是否是可用的,必须要有
$encrypted = '';
$data = json_encode($data);
//注意:最大允许加密长度为117,加密数据