RSA加密简介:
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新手对它不太了解。下面仅作简要介绍。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。RSA的安全基于大数分解的难度。其公钥和私钥是一对大素数(100到200位十进制数或更大)的函数。从一个公钥和密文恢复出明文的难度,等价于分解两个大素数之积(这是公认的数学难题)。
特点:
公钥、私钥都可以加密,也都可以解密。
1. 加密,其中:用公钥加密需要私钥解密,称为“加密”。由于私钥是不公开的,确保了内容的保密,没有私钥无法获得内容;
2. 签名, 用私钥加密需要公钥解密,称为“签名”。由于公钥是公开的,任何人都可以解密内容,但只能用发布者的公钥解密,验证了内容是该发布者发出的。
3. 公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。
场景:
进行支付、真实信息验证等安全性需求较高的通信
与其他第三方或合作伙伴进行重要的数据传输
问题:
RSA公钥和私钥是否可以任意公开一个保密一个,不可以,RSA公钥和私钥的位置是不对等的。通过RSA私钥很容易导出RSA公钥,但是通过RSA公钥无法导出RSA私钥。因为私钥保存了n,d之外还有q p信息所以能计算出公钥,但是公钥只有n,e信息。
所以不要轻易告诉别人私钥,但是可以告诉别人公钥。当你告诉别人公钥,让人家用公钥加密,你用私钥解密,这个过程叫“加密” 知道你的暗号的那个人,可以偷偷传一句话给你,旁听者听不懂,只有你听得懂。 当你用私钥加密一个数据,让别人用公钥解密,这个过程也就是签名(你手写的字才有效)。拿着公钥的那个人,可以验证这是你传来的信息。
问题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 ); ?>