公钥与私钥的产生
From wiki RSA加密算法:
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人消息。她可以用以下的方式来产生一个公钥和一个私钥:
- 随意选择两个大的质数 p 和 q, p不等于 q,计算 N=pq。
- 根据欧拉函数,求得
- 选择一个小于 r 的整数 e,使 e 与 r 互质。并求得 e 关于 r 的模反元素,命名为 d(求 d令 )。(模反元素存在,当且仅当 e 与 r 互质)
- 将 p 和 q 的记录销毁。
(N,e)是公钥,(N,d)是私钥。Alice将她的公钥 (N,e)传给Bob,而将她的私钥 (N,d)藏起来。
加密、解密
加密计算公式:
解密计算公式:
n 为等待加密数据, c 为加密后数据。
对于上面不认识的符号≡请看 同余
基础
上面是 RSA 所涉及到的数学基础。 慢慢啃吧,啃着啃着你就入门了,啃着啃着啃着你就放弃了。
先是看看 深入浅出密码学, 咦~好多数学基础,好吧,继续看看 数论概论,咦~我想干什么来着?
由加密公式怎么推导出解密公式呢?
加密公式
c ≡ n^e (mod N)
同余 有以下性质
a ≡ b (mod m) ------------> a^n ≡ b^n (mod m)
所以加密公式可以变形为
(1). c^d ≡ n^ed (mod N)
已知 ed ≡ (1 mod r), 即 ed = 1 + hφ(N)
(2). n^ed = n^(1 + hφ(N)) = n * (n^φ(N))^h
把(2)代入(1)得
n^ed (mod N) ≡ n * (n^φ(N))^h (mod N)
由欧拉定理 n^φ(N) ≡ 1 (mod N) 得
n * (n^φ(N))^h (mod N) ≡ n * 1^h (mod N) ≡ n (mod N)
上面懵逼了吧,相关关键字 模约简
最后
c^d ≡ n (mod N)
RSA的应用:数字证书
什么是数字证书?
我们先来看看 RSA 的逆向过程, 我们假设 c 为等待加密数据, n 为加密后数据。
根据:
‘解密’公式:
‘加密’公式:
得到:
签名公式: n ≡ c^d (mod N)
验证公式: c ≡ n^e (mod N)
我们把‘解密’叫做签名,‘加密’叫做验证, c 为待签名数据, n 为签名后数据。
实际操作一般如下:
1.signature: (N, d)
c = hash(data)
n = sign© = c^d (mod N)
(n 就是签名)
2.send (data,n)
3.check: (N, e)
c = hash(data)
c == check(n) = n^e (mod N)
私钥永远是私有的,用私钥签名的数据只有对应的公钥才能校验成功,所以上面的过程可以用以校验你的数据是否被修改。
你的公钥在传输过程中可能被替换掉,那么剩下的问题就是如何证明你的公钥就是你的公钥呢?
CA(Certificate Authority)的工作就是证明你的公钥就是你的公钥, CA 的工作原理也是应用 RSA 的逆向过程,CA 也有公钥密钥。
数字证书:包含了公钥信息、拥有者身份信息(主体)、以及数字证书认证机构(发行者)对这份文件的数字签名,以保证这个文件的整体内容正确无误
数字证书、CA、HTTPS:
服务器创建公钥私钥,然后去 CA 申请数字证书,其实就是把服务器的公钥与一些其他信息发送给 CA,CA 用她的私钥给你签名。
浏览器已安装了 CA 的公钥。
https 连接的建立: 服务器发送证书给浏览器,浏览器用 CA 的公钥验证证书,即证明你的公钥就是你的公钥。
最后
Amazing math!!!
万变不离其中,你看认识 RSA 后你可以了解到那么多扩展知识。