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

一、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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910172.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

63 网络交互的过程中目标设备的选择

前言 这里主要是 调研一下 发送网络数据包的过程中 选择网络设备 比如 向本机发送信息, 走的是 lo 向局域网其他主机发送信息, 走无线网卡 或者 有线网卡 基于 linux 的调试 这里主要是基于 ping 192.168.1.2 的调试 skb->dev 的初始化是在 skb->_skb_refdst 初…

DE2-115板子上用 Verilog编程实现一个分秒计数器

一、实验目的 掌握 Verilog 语言在硬件描述中的应用&#xff0c;通过编程实现分秒计数器的逻辑功能。 学习并实践按键消抖的原理与实现方法&#xff0c;提升对硬件电路中信号处理的理解。 熟悉在 DE2-115 开发板上进行 Verilog 程序的开发、调试及下载验证流程&#xff0c;将…

R4 LSTM-火灾温度预测

import tensorflow as tf import pandas as pd import numpy as npgpus tf.config.list_physical_devices("GPU") if gpus:tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],&…

什么是跨域问题?后端如何解决跨域问题?

跨域问题是指浏览器为了安全&#xff0c;对不同域&#xff08;包含不同协议、不同端口或不同主机名&#xff09;的请求进行限制&#xff0c;从而导致请求无法正常访问后端接口。 跨域问题的产生源于浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;这…

vue | rollup 打包 | 配置 rollup.config.js 文件,更改 rollup的行为

原因&#xff1a;将入口文件 转为 esm 和 umd 两种格式&#xff0c;要配置 rollup Rollup 已内置到 vite 工具中&#xff0c; 命令行打包&#xff0c;参数多&#xff0c;麻烦——》解决&#xff1a;创建配置文件&#xff0c;js 写的&#xff0c;rollup.config.js 配置 rollup.…

服务器中物理处理器和逻辑处理器的区别?

在服务器或任何计算机系统中&#xff0c;**物理处理器&#xff08;Physical Processor&#xff09;和逻辑处理器&#xff08;Logical Processor&#xff09;**是两个不同的概念&#xff0c;它们分别代表了硬件层面和操作系统层面的处理能力。 物理处理器&#xff08;Physical P…

【Gin框架】中间件

1. 什么是中间件 (Middleware)&#xff1f; 在 Web 框架的语境下&#xff0c;中间件 (Middleware) 是一种可重用的软件组件或函数&#xff0c;它被设计用来在 HTTP 请求-响应生命周期中的特定点拦截和处理请求或响应。在 Gin 框架中&#xff0c;中间件特指符合 gin.HandlerFun…

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议

STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议&#xff0c;主要用于帮助位于网络地址转换 (NAT) 设备&#xff08;如路由器&#xff09;后面的客户端发现自己的公共 IP 地址和端口号。这对于建立点对点 (P2P) 通信至关重要&#xff0c;尤其是在 VoIP&#…

AQS详解

概念 AQS&#xff08;AbstractQueuedSynchronizer&#xff09; 是并发包&#xff08;java.util.concurrent&#xff09;的核心组件&#xff0c;用于构建锁和同步器&#xff08;如 ReentrantLock、Semaphore、CountDownLatch 等&#xff09;。它通过维护一个 CLH 队列 和 同步状…

python实战项目76:51job数据采集与分析

python实战项目76:51job数据采集与分析 一、数据采集二、数据预处理2.1 导入相关库、读取数据2.2 查看数据2.3 处理数据、删除重复值、删除空值2.4 处理薪资水平字段数据三、数据可视化3.1 不同公司规模招聘岗位数量分布3.2 不同公司性质招聘岗位数量分布3.3 不同年限要求招聘岗…

每天一个前端小知识 Day 7 - 现代前端工程化与构建工具体系

