公钥加密与RSA
公钥加密与RSA
复习定位
对称加密要求通信双方共享同一密钥——但如何安全地交换密钥本身就是一个先有鸡还是先有蛋的问题。公钥加密解决了这个问题——每个人都有公钥和私钥——公钥可以公开给任何人——私钥自己保存不被泄露。其他人用你的公钥加密消息——只有你的私钥能解密。RSA是最早的公钥密码算法之一——安全性基于大整数分解的困难性。
非对称加密的核心概念
公钥加密(Public-Key Encryption)使用一个密钥对:公钥(Public Key)向全世界公开——任何人都可以用它加密消息——但只有拥有私钥(Private Key)的人才能解密。这一机制完美解决了对称加密的密钥分发问题——Alice不需要事先与Bob共享任何秘密——Alice用Bob的公钥加密消息——只有Bob能用他的私钥解密。
公钥加密的加解密比对称加密慢数千倍——在HTTPS的TLS握手阶段——客户端用服务器的公钥加密一个对称密钥(而不是直接加密整个网页的内容)发给服务器——以后双方都用对称密钥加密大数据量内容——性能和非对称安全性兼顾。
RSA算法
RSA是最著名和广泛使用的非对称加密算法——安全性基于大整数因式分解的困难——将两个大素数p,q相乘计算n=p×q很容易——但从n分解出p和q极其困难(对足够大的n,如2048位,在传统计算机上不可行)。
RSA密钥生成:
- 选择两个大素数p,q——计算n=p×q。
- 计算φ(n)=(p-1)(q-1) 欧拉函数。
- 选择整数e——满足1<e<φ(n)且e与φ(n)互质——常用e=65537。
- 计算d为e mod φ(n)的乘法逆元——即ed≡1 (mod φ(n))。
- 公钥=(e,n)——私钥=(d,n)。
加密:c = m^e mod n。解密:m = c^d mod n。
RSA 2048位密钥在传统计算机上是安全的——但在量子计算机上——Shor算法可以在多项式时间内分解大整数——如果大规模量子计算成为现实——RSA将不再安全——后量子密码(PQC, Lattice-Based)正在被标准化取代。
RSA与数字签名
数字签名使用私钥签名、公钥验证——过程与加密相反:
签名:
1. Alice计算消息m的哈希 H=sha256(m)
2. Alice用私钥加密哈希 S = H^d mod n
3. Alice发送(m, S)给Bob
验证:
1. Bob用Alice的公钥解密S H' = S^e mod n
2. Bob计算消息m的哈希 H = sha256(m)
3. 如果H==H'——签名有效——消息由Alice发出且未被篡改数字签名提供不可否认性——Alice不能否认她签名过的消息——因为只有她有私钥。
密钥分发与TLS
公钥非常好分发——但如何确信某个公钥确实是属于Bob而不是冒充者的?证书(SSL/TLS证书)解决了这个信任问题——证书认证中心CA验证Bob的身份后——用自己的私钥对Bob的公钥加上Bob的身份信息签名——形成Bob的证书。Alice收到Bob的证书后——用CA的公钥验证证书签名——如果有效——就从证书中提取Bob的真实公钥——现在Alice确信这个公钥属于Bob。证书——CA——浏览器内置的根证书共同构成了信任链——没有这个链——Alice无法判断她拿到的example.com:443传送的公钥确实是服务器的公钥还是一个中间人在握手过程中替换的假公钥。
复习检查
为什么对称加密的速度比非对称加密快得多——相差多少个数量级?实际HTTPS握手是如何结合两者的优点——使用对称加密数据用非对称加密交换对称密钥——从而优化性能和安全。
RSA的加解密运算过程——模幂运算(m^e mod n)中的指数e通常取65537——为什么选这个特定的数值?
数字签名和加密的密钥使用方式相反——加密使用公钥加密、私钥解密;签名使用私钥加密、公钥解密——在什么应用场景中用到签名(数字文件——法律上的效力——防篡改的检测)?
证书信任链——浏览器内置的根证书是怎么来的?如果中间人将自己的根证书安装到用户的信任存储——他可以对用户的HTTPS通信做什么?
HTTPS建立在TLS之上——RSA(或ECDHE)在TLS握手过程中如何交换出一个对称密钥?TLS 1.3相比之下在握手轮数上的改进?