一、公钥私钥
RSA 以它的三个发明者 Ron Rivest, Adi Shamir, Leonard Adleman 的名字首字母命名
非对称加解密,私钥和公钥到底是谁来加密,谁来解密
第一种用法:公钥加密,私钥解密。---用于加解密
第二种用法:私钥签名,公钥验签。---用于签名
有点混乱,不要去硬记,总结一下:
你只要想: 既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;
既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证。
同一种道理,我在换种说法:
私钥和公钥是一对,谁都可以加解密,只是谁加密谁解密是看情景来用的:
第一种情景是签名,使用私钥加密,公钥解密,用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改,但是不用来保证内容不被他人获得。
第二种情景是加密,,用公钥加密,私钥解密,用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。 比如加密情景: 如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据。最后再发给乙,这样确保了内容即不会被读取,也不会被篡改
二、公钥加密私钥解密
公钥加密
$path = ''; //公钥路径
$publicKey = file_get_contents($path);
openssl_public_encrypt("hello world", $crypted, $publicKey);
return base64_encode($crypted);
私钥解密
$path = ''; //私钥路径
$privateKey = file_get_contents($path);
$privateKey = openssl_pkey_get_private($privateKey);
openssl_private_decrypt(base64_decode($eb64_cry), $decrypted, $privateKey);
return $decrypted;
三、私钥加密公钥解密
私钥加密
$path = ''; //私钥路径
$privateKey = file_get_contents($path);
//从PEM文件中提取私钥
$res = openssl_get_privatekey($privateKey);
//对数据进行签名:最后一个参数可变化
openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA1);
//释放资源
openssl_free_key($res);
//对签名进行Base64编码,变为可读的字符串
return base64_encode($sign);
利用公钥和数字签名以及约定数据验证合法性
$path = ''; //公钥路径
$publicKey = file_get_contents($path);
$data = json_encode($data, JSON_UNESCAPED_UNICODE);
$res = openssl_get_publickey($publicKey);
$sign = base64_decode($sign);
$ret = openssl_verify($data, $sign, $res, OPENSSL_ALGO_SHA1);
if($ret == 1){
return true;
}else{
return false;
}