8.4 构建一个小型 RSA 系统
第 8.3 节建立了三件工具:
RSA 把这些工具组装成一个。
本节故意使用很小的数字,让每一步都能看清。这种密钥只能用于教学,不具备任何实际安全性。
在传统的共享密钥系统中,发送方与接收方必须事先持有同一份秘密密钥。
公钥系统改用一对相互关联的密钥:
当实际参数足够大时,即使知道公钥,也不应当能够在可接受时间内重建私钥操作。
RSA 把一段消息表示为整数 m,并要求
其中 n 是公钥的一部分。
生成密钥之前,还需要定义一个新函数。
对正整数 n, φ(n) 统计集合
{1,2,…,n−1} 中与 n 互素的整数个数。
例如,小于 10 且与 10 互素的正整数为
1,3,7,9, 所以
φ(10)=4. 如果 p 是素数,那么从 1 到 p−1 的每个整数都与 p 互素。因此
φ(p)=p−1. 若 p,q 是两个不同的素数,则
φ(pq)=(p−1)(q−1). 可以从 1 到 pq 开始计数,再排除 p 或 q 的倍数。使用容斥原理得到
pq−q−p+1=(p−1)(q−1). 说明,若 gcd(m,n)=1,则
mφ(n)≡1(modn). 也就是说,一个与 n 互素的剩余经过 φ(n) 次幂后会回到 1。
RSA 会选择两个指数,使它们的乘积模 φ(n) 同余于 1。欧拉定理随后保证其中一个指数可以撤销另一个指数。
第 1 步:选择两个不同素数
选择
p=5,qquadq=11. 真实 RSA 会使用大得多、并且随机生成的素数。
第 2 步:构造模数
把两个素数相乘:
n=pq=5⋅11=55. 模数 n 同时属于公钥与私钥系统。
第 3 步:计算欧拉函数
因为 p,q 是不同素数,
φ(n)=(p−1)(q−1)=4⋅10=40. 第 4 步:选择公钥指数
选择整数 e,满足
1<e<φ(n) 以及
gcd(e,φ(n))=1. 这里选择
因为 gcd(3,40)=1,所以它是有效选择。
第 5 步:计算私钥指数
令 d 为 e 模 φ(n) 的逆元:
ed≡1(modφ(n)). 这里
3⋅27=81=2⋅40+1, 所以
最终得到
公钥 (n,e)=(55,3) 以及
私钥指数 d=27. 在真实系统中,素数与欧拉函数也必须保密,因为知道它们就能轻易重建 d。
把素数芯片装入小型 RSA 密钥机。工作台会拒绝重复素数或合数输入,把每个候选公钥指数与欧拉函数的关系显示出来,并让扩展欧几里得齿轮只在逆元证书有效时生成私钥指数。
给定公钥 (n,e),通过
c≡me(modn) 加密消息整数 m,其中 c 叫作。
令
因为 0≤7<55,所以它是有效消息块。使用公钥 (55,3) 加密:
c≡73=343≡13(mod55). 实际发送的密文为
通过
m′≡cd(modn) 解密。
对当前玩具密钥,
m′≡1327(mod55). 直接计算 1327 会产生没有必要的巨大整数。更好的方法是。
计算指数不断翻倍的幂:
1311321341381316≡13(mod55),≡4(mod55),≡16(mod55),≡36(mod55),≡31(mod55). 因为
27=16+8+2+1, 组合对应的各行:
1327≡31⋅36⋅4⋅13≡7(mod55). 所以
原消息成功恢复。
密钥等式
ed≡1(modφ(n)) 表示存在整数 k,使得
ed=1+kφ(n). 当消息 m 与 n 互素时,欧拉定理给出
med=m1+kφ(n)=m(mφ(n))k≡m⋅1k≡m(modn). 先加密再解密相当于把 m 提升到指数 ed,所以最终会回到原来的剩余。
上面的证明假设 gcd(m,n)=1。RSA 对两个不同素数乘积模数下的全部剩余也成立;完整证明会分别在模 p 和模 q 下检查同余,再通过中国剩余定理合并。本节的互素情况已经呈现了最核心的指数循环机制。
任何指数都可以写成若干个 2 的幂之和。重复平方只计算
m,m2,m4,m8,m16,… 这些必要的幂,并在每次乘法后模 n 取余。
对于指数 e,这种方法只需 O(loge) 个平方与乘法阶段,而不必把 m 连乘 e−1 次。这把模运算重新连接到了第 5 章的对数增长分析。
让数字消息依次通过公钥加密站与私钥解密站。实时指数阶梯会显示每一次平方与乘法得到的剩余;修改密文或替换私钥指数后,还能直接观察消息在哪一步无法恢复。
模数 55 可以立刻分解成 5⋅11。任何能分解 n 的人都可以计算 φ(n),再利用公开指数 e 重建 d。
真实 RSA 的安全性依赖经过严格生成的大素数和成熟的密码学实现。未经处理的教科书 RSA 具有确定性,并且容易受到多种攻击。安全应用会使用标准化的随机填充,例如用于加密的 RSA-OAEP,并依赖经过审查的密码库。
绝不能照搬本节的玩具算术来设计生产密码系统。本节的目标是展示数学机制,而不是给出安全软件规范。
RSA 密钥生成连接了素因数分解、欧拉函数、最大公约数与模逆元;加密和解密都是模幂运算,并通过重复平方变得可计算。
第 8 章建立了整数的算术结构:整除导向唯一素因数分解,欧几里得算法产生最大公约数与贝祖系数,同余构造有限剩余系统,中国剩余定理对齐多个系统,而 RSA 又把它们组合成公钥机制。
第 9 章将介绍离散概率。第 6 章的计数方法会用来定义概率,而模运算与密码学中的例子也会引出随机选择与不确定性。