当前位置: 首页 > news >正文

公钥加密与签名算法计算详解(含计算题例子)

一、RSA 加密算法

密钥生成:
  1. 选两个大素数 p 和 q
  2. 计算 n = p × q
  3. 计算 φ(n) = (p-1)(q-1)
  4. 选整数 e 满足 1 < e < φ(n) 且 gcd(e, φ(n)) = 1
  5. 计算 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 加密算法

密钥生成:
  1. 选大素数 p 和生成元 g
  2. 选私钥 x (1 < x < p-1)
  3. 计算公钥 y ≡ gˣ mod p

公钥:(p, g, y)
私钥:x

加密:
  1. 选随机数 k
  2. 计算 c₁ ≡ gᵏ mod p
  3. 计算 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 → 解密成功
明文m
选择随机数k
计算c₁=gᵏ mod p
计算c₂=m*yᵏ mod p
密文 c₁,c₂
计算共享密钥 s=c₁ˣ mod p
计算m=c₂*s⁻¹ mod p

三、椭圆曲线加密(ECC)

密钥生成:
  1. 选椭圆曲线 E 和基点 G
  2. 选私钥 n B n_B nB(整数)
  3. 计算公钥 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
加密:
  1. 在椭圆群中选择一点 P t = ( x t , y t ) P_t=(x_t,y_t) Pt=(xt,yt)
  2. 选取一个随机数 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
  3. 计算 P 2 = ( x 2 , y 2 ) = k P B P_2 = (x_2,y_2)=kP_B P2=(x2,y2)=kPB
  4. 计算 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+kPBnB(kG)=Pt+k(nBG)nB(kG)
m = ( C − y t ) / x t m=(C-y_t)/x_t m=(Cyt)/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+kPBnB(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=(Cyt)/xt=(51)/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)

