公钥加密与签名算法计算详解(含计算题例子)
一、RSA 加密算法
密钥生成:
- 选两个大素数 p 和 q
- 计算 n = p × q
- 计算 φ(n) = (p-1)(q-1)
- 选整数 e 满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1
- 计算 d 满足 d × e ≡ 1 mod φ(n)
公钥:(e, n)
私钥:(d, n)
加密:
c ≡ mᵉ mod n
解密:
m ≡ cᵈ mod n
手算示例:
p = 3, q = 11
n = 33
φ(n) = 20
e = 3 (满足 gcd(3,20)=1)
d = 7 (3×7=21≡1 mod20)加密 m=5:
c = 5³ mod 33 = 125 mod 33 = 26解密 c=26:
m = 26⁷ mod 33
26² = 676 ≡ 16 mod 33
26⁴ = (26²)² ≡ 16² = 256 ≡ 25 mod 33
26⁶ = 26⁴ × 26² ≡ 25×16 = 400 ≡ 4 mod 33
26⁷ = 26⁶ × 26 ≡ 4×26 = 104 ≡ 5 mod 33 → 解密成功
二、ElGamal 加密算法
密钥生成:
- 选大素数 p 和生成元 g
- 选私钥 x (1 < x < p-1)
- 计算公钥 y ≡ gˣ mod p
公钥:(p, g, y)
私钥:x
加密:
- 选随机数 k
- 计算 c₁ ≡ gᵏ mod p
- 计算 c₂ ≡ m × yᵏ mod p
密文:(c₁, c₂)
解密:
m ≡ c₂ × (c₁ˣ)⁻¹ mod p
手算示例:
p=23, g=5, x=6
y = 5⁶ mod 23 = 15625 mod 23 = 8加密 m=10 (k=3):
c₁ = 5³ mod 23 = 125 mod 23 = 10
c₂ = 10×8³ mod 23 = 10×512 mod 23 = 10×6 = 60 ≡ 14 mod 23
密文:(10,14)解密:
c₁ˣ = 10⁶ mod 23
10²=100≡8, 10⁴=(10²)²≡8²=64≡18, 10⁶=10⁴×10²≡18×8=144≡6 mod 23
m = 14×6⁻¹ mod 23
6⁻¹=4 (6×4=24≡1) → 14×4=56≡10 mod 23 → 解密成功
三、椭圆曲线加密(ECC)
密钥生成:
- 选椭圆曲线 E 和基点 G
- 选私钥 n B n_B nB(整数)
- 计算公钥 P B = n B × G P_B = n_B×G PB=nB×G
公钥:( E , G , P B E,G,P_B E,G,PB)
私钥: n B n_B nB
加密:
- 在椭圆群中选择一点 P t = ( x t , y t ) P_t=(x_t,y_t) Pt=(xt,yt)
- 选取一个随机数 k k k,计算点 P 1 : P 1 = ( x 1 , y 1 ) = k G P_1:P_1=(x_1,y_1)=kG P1:P1=(x1,y1)=kG
- 计算 P 2 = ( x 2 , y 2 ) = k P B P_2 = (x_2,y_2)=kP_B P2=(x2,y2)=kPB
- 计算 C = m x t + y t C = mx_t + y_t C=mxt+yt
密文:( k G , P t + k P B , C kG,P_t+kP_B,C kG,Pt+kPB,C)
解密:
P t = P t + k P B − n B ( k G ) = P t + k ( n B G ) − n B ( k G ) P_t=P_t+kP_B-n_B(kG)=P_t+k(n_BG)-n_B(kG) Pt=Pt+kPB−nB(kG)=Pt+k(nBG)−nB(kG)
m = ( C − y t ) / x t m=(C-y_t)/x_t m=(C−yt)/xt
手算示例(在曲线 y 2 = x + 13 x 3 + 22 ( m o d 23 ) y^2=x+13x^3+22 (mod 23) y2=x+13x3+22(mod23)):
取 p = 23 , a = 13 , b = 2 p=23,a=13,b=2 p=23,a=13,b=2,取生成元 G = ( 10 , 5 ) G=(10,5) G=(10,5)
私钥为 n B = 7 n_B=7 nB=7,明文为 m = 15 m=15 m=15, P t = ( 11 , 1 ) P_t=(11,1) Pt=(11,1)
加密:
选取随机数 k = 13 k=13 k=13,则得
P 1 = k G = 13 ( 10 , 5 ) = ( 16 , 5 ) P_1=kG=13(10,5)=(16,5) P1=kG=13(10,5)=(16,5)
P 2 = k P B = 13 ( 17 , 21 ) = ( 20 , 18 ) P_2=kP_B=13(17,21)=(20,18) P2=kPB=13(17,21)=(20,18)
P t + k P B = ( 11 , 1 ) + ( 20 , 18 ) = ( 18 , 19 ) P_t+kP_B=(11,1)+(20,18)=(18,19) Pt+kPB=(11,1)+(20,18)=(18,19)
C = m x t + y t = 15 × 11 + 1 ( m o d 23 ) = 5 C=mx_t+y_t=15×11+1(mod 23)=5 C=mxt+yt=15×11+1(mod23)=5
因此, C m = { ( 16 , 5 ) , ( 18 , 19 ) , 5 } C_m=\{(16,5),(18,19),5\} Cm={(16,5),(18,19),5}
解密:
P t = P t + k P B − n B ( k G ) = ( 18 , 19 ) − 7 ( 16 , 5 ) = ( 11 , 1 ) P_t=P_t+kP_B-n_B(kG)=(18,19)-7(16,5)=(11,1) Pt=Pt+kPB−nB(kG)=(18,19)−7(16,5)=(11,1)
m = ( C − y t ) / x t = ( 5 − 1 ) / 11 ( m o d 23 ) = 15 m=(C-y_t)/x_t=(5-1)/11(mod 23)=15 m=(C−yt)/xt=(5−1)/11(mod23)=15
四、RSA 签名
设代签名的消息为m
,利用Hash
函数计算信息摘要h(m)
签名:
s ≡ h(m)ᵈ mod n
签名信息(s,m)
验证:
计算h(m)
h(m) ≡ sᵉ mod n
手算示例(接RSA加密参数):
p = 3, q = 11
n = 33
φ(n) = 20
e = 3 (满足 gcd(3,20)=1)
d = 7 (3×7=21≡1 mod20)签名 h(m)=8:
s = 8⁷ mod 33
8²=64≡31, 8⁴=(8²)²≡31²=961≡4 mod 33
8⁶=8⁴×8²≡4×31=124≡25 mod 33
8⁷=8⁶×8≡25×8=200≡2 mod 33 → 签名=(2,8)验证:
h(m) = 2³ = 8 mod 33 → 验证成功
五、ElGamal 签名
利用Hash
函数计算信息摘要h(m)
签名:
- 选随机数 k
- 计算 r ≡ g k m o d p r ≡ gᵏ mod p r≡gkmodp
- 计算 s ≡ k − 1 ( h ( m ) − x r ) m o d ( p − 1 ) s ≡ k⁻¹(h(m) - xr) mod (p-1) s≡k−1(h(m)−xr)mod(p−1)
签名:(r, s)
验证:
g h ( m ) ≡ y r × r s m o d p g^{h(m)} ≡ yʳ × rˢ mod p gh(m)≡yr×rsmodp
手算示例(接ElGamal参数):
p = 23 , g = 5 , x = 6 p=23, g=5, x=6 p=23,g=5,x=6
签名 h ( m ) = 10 ( k = 3 ) : h(m)=10 (k=3): h(m)=10(k=3):
r = g k = 5 3 ≡ 10 m o d 23 r = gᵏ = 5³ ≡ 10 mod 23 r=gk=53≡10mod23
s = 3 − 1 ( 10 − 6 × 10 ) m o d 22 s = 3⁻¹(10 - 6×10) mod 22 s=3−1(10−6×10)mod22
3 − 1 = 15 ( 3 × 15 = 45 ≡ 1 m o d 22 ) 3⁻¹=15 (3×15=45≡1 mod 22) 3−1=15(3×15=45≡1mod22)
s = 15 × ( 10 − 60 ) = 15 × ( − 50 ) ≡ 15 × 16 = 240 ≡ 20 m o d 22 s = 15×(10-60) = 15×(-50)≡15×16=240≡20 mod 22 s=15×(10−60)=15×(−50)≡15×16=240≡20mod22
签名: ( 10 , 20 ) (10,20) (10,20)
验证:
g h ( m ) = 5 10 m o d 23 g^{h(m)}=5¹⁰ mod 23 gh(m)=510mod23
5 2 = 25 ≡ 2 , 5 4 = 2 2 = 4 , 5 8 = 4 2 = 16 , 5 10 = 5 8 × 5 2 ≡ 16 × 2 = 32 ≡ 9 m o d 23 5²=25≡2, 5⁴=2²=4, 5⁸=4²=16, 5¹⁰=5⁸×5²≡16×2=32≡9 mod 23 52=25≡2,54=22=4,58=42=16,510=58×52≡16×2=32≡9mod23
y r × r s = 8 10 × 10 20 m o d 23 yʳ×rˢ=8¹⁰×10²⁰ mod 23 yr×rs=810×1020mod23
8 2 = 64 ≡ 18 , 8 4 = 18 2 = 324 ≡ 2 , 8 8 = 2 2 = 4 , 8 10 = 8 8 × 8 2 ≡ 4 × 18 = 72 ≡ 3 8²=64≡18, 8⁴=18²=324≡2, 8⁸=2²=4, 8¹⁰=8⁸×8²≡4×18=72≡3 82=64≡18,84=182=324≡2,88=22=4,810=88×82≡4×18=72≡3
10 2 = 100 ≡ 8 , 10 4 = 8 2 = 64 ≡ 18 , 10 8 = 18 2 = 324 ≡ 2 , 10 16 = 2 2 = 4 , 10 20 = 10 16 × 10 4 ≡ 4 × 18 = 72 ≡ 3 10²=100≡8, 10⁴=8²=64≡18, 10⁸=18²=324≡2, 10¹⁶=2²=4, 10²⁰=10¹⁶×10⁴≡4×18=72≡3 102=100≡8,104=82=64≡18,108=182=324≡2,1016=22=4,1020=1016×104≡4×18=72≡3
3 × 3 = 9 ≡ 左边 → 验证成功 3×3=9 ≡ 左边 → 验证成功 3×3=9≡左边→验证成功
六、Schnorr 签名
密钥生成:
- 选择两个大素数
p
和q
,q
是p-1
的大素因子 - 选择选择一个生成元
g
,且 g q ≡ 1 ( m o d p ) g^q≡1(mod p) gq≡1(modp) - 选随机数
x
,计算 y = g x m o d p y= g^x mod p y=gxmodp
公钥为(p,q,g,y)
私钥为x
签名:
- 选随机数k,计算
r= gᵏ mod p
- 计算 e = H(m || r)
- 计算 s = k + xe mod q
签名:(e, s)
验证:
rᵥ = gˢ × y⁻ᵉ mod p
验证 H(m || rᵥ) = e
手算示例:
p=23, q=11, g=2, x=5, y=2⁵=32≡9 mod 23签名 m=10 (k=3):
r = 2³=8 mod 23
设有e = H(10||8) =7
s = 3 + 5×7 = 38 ≡ 5 mod 11 (38-3×11=5)
签名:(7,5)验证:
rᵥ = gˢ×y⁻ᵉ = 2⁵×9⁻⁷ mod 23
2⁵=32≡9
9⁻¹:9×18=162≡162-7×23=162-161=1 → 18
9⁻⁷=(9⁻¹)⁷=18⁷ mod 23
18²=324≡324-14×23=324-322=2
18⁴=(18²)²≡2²=4
18⁶=18⁴×18²≡4×2=8
18⁷=18⁶×18≡8×18=144≡144-6×23=144-138=6
rᵥ=9×6=54≡54-2×23=8 mod 23
H(m||rᵥ)=H(10||8)=7=e → 验证成功
七、DSA 签名
密钥生成:
- 选择两个素数
p
和q
,p-1
能被q
整除 - 选择选择一个生成元
g
,且 g q ≡ 1 ( m o d p ) g^q≡1(mod p) gq≡1(modp) - 选随机数
x
,计算 y = g x m o d p y= g^x mod p y=gxmodp
公钥为(p,q,g,y)
私钥为x
签名:
- 选随机数 k
- 计算 r = (gᵏ mod p) mod q
- 计算 s = k⁻¹(H(m) + xr) mod q
签名:(r, s)
验证:
- 计算 w = s⁻¹ mod q
- 计算 u₁ = H(m)w mod q
- 计算 u₂ = rw mod q
- 计算 v = (gᵘ¹ × yᵘ² mod p) mod q
验证v = r
手算示例:
p=23, q=11, g=2, x=5, y=9
H(m)=10签名 H(m)=10 (k=3):
r = (2³ mod 23) mod 11 = 8 mod 11=8
s = 3⁻¹(10+5×8) mod 11 = 4×50=200≡200-18×11=200-198=2
签名:(8,2)验证:
w = 2⁻¹ mod 11 = 6
u₁ = 10×6=60≡5 mod 11
u₂ = 8×6=48≡4 mod 11
v = (2⁵×9⁴ mod 23) mod 11
2⁵=32≡9
9²=81≡12, 9⁴=12²=144≡6
9×6=54≡8 mod 23
8 mod 11=8=r → 验证成功
八、ECDSA 签名
密钥生成:
- 选椭圆曲线
E
和基点G
- 选择
G
的阶满足安全要求的素数n
- 选私钥
d
(整数) - 计算公钥
Q=dG
公钥:(n,Q)
私钥:d
签名:
- 选随机数 k
- 计算 (x₁,y₁) = k×G
- 计算 r = x₁ mod n
- 计算 s = k⁻¹(H(m) + dr) mod n
签名:(r, s)
验证:
- 计算 w = s⁻¹ mod n
- 计算 u₁ = H(m)w mod n
- 计算 u₂ = rw mod n
- 计算 (x₂,y₂) = u₁×G + u₂×Q
验证x₂ mod n = r
算法对比与应用场景
算法 | 安全基础 | 签名大小 | 速度 | 典型应用 |
---|---|---|---|---|
RSA | 大数分解 | 大 (3072位) | 慢 | SSL证书, 加密文件 |
ElGamal | 离散对数 | 大 (3072位) | 慢 | PGP加密 |
ECC | 椭圆曲线 | 小 (256位) | 快 | 移动设备, IoT |
Schnorr | 离散对数 | 小 | 快 | 比特币闪电网络 |
DSA | 离散对数 | 中等 (320位) | 中等 | 政府文档 |
ECDSA | 椭圆曲线 | 小 (512位) | 快 | 区块链, 数字钱包 |
通过以上手算示例,我们可以直观感受公钥加密和签名的数学本质。尽管实际应用使用大数(通常1024-4096位),但这些小规模计算揭示了算法的核心原理。现代密码学正是建立在这些优雅的数学结构之上,守护着数字世界的安全边界。
“密码学是安全与效率的永恒舞蹈——在数学的约束中寻找完美平衡。”
—— Bruce Schneier