RSA加密简介:php
RSA加密算法是最经常使用的非对称加密算法,CFCA在证书服务中离不了它。可是有很多新手对它不太了解。下面仅做简要介绍。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深刻的密码分析,虽然密码分析者既不能证实也不可否定RSA的安全性,但这偏偏说明该算法有必定的可信性,目前它已经成为最流行的公开密钥算法。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。java
特色:
公钥、私钥均可以加密,也均可以解密。算法
加密,其中:用公钥加密须要私钥解密,称为“加密”。因为私钥是不公开的,确保了内容的保密,没有私钥没法得到内容;安全
签名, 用私钥加密须要公钥解密,称为“签名”。因为公钥是公开的,任何人均可以解密内容,但只能用发布者的公钥解密,验证了内容是该发布者发出的。ide
场景:函数
进行支付、真实信息验证等安全性需求较高的通讯工具
与其余第三方或合做伙伴进行重要的数据传输加密
问题:
RSA公钥和私钥是否能够任意公开一个保密一个,不能够,RSA公钥和私钥的位置是不对等的。经过RSA私钥很容易导出RSA公钥,可是经过RSA公钥没法导出RSA私钥。由于私钥保存了n,d以外还有q p信息因此能计算出公钥,可是公钥只有n,e信息。code
因此不要轻易告诉别人私钥,可是能够告诉别人公钥。当你告诉别人公钥,让人家用公钥加密,你用私钥解密,这个过程叫“加密” 知道你的暗号的那我的,能够偷偷传一句话给你,旁听者听不懂,只有你听得懂。 当你用私钥加密一个数据,让别人用公钥解密,这个过程也就是签名(你手写的字才有效)。拿着公钥的那我的,能够验证这是你传来的信息。orm
问题2:
能够公钥私钥是一对多么
答案:1对1
私钥:握在本身手里,不给别人的。
公钥:能够交给别人的。
交互过程例子来解释公钥私钥
张三是个有私钥和公钥的人,李四没有,王五没有。
场景1:
张三将他的公开密钥传送给李四。
李四用张三的公开密钥加密他的消息“咱们明天去酒吧喝酒”,而后传送给李四(一段加密串¥……Q&#Q&^%&^!%&%*]])。
张三用他的私人密钥解密李四的消息。看明白了,不是乱语,是“咱们明天去酒吧喝酒”。
上面的过程叫加密(李四将信息加密传给张三)
场景2:
张三如今用私钥加密一句话 “明晚8:00准时到” 传给李四
李四收到了,用公钥解密
这个过程叫签名(张三签名是本身发出的,不是被人冒充的)
场景3:
张三明天给王五这个公钥,那么王五也能够传一个信息给张三
王五说“明天晚上来家里打麻将”
张三用私钥解密 , 王五和我说“明天晚上来家里打麻将”
这个过程也是加密(王五将信息加密传给张三)
公钥和私钥,简单理解就是:既然是加密,那确定是不但愿别人知道个人消息,因此只能我才能解密,因此可得出:公钥负责加密,私钥负责解密;同理,既然是签名,那确定是不但愿有人冒充个人身份,只有我才能发布这个数字签名,因此可得出:私钥负责签名,公钥负责验证。
如何生成私钥
用openssl这个工具
安装
apt-get install openssl
生成
openssl genrsa -out rsa_private_key.pem 1024
如何生成公钥
将原始 RSA 私钥转换为 pkcs8 格式
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
生成 RSA 公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
php例子,李四用张三的公钥加密了一句话给张三。
<?php
/*
*/
error_reporting(E_ALL);
echo '<meta charset="utf-8">';
// 公钥 $publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/qtdtnjxoKndOhsfqSNSM8HKV
1WI8MMQvDE1M8IUo+YCtu6hqLprVAIxwhZOHkH0ezY/3pcQM0h7BeeE5RBsg5K6n
HfWmUP3F/cs0m32STlAj60WBboIHvxYFn499xWeG37u08P+/HtAi8Pqc/kKJd8nk
DsuXmxdaOFmRX0bIrQIDAQAB
-----END PUBLIC KEY-----';
// 私钥
$privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC/qtdtnjxoKndOhsfqSNSM8HKV1WI8MMQvDE1M8IUo+YCtu6hq
LprVAIxwhZOHkH0ezY/3pcQM0h7BeeE5RBsg5K6nHfWmUP3F/cs0m32STlAj60WB
boIHvxYFn499xWeG37u08P+/HtAi8Pqc/kKJd8nkDsuXmxdaOFmRX0bIrQIDAQAB
AoGAcSPJ8x07D0oyDxqkm/nN7jxph2Tkjh9DT3p1jvtTv3I4sVVa/wLvxtiCDlHr
WlTCZxJ073zck6zdFtx5RLKdR/Hw9RpMHcN3FkjmDMjXoR2ZtlucMbCVCyubSOr0
xGjaKUoQtzIVjCubxGOVcC16I2MxN2c4zBL+RmA4yc6tEMECQQDepBI5cEsOQLyx
DH7pHAWLT6qt6poxw/IqvUVozh3LSiF7VvNQnVvhNJPwMHmw+nWv83fjyYZeJBHK
rDPlv1ypAkEA3GK0ecmpIwW1xnnguve5l8xQz9w5igPzxgpKrKO07vemSz9cHE9J
yFW4AjhYaCwo0KlC9xz90vbLV+lbraeqZQJAU67FrtM3UtcgVUfGF+ZRayh5lb8d
T+E/j7LueNMoPbXSWeK3t7A9zasOg/QkeVHalFTl1jd0CsRx74TESPGhaQJBALeL
5W+BCsLGYKwamZZd9057tdpIOgu+WurXa3X5KhnUW8VT0a0qQ/L7oTMIJmksThnq
voD8vlFTheuDyP0KJRkCQDwzAk61+cTWbfYeOfZpfON2LVV6I1nuLTT8DdDSBCFf
yFJNUji+YdAKkSK697Kp8O2JEkWzse0ePPjsQvFmE0Q=
-----END RSA PRIVATE KEY-----';
// 待加密的字符串数据
$data = '咱们明天去酒吧喝酒';
// 为避免乱码,我先进行base64 ecode
$data = base64_encode($data);
// 加密方用公钥加密 openssl_public_encrypt($data, $encrypted, $publicKey); // 解密方用私钥钥解密 openssl_private_decrypt($encrypted, $decrypted, $privateKey); // 进行base64 decode 获得原字符串 $originData = base64_decode($decrypted); print_r( $originData );
?>