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例子,李四用张三的公钥加密了一句话给张三。

/*

*/
error_reporting(E_ALL);
echo '';

    // 公钥
$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 );

?>

https://java-er.com/blog/php-rsa-encrypt/