前置共识
- 公钥加密的数据有且只有私钥能解
- 私钥加密的数据有且只有公钥能解
- 私钥无法推导出公钥,公钥也无法推导出私钥
- 数学上“p”和“q”是成对生成,如果把p公开,那么p就是公钥,同时自己留着的q就是私钥
https实现流程
- 以baidu为例,想实现一个https网站
- baidu.com自己生成公私钥,私钥自留,公钥提交给GlobalSign生成证书(GlobalSign拿自己的私钥对baidu的公钥加密)
- 客户端请求baidu,baidu把自己的公钥和证书给客户端
- 客户端操作系统已内置GlobalSign的公钥。故使用其公钥解密baidu给的证书,如果成功那么这个证书一定是baidu的
- 客户端随机生成个密码,再用baidu的公钥进行加密,发给baidu。
- baidu收到后,用自己的私钥把这个密码解出来。
- 之后客户端与baidu的报文 全用这个密码做
对称加密后传输。
CA
谁可以把自己的公钥预装到Windows,Linux,iOS,Android这种操作系统里,就可称作Certificate Authority, 比如上面说的GlobalSign
RSA推导流程
互质
如果2个数公约数只有1,那么这2个数互质
比如 p = 61, q = 53
欧拉
求 n = p * q
n = 61 * 53 = 3233
求欧拉n: 欧拉n = (p - 1) * (q - 1)
欧拉n = 60 * 52 = 3120
求e;要求 1 < e < 欧拉n 且 e 和 欧拉n 互质; 这样的数有很多,比如17
e = 17
求d;要求 e * d 取余 欧拉n = 1
转化公式: (欧拉n * x) + 1 = e * d 有2个未知数 d 和 x
代入数字 3120x + 1 = 17d 转化 3120x - 17d + 1 = 0 这个方程是一条直线,有无数个解
随便找一个比如 d = 2753, x = -15 验算 17 * 2753 % 3120 = 1
d = 2753
使用
以上有用的数为 n,e,d
比如用n和e加密 x: x ** e % n = y
那就可以用n和d解密 y: y ** d % n = x
也可以用n d组合加密;用n e组合解密
定义密钥对
钥匙A为: n和e 即 3233,17
钥匙B为: n和d 即 3233,2753
验证
钥匙A加密,B解密
加密 123 123 ** e % n = 123 ** 17 % 3233 = 855
解密 855 855 ** d % n = 855 ** 2753 % 3233 = 123
钥匙B加密,A解密
加密 99 99 ** d % n = 99 ** 2753 % 3233 = 89
解密 89 89 ** e % n = 89 ** 17 % 3233 = 99