堅持堅持,方知何為堅持。
算法分析
1.RSA簽名方案是目前使用較多的一個簽名方案,它的安全性是基於大整數因式分解的困難性。
2.主要包括算法:
- 秘鑰生成算法:

- 簽名算法:

- 驗證算法:

算法實現
# 直接導入之前寫好的RSA算法和hash函數的hashlib庫
from RSA import *
import hashlib
# 秘鑰生成算法
pubkey = []
selfkey = []
'''公鑰私鑰中用到的兩個大素數數p,q,都是1024位'''
p = 106697219132480173106064317148705638676529121742557567770857687729397446898790451577487723991083173010242416863238099716044775658681981821407922722052778958942891831033512463262741053961681512908218003840408526915629689432111480588966800949428079015682624591636010678691927285321708935076221951173426894836169
q = 144819424465842307806353672547344125290716753535239658417883828941232509622838692761917211806963011168822281666033695157426515864265527046213326145174398018859056439431422867957079149967592078894410082695714160599647180947207504108618794637872261572262805565517756922288320779308895819726074229154002310375209
'''生成公鑰私鑰'''
pubkey, selfkey = gen_key(p, q)
# 簽名算法
m = b"helloworld"
md = hashlib.md5()
md.update(m)
# 用MD5算法生成消息摘要hm
hm = int(md.hexdigest(), 16)
print("Alice生成的消息摘要為: \n", hm)
# 計算簽名
# Alice用自己的私鑰計算簽名s
s = encrypt(hm, selfkey)
print("Alice計算出的簽名s為: \n", s)
# Alice將(m, s)發送個Bob
# 驗證算法
# Bob驗證簽名是否有效
flag = True
# Bob用公鑰計算出消息摘要
res = decrypt(s, pubkey)
print("Bob計算出的消息摘要為: \n", res)
if res == hm:
flag =True
else:
flag = False
# 將驗證結果輸出
if flag == True:
print("Alice的簽名有效")
else:
print("Alice的簽名無效")
簽名與驗證過程
如下圖所示,消息m = “helloworld” , 使用RSA算法中生成的公鑰和私鑰,Alice通過私鑰對消息摘要進行簽名得到s , Bob通過公鑰根據簽名s計算出消息摘要,並將其與Alice發來的消息摘要進行對比,如果相等,則打印出簽名有效,否則打印出簽名無效。

正確性
簽名驗證過程的正確性證明如下:

安全性分析
1.簽名中使用了hash函數,哈希函數的使用使簽名具有更好的抗攻擊性。如果不使用,則可根據RSA方案所具有的同態特性,根據已知的兩個簽名,生成偽造的消息簽名。具體如下:如果消息𝑀1、𝑀2的簽名分別是𝑆1和𝑆2,則任何知道𝑀1,𝑆1,𝑀2,𝑆2的人可以偽造對消息𝑀1𝑀2的簽名𝑆1𝑆2,因為
𝑆𝑖𝑔(𝑀1𝑀2) = 𝑆𝑖𝑔(𝑀1)𝑆𝑖𝑔(𝑀2)
2.若未使用hash函數,還可以嘗試一般攻擊:攻擊者任選一個數據𝑌,用A的公鑰計算𝑋=Y^e𝑚𝑜𝑑 𝑛 於是便可以用Y偽造A對消息X的簽名,因為

3.存在簽名的可重用性問題,即對同一消息在不同時刻簽名是相同的。這個問題可通過在每次簽名中引入不同隨機數來解決。
