加密过程#
甲向乙发送信息“中”。首先,汉字“中”通过 UTF-8 编码为 [e4 b8 ad],转换为 10 进制为 [228, 184, 173]。
使用乙的公钥 (n,e)=(4757,101) 进行加密。由于被加密的数字必须小于 n,我们将“中”字拆分为三个字节 [228, 184, 173],分别加密。
假设 a 为明文, b 为密文,加密公式如下:
ae(modn)=b对 [228, 184, 173] 的加密计算如下:
228101(mod4757)=4296184101(mod4757)=2458173101(mod4757)=3263加密后的密文为 [4296, 2458, 3263]。没有私钥,无法从中解密出原始字节。
解密过程#
乙收到密文 [4296, 2458, 3263],并用自己的私钥 (n,d)=(4757,1601) 进行解密。
解密公式如下:
bd(modn)=a解密计算如下:
42961601(mod4757)=22824581601(mod4757)=18432631601(mod4757)=173解密后得到 [228, 184, 173],再按 UTF-8 解码为汉字“中”,解密完成。
密钥对的生成过程#
1. 选择两个质数 P 和 Q#
P 和 Q 越大,安全性越高。
例如 P=67,Q=71。
计算 n=P×Q=4757。
n 的二进制表示为 1001010010101,共 13 位。实际应用中常使用 1024 位或 2048 位。
2. 计算 n 的欧拉函数 ϕ(n)#
ϕ(n) 表示小于 n 且与 n 互质的正整数的个数。对于 n=P×Q(P,Q 为质数),有:
ϕ(n)=(P−1)(Q−1)本例中 ϕ(n)=(67−1)(71−1)=66×70=4620。记 m=ϕ(n)=4620。
3. 随机选择整数 e#
条件是 1<e<m,且 e 与 m 互质(即 gcd(e,m)=1)。
随机选择 e=101。(注意 e=m−1=4619)。
4. 找到整数 d#
d 必须满足 (e×d)(modm)=1。
这等价于求解二元一次方程:
e×x−m×y=1代入 e=101,m=4620:
101x−4620y=1使用扩展欧几里得算法求解,得到 (x,y)=(1601,35)。
因此 d=1601。
至此,密钥对生成完毕。不同的 e 会生成不同的 d,从而生成不同的密钥对。
RSA 的核心基于以下数学原理:
aed≡a(modϕ(n))同时,在密钥选择中需要满足不出现以下情况:
e2≡1(modϕ(n))