公鑰加密與簽名算法計算詳解(含計算題例子)

一、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 = 53 mod 33 = 125 mod 33 = 26解密 c=26:
m = 26? mod 33
262 = 676 ≡ 16 mod 33
26? = (262)2 ≡ 162 = 256 ≡ 25 mod 33
26? = 26? × 262 ≡ 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??)?1 mod p

手算示例:
p=23, g=5, x=6
y = 5? mod 23 = 15625 mod 23 = 8加密 m=10 (k=3):
c? = 53 mod 23 = 125 mod 23 = 10
c? = 10×83 mod 23 = 10×512 mod 23 = 10×6 = 60 ≡ 14 mod 23
密文:(10,14)解密:
c?? = 10? mod 23
102=100≡8, 10?=(102)2≡82=64≡18, 10?=10?×102≡18×8=144≡6 mod 23
m = 14×6?1 mod 23
6?1=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?1 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?+kPB??nB?(kG)=Pt?+k(nB?G)?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
82=64≡31, 8?=(82)2≡312=961≡4 mod 33
8?=8?×82≡4×31=124≡25 mod 33
8?=8?×8≡25×8=200≡2 mod 33 → 簽名=(2,8)驗證:
h(m) = 23 = 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?1(h(m) - xr) mod (p-1) sk?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? = 53 ≡ 10 mod 23 r=gk=5310mod23
s = 3 ? 1 ( 10 ? 6 × 10 ) m o d 22 s = 3?1(10 - 6×10) mod 22 s=3?1(10?6×10)mod22
3 ? 1 = 15 ( 3 × 15 = 45 ≡ 1 m o d 22 ) 3?1=15 (3×15=45≡1 mod 22) 3?1=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×(10?60)=15×(?50)15×16=24020mod22
簽名: ( 10 , 20 ) (10,20) (10,20)

驗證:
g h ( m ) = 5 10 m o d 23 g^{h(m)}=51? 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 52=25≡2, 5?=22=4, 5?=42=16, 51?=5?×52≡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?=81?×102? 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 82=64≡18, 8?=182=324≡2, 8?=22=4, 81?=8?×82≡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 102=100≡8, 10?=82=64≡18, 10?=182=324≡2, 101?=22=4, 102?=101?×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?1*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 = 23=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?1:9×18=162≡162-7×23=162-161=1 → 18
9??=(9?1)?=18? mod 23
182=324≡324-14×23=324-322=2
18?=(182)2≡22=4
18?=18?×182≡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?1(H(m) + xr) mod q
    簽名:(r, s)
驗證:
  1. 計算 w = s?1 mod q
  2. 計算 u? = H(m)w mod q
  3. 計算 u? = rw mod q
  4. 計算 v = (g?1 × y?2 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 = (23 mod 23) mod 11 = 8 mod 11=8
s = 3?1(10+5×8) mod 11 = 4×50=200≡200-18×11=200-198=2
簽名:(8,2)驗證:
w = 2?1 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
92=81≡12, 9?=122=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?1(H(m) + dr) mod n
    簽名:(r, s)
驗證:
  1. 計算 w = s?1 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?1*Hm+dr mod n
簽名 r,s
計算w=s?1 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
英文地址,請注明出處:http://en.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] 模…