https如何保证安全

369 阅读2分钟

前置共识

  1. 公钥加密的数据有且只有私钥能解
  2. 私钥加密的数据有且只有公钥能解
  3. 私钥无法推导出公钥,公钥也无法推导出私钥
  4. 数学上“p”和“q”是成对生成,如果把p公开,那么p就是公钥,同时自己留着的q就是私钥

https实现流程

  1. 以baidu为例,想实现一个https网站
  2. baidu.com自己生成公私钥,私钥自留,公钥提交给GlobalSign生成证书(GlobalSign拿自己的私钥对baidu的公钥加密)
  3. 客户端请求baidu,baidu把自己的公钥和证书给客户端
  4. 客户端操作系统已内置GlobalSign的公钥。故使用其公钥解密baidu给的证书,如果成功那么这个证书一定是baidu的
  5. 客户端随机生成个密码,再用baidu的公钥进行加密,发给baidu。
  6. baidu收到后,用自己的私钥把这个密码解出来。
  7. 之后客户端与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 < 欧拉ne 和 欧拉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