最近公司业务需要用到公钥和私钥,之前接触的很少,不是很了解,刚刚上网了解了下.发现很多地方都要用到加密.有对称加密算法( DES,AES)*[加密和解密都使用一个密钥]*和不对称加密算法(RSA).这里说的是RSA(非对称加密算法). RSA就涉及到公钥和私钥.
下面贴上php中使用公钥私钥加密解密的代码以及其中需要注意的地方: 首先公钥和私钥存放的方式有文件和字符串的形式.不过作为小白要注意的是,公钥私钥无论是放在文件中还是字符串里面,千万要记得分行.我刚开始一直不分行,然后就是老是出错,后来才知道要分行.而且不要忘了前后的注释行.-----BEGIN PUBLIC KEY----- 下面这段是错误的
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADxdfxfgcghCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNaoTcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbqOfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZScpBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----
复制代码
这段代码形式才是正确的
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCIgm80UzfD9lQ/tnASRCapNNao
TcodUfDzNYLWAxEMp8EtWkD4eZmWbMdaWKyShIOGS48NKdVGsAB+F4usW1VFtrbq
OfKgBUxMJKz1YcciBiV3kvhHZI4/jq94E0qy1jxTNdralRhe+0/JklopEM9QWZSc
pBT4IXBfbMJ3JD5doQIDAQAB
-----END PUBLIC KEY-----
复制代码
解决的公钥私钥的存放,然后就是代码中需要用到的加密解密了,加签解签了.其中用到的函数可以直接在php手册加密中查看http://php.net/manual/zh/refs.crypto.php 首先是公钥加密:这里用到的函数是openssl_public_encrypt(http://php.net/manual/zh/function.openssl-public-encrypt.php)
public function encrypt($data,$key_path){
$key = file_get_contents($key_path);
$encryptedList = array();
$step = 117;
$encryptedData = '';
$len = strlen($data);
for ($i = 0; $i < $len; $i += $step) {
$tmpData = substr($data, $i, $step);
$encrypted = '';
openssl_public_encrypt($tmpData, $encrypted, $key,OPENSSL_PKCS1_PADDING);
$encryptedList[] = ($encrypted);
}
$encryptedData = base64_encode(join('', $encryptedList));
return $encryptedData;
}
复制代码
用私钥解密(用到的函数openssl_private_decrypt)
private function decrypt($encryptedData){
if (empty($encryptedData)) {
return '';
}
$encryptedData = base64_decode($encryptedData);
$decryptedList = array();
$step = 128;
$len = strlen($encryptedData);
for ($i = 0; $i < $len; $i += $step) {
$data = substr($encryptedData, $i, $step);
$decrypted = '';
openssl_private_decrypt($data, $decrypted, file_get_contents($this->_key_pri), OPENSSL_PKCS1_PADDING);
$decryptedList[] = $decrypted;
}
return join('', $decryptedList);
复制代码
用私钥加签,用到的函数(openssl_get_privatekey)
private function rsa_sign($data){
//私钥加签
$res = openssl_get_privatekey(file_get_contents($this->_key_priva_mime));
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1);
openssl_free_key($res);
$sign = base64_encode($sign);
return $sign;
复制代码
公钥验签(openssl_get_publickey)
private function _rsaCheckSign($data, $sign){
$pubKey = file_get_contents($this->_key_pub_mime);
$res = openssl_get_publickey($pubKey);
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
openssl_free_key($res);
return $result;
}
复制代码
ps:如果是文件形式的公私钥,需要使用file_get_contents,括号中可以是地址.