签名:
  1. 选随机数 k
  2. 计算 r ≡ g k m o d p r ≡ gᵏ mod p rgkmodp
  3. 计算 s ≡ k − 1 ( h ( m ) − x r ) m o d ( p − 1 ) s ≡ k⁻¹(h(m) - xr) mod (p-1) sk1(h(m)xr)mod(p1)
    签名:(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=5310mod23
s = 3 − 1 ( 10 − 6 × 10 ) m o d 22 s = 3⁻¹(10 - 6×10) mod 22 s=31(106×10)mod22
3 − 1 = 15 ( 3 × 15 = 45 ≡ 1 m o d 22 ) 3⁻¹=15 (3×15=45≡1 mod 22) 31=15(3×15=451mod22)
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×(1060)=15×(50)15×16=24020mod22
签名: ( 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=252,54=22=4,58=42=16,510=58×5216×2=329mod23
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=6418,84=182=3242,88=22=4,810=88×824×18=723
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=1008,104=82=6418,108=182=3242,1016=22=4,1020=1016×1044×18=723
3 × 3 = 9 ≡ 左边 → 验证成功 3×3=9 ≡ 左边 → 验证成功 3×3=9左边验证成功

消息m
选择随机数k
计算r=gᵏ mod p
计算s=k⁻¹*m-xr mod p-1
签名 r,s
计算gᵐ mod p
计算yʳ*rˢ mod p
相等?

六、Schnorr 签名

密钥生成:
  1. 选择两个大素数pq,qp-1的大素因子
  2. 选择选择一个生成元g,且 g q ≡ 1 ( m o d p ) g^q≡1(mod p) gq1(modp)
  3. 选随机数 x,计算 y = g x m o d p y= g^x mod p y=gxmodp
    公钥为(p,q,g,y)
    私钥为x
签名:
  1. 选随机数k,计算r= gᵏ mod p
  2. 计算 e = H(m || r)
  3. 计算 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 签名

密钥生成:
  1. 选择两个素数pq,p-1能被q整除
  2. 选择选择一个生成元g,且 g q ≡ 1 ( m o d p ) g^q≡1(mod p) gq1(modp)
  3. 选随机数 x,计算 y = g x m o d p y= g^x mod p y=gxmodp
    公钥为(p,q,g,y)
    私钥为x
签名:
  1. 选随机数 k
  2. 计算 r = (gᵏ mod p) mod q
  3. 计算 s = k⁻¹(H(m) + xr) mod q
    签名:(r, s)
验证:
  1. 计算 w = s⁻¹ mod q
  2. 计算 u₁ = H(m)w mod q
  3. 计算 u₂ = rw mod q
  4. 计算 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 签名

密钥生成:
  1. 选椭圆曲线 E 和基点 G
  2. 选择G的阶满足安全要求的素数n
  3. 选私钥d(整数)
  4. 计算公钥 Q=dG
    公钥:(n,Q)
    私钥:d
签名:
  1. 选随机数 k
  2. 计算 (x₁,y₁) = k×G
  3. 计算 r = x₁ mod n
  4. 计算 s = k⁻¹(H(m) + dr) mod n
    签名:(r, s)
验证:
  1. 计算 w = s⁻¹ mod n
  2. 计算 u₁ = H(m)w mod n
  3. 计算 u₂ = rw mod n
  4. 计算 (x₂,y₂) = u₁×G + u₂×Q
    验证 x₂ mod n = r
ECDSA签名
选择随机数k
计算k×G
取r=x坐标 mod n
计算s=k⁻¹*Hm+dr mod n
签名 r,s
计算w=s⁻¹ mod n
计算u₁=Hm*w mod n
计算u₂=r*w mod n
计算P=u₁×G + u₂×Q
取x_P mod n
等于r?

算法对比与应用场景

算法安全基础签名大小速度典型应用
RSA大数分解大 (3072位)SSL证书, 加密文件
ElGamal离散对数大 (3072位)PGP加密
ECC椭圆曲线小 (256位)移动设备, IoT
Schnorr离散对数比特币闪电网络
DSA离散对数中等 (320位)中等政府文档
ECDSA椭圆曲线小 (512位)区块链, 数字钱包

通过以上手算示例,我们可以直观感受公钥加密和签名的数学本质。尽管实际应用使用大数(通常1024-4096位),但这些小规模计算揭示了算法的核心原理。现代密码学正是建立在这些优雅的数学结构之上,守护着数字世界的安全边界。

“密码学是安全与效率的永恒舞蹈——在数学的约束中寻找完美平衡。”
—— Bruce Schneier

相关文章:

  • 股票T0程序化交易如何做?
  • MySQL的Sql优化经验总结
  • 【配置教程】新版OpenCV+Android Studio环境配置(4.11测试通过)
  • MySQL 中 DISTINCT 去重的核心注意事项详解
  • 【沉浸式解决问题】Mysql中union连接的子查询是否并行执行
  • Python训练营打卡Day50
  • 4 Studying《ARM System Developer’s Guide》9-15
  • 【时时三省】(C语言基础)关于变量的声明和定义
  • RAG轻松通-P1:分块
  • 游戏盾能够发挥哪些作用?
  • 文献阅读|基于PSMA PET/CT使用机器学习增强前列腺癌的诊断与风险评估
  • 期末作业swing水果店管理系统
  • 2.4 Python基础概念:通过一个文字冒险游戏学习编程
  • Linux网络-基础概念
  • Nginx代理缓存静态资源
  • 爬虫技术:数据获取的利器与伦理边界
  • 【CompletableFuture】常用方法(三)
  • JetsonNano详细使用笔记(二)
  • CentOS 7 虚拟机网络配置异常 典型问题:启动了NetworkManager但是network无法启动
  • 家用旧电脑搭建小型服务器操作步骤教程:一步一步本地部署到公网访问
  • 更换网站后台管理系统/怎样制作一个网站
  • 网站建设优化兼职在家/关键词推广效果分析
  • 天津企业设计网站建设/合肥关键词排名推广
  • 网络营销方案的制定思路/惠州seo报价
  • 济阳做网站公司/广告做到百度第一页
  • 网站建设创新互联/引擎优化seo