现代前端工程化与构建工具体系 1. 为什么要工程化&#xff1f;&#xff08;面试高频问题&#xff09; 问题痛点&#xff1a; 模块太多、无法组织&#xff1b;代码冗长、性能差&#xff1b;浏览器兼容性差&#xff1b;团队协作混乱&#xff0c;缺少规范与自动化。 工程化目标…

shell脚本--变量及特殊变量,算术逻辑运算

1.变量是什么 2.变量类型 3.动态&#xff0c;静态&#xff0c;强弱类型 4.变量的命名 5.变量的定义和引用 5.1三种变量类型 普通变量 环境变量 局部变量 5.2单引号&#xff0c;双引号&#xff0c;强弱引用 双引号对变量赋值的影响01:59&#xff1a;给变量加双引号&#x…

Python粒子群优化算法结合热力图TIFF文件案例

Python粒子群优化算法结合热力图TIFF文件案例 1. 项目概述 本项目使用粒子群优化算法(PSO)在热力图TIFF文件中寻找温度最高点。热力图通常以地理空间数据形式存储(TIFF格式),包含温度分布信息。PSO算法模拟鸟群觅食行为,通过粒子协作在搜索空间中寻找最优解。 import …

使用Mambaout替换YOLObackbone 整合全局信息,提升遮挡目标检测中定位能力,以及小目标、多尺度

近年来&#xff0c;Transformer 架构虽在各类任务中成为主流&#xff0c;但注意力机制的二次复杂度对长序列处理构成挑战。为此&#xff0c;类似 RNN 的模型如 Mamba 被引入&#xff0c;其核心是状态空间模型&#xff08;SSM&#xff09;&#xff0c;旨在以线性复杂度处理长序列…

力扣网C语言编程题:接雨水(动态规划实现)

一. 简介 本文记录力扣网上的逻辑编程题&#xff0c;涉及数组方面的&#xff0c;这里记录一下 C语言实现和Python实现。 二. 力扣网C语言编程题&#xff1a;接雨水 题目&#xff1a;接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子…

关于ubuntu环境下vscode进行debug的随笔

CMakeLists.txt的编写 顶层目录的CMakelists.txt 目录&#xff1a;./CMakeLists.txt #./CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(xxx_project_name LANGUAGES CXX) #设置工程名# 设置 C 标准和编译选项 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_ST…

技术演进中的开发沉思-9:window编程系列-内核对象线程同步(下)

今天我们继续走进 Windows 内核的世界&#xff0c;就昨天没说完的内核对象与线程同步内容接着继续&#xff0c;它们就像精密仪器里的齿轮&#xff0c;虽不显眼&#xff0c;却至关重要。 异步设备 I/O 在 Windows 系统中&#xff0c;异步设备 I/O 就像是一场精心编排的接力赛。…

用AI从0开始量化交易-Anaconda环境(env)和缓存(pkg)更改储存位置

之前介绍了Anaconda的安装和环境建立&#xff0c;最近自己的量化交易工具开发的差不多了&#xff0c;却发生了尴尬的问题&#xff0c;C盘被不断增大的conda环境和缓存占据得快满了。 在网上找了些教程&#xff0c;大多是讲迁移的&#xff0c;专门讲改本地改储存位置的比较少&am…

Python爬虫工作基本流程及urllib模块详解

在2025年的数据驱动时代&#xff0c;网络数据成为企业与个人的“金矿”&#xff0c;而Python爬虫则是挖掘这金矿的“利器”&#xff01;无论是抓取电商价格、分析社交媒体趋势&#xff0c;还是构建知识库&#xff0c;Python爬虫都能让你事半功倍。然而&#xff0c;爬虫开发并非…

thinkphp8 模型-一对一,一对多,多对多 学习

thinkphp 命令创建模型&#xff08;和laravel基本一样&#xff09; php think make:model User 在模型里创建字段 protected $table User; protected $pk id; // 定义返回哪些字段 protected $field [id, name]; // 返回字段的类型 protected $schema [id > int] 模…