摘要:与对称加密不同的是,非对称加密和解密使用的是不同的密钥,其中一个对外公开作为公钥,另一个只有所有者拥有,称为私钥。中提供基于算法的扩展可实现对数据的非对称加密。
与对称加密不同的是,非对称加密和解密使用的是不同的密钥,其中一个对外公开作为公钥,另一个只有所有者拥有,称为私钥。用私钥加密的信息只有公钥才能解开,或者反之用弓腰加密的信息只有私钥才能解开。常用的非对称加密有RSA算法,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。PHP中提供基于RSA算法的openssl扩展可实现对数据的非对称加密。
在RSA加解密之前,需要先生成一对公私钥,可使用linux自带的RSA密钥生成工具openssl获取一对公私钥,也可使用php openssl扩展函数生成一对公私钥。使用linux生成一对公私钥执行以下命令即可:
bash-3.2# openssl genrsa -out rsa_private_key.pem 1024
bash-3.2# openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
bash-3.2# openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android ios 桌面程序等客户端。
笔者生成的一对公私钥如下:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFa
J1epFQXBmOsSWBKoXF5haWM6d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOT
gHvIceb5GHGBqqMawTjI71P69DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXn
PAN9jy20h+TfcXvDgwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFaJ1epFQXBmOsSWBKoXF5haWM6
d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOTgHvIceb5GHGBqqMawTjI71P6
9DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXnPAN9jy20h+TfcXvDgwIDAQAB
AoGAEkfZJp9sCrGy8dJOF2/l8It2HsGhvt7+k2pqPHNpLvDWOcDUPdsWJlT9QvI+
jbF++v3XCzMTfjqM32pAxiQXMfEDcF26wkZtB8E+QVtV0rR9I1OP0wTtfw1tWkd5
cEgfoIrEhaADrxDtLOSDJfDKTKB72H98Lu3iV2iF6igFnQECQQDfLv6eFbH1wmn1
yGq3mR5z1f2yGdSngcgcC53qW8gl6GjjXlyzepz3o+wQ2fk1sLQ+xVGRy7UQHszl
PIDIVaaBAkEA2oL4kQW8jtB+b086ItINyw08x8jCf6Wcmw/SUytdNAGFy8csifwD
FweY9mxH0Cy/ynF3NA+2LQZO0Bz2/DLQAwJAI1lCIq+0/APK3I7duC6cUCR4hhjp
QY6grzB31oKq9LYWxsxPSm4FJoPkA9dCTWqrYbXG8ZyeFOuL8FLg4toOAQJBAIjE
iUhcStUo8rpA4KaCy1dYhb6WjgbPZeI4WPDtp3yxp0kQ9XO4ZUa43qj+xUQrfi/8
LRxM6T3tQM9KEd1xAHkCQGR8bklYgPvgT6Aep/Nq7NZq24N3NC7FY8YxZ85rKpTl
Tnm0UJ8WBNg43uztQ4MJ1IFSwVEOlUVm5VYvV+IIunM=
-----END RSA PRIVATE KEY——
使用PHP生成公私钥的代码如下:
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// 创建公私钥
$res = openssl_pkey_new($config);
// 获得私钥 $privKey
openssl_pkey_export($res, $privKey);
// 获得公钥 $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$data = "hello";
// 私钥加密
openssl_private_encrypt($data, $encrypted ,$privKey);
// 公钥解密
openssl_public_decrypt($encrypted, $decrypted, $pubKey);
echo $decrypted;
使用非对称加解密的示例代码如下:
$private_key_path = "rsa_private_key.pem";
$public_key_path = "rsa_public_key.pem";
$private_key = file_get_contents($private_key_path);
$public_key = file_get_contents($public_key_path);
//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id,不可用返回false
$pi_key = openssl_pkey_get_private($private_key);
//这个函数可用来判断公钥是否是可用的,同上
$pu_key = openssl_pkey_get_public($public_key);
$data = "hello";//原始数据
$encrypted = "";
$decrypted = "";
//私钥加密,也可使用openssl_public_encrypt公钥加密,然后使用openssl_private_decrypt解密,加密后数据在$encrypted
openssl_private_encrypt($data,$encrypted,$pi_key);
//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
$encrypted = base64_encode($encrypted);
//私钥加密的内容通过公钥可解密出来,公钥加密的可用私钥解密。不能混淆
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);
echo $decrypted; // hello
//私钥加密
openssl_private_encrypt($data,$encrypted,$pi_key);
$encrypted = base64_encode($encrypted);
//公钥解密
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);
echo $decrypted; //hello
?>
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。如果既想有很快的加密速度又想保证数据比对称加密更加安全,可使用混合加密,即对数据进行对称加密,对密钥做非对称加密,因为一般秘钥的长度会小于数据的长度。解密的时候先用非对称加密得到密钥,再用密钥解开密文得到明文。
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
本文节选自 《php7实践指南》 陈小龙著
微信扫一扫,发现更多内容
开启赞赏
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22523.html
摘要:非对称加密,加密与解密使用的密钥不是同一密钥,对中一个对外公开,称为公钥,另一个只有所有者知道,称为私钥。对称加密算法不能实现签名,因此签名只能非对称算法。正因为,这种加密是单向的,所以被称为非对称加密算法。 非对称加密,加密与解密使用的密钥不是同一密钥,对中一个对外公开,称为公钥,另一个只有所有者知道,称为私钥。用公钥加密的信息只有私钥才能解开,反之,用私钥加密的信息只有公钥才能解开...
摘要:二如何理解公钥和私钥非对称加密算法需要两个密钥公开密钥和私有密钥。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。三非对称加密解密原理非对称加密算法中,常用的就是算法了,以下就以算法为例来讲解非对称加密算法的实现原理。 非对称加密,在现在网络应用中,有这非常广泛的场景,更是加密货币的基础。本文主要介绍非对称加密、解密的原理和过程,以及在区块链中的使用。 一、非对称...
摘要:加密方式一般分为两种对称加密和非对称加密。非对称加密在非对称加密中,加密和解密过程中使用两个不相同的密钥。这个由权威部门颁发的称为证书。正是通过这种层层授信背书的形式,保证了非对称加密模式的争吵运转。是的,协议的思路就是这样的。 系列文章传送门: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换...
摘要:前言总括原文博客地址协议之数据加密过程详解知乎专栏简书专题前端进击者知乎前端进击者简书博主博客地址的个人博客生活只要你听过,不可能没听过协议吧,协议是一种安全协议。 前言 总括: 原文博客地址:SSL协议之数据加密过程详解 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 生活 SSL 只要你听过HTTPS,不可能没听过...
阅读 1562·2019-08-30 13:18
阅读 1547·2019-08-29 12:19
阅读 2075·2019-08-26 13:57
阅读 4106·2019-08-26 13:22
阅读 1163·2019-08-26 10:35
阅读 2969·2019-08-23 18:09
阅读 2481·2019-08-23 17:19
阅读 662·2019-08-23 17:18