一、實驗?zāi)康?/p>
1.掌握數(shù)字簽名的基本原理,理解RSA算法如何提供數(shù)字簽名。
2.熟悉實驗環(huán)境和加密軟件CrypTool 1.4(CrypTool 2)的使用。
3.編寫代碼實現(xiàn)簽名算法。
二、實驗內(nèi)容
- 運行CrypTool 1.4(CrypTool 2),使用RSA算法對消息進行簽名操作,選擇公鑰PK=(e,N),私鑰為sk=(d,N)。例如:
消息:
Out of all cryptographic primitives, the digital signature using public key cryptography is considered as very important and useful tool to achieve information security. Apart from ability to provide non-repudiation of message, the digital signature also provides message authentication and data integrity.
密鑰:e = 11
N =
97837973726418359868516951718991281325771149750958732944765111213631328027493925740023000937277990315891588119835562940190113563334615471147089645563941484459898854377253031679968434226000865737244299665393453851802313775580309976978804698982229486068546397607971083305570968358870209409102684170827187712579
d =
53366167487137287201009246392177062541329718045977490697144606116526178924087595858194364147606176535940866247183034331012789216364335711534776170307604435275621882890925722486791216663911766481240927473604083681494108652553529557950472379863877351129463207267185120618342084129306558631987155442108022251891
- 編程實現(xiàn)RSA/ElGamal簽名算法并測試簽名和驗證過程。要求消息頭部包含作者的姓名拼音,并通過哈希函數(shù)SHA-1得到消息摘要,對摘要進行簽名,編程語言不限。
- 實驗步驟
實驗(1):
- 通過課堂與課本得知,RSA簽名和實驗4中的RSA算法正好相反,解密對應(yīng)于簽名,且解密的密鑰為加密者的私鑰。加密對應(yīng)于驗證,于是打開Cryptool2.1使用RSA解密算法生成16進制文件。如圖一、二。
?
圖一:簽名過程
?
圖二:驗證過程
實驗(2):
1、運用python自帶的庫生成sha-1消息摘要(圖三):
?
圖三:sha-1實現(xiàn)
2、將實驗4的RSA算法實現(xiàn)倒置,解密對應(yīng)簽名,加密對應(yīng)驗證(如圖四,五)
?
圖四:解密對應(yīng)簽名
?
圖五:加密對應(yīng)驗證
- 實驗結(jié)果
實驗(1):
數(shù)字簽名:
EF 2B D8 A6 0B 36 A3 88 4F 85 56 B0 E0 22 D2 02 1D 21 AE 4F 0D A6 BB 81 F7 CA 82 7B 31 E0 27 82 DE F9 A7 85 CE 25 21 4E 74 C6 00 C3 11 EF E7 7A 89 12 F5 EB DD 9F 92 14 C3 9A 2B 3D 07 9B 68 27 09 AD EA 1F 41 24 7A B2 1A C6 CA C9 9E D9 F4 FA A7 10 A9 F7 73 8D 49 4B 73 36 E0 1C A8 9D 7A D8 63 44 B5 7B 1A BD 83 00 82 0C 8C DA DD B4 1F 36 5C 94 D6 5B 76 B1 01 F8 63 49 25 A8 E7 74 7D 76 48 47 7A 81 C3 FF 67 47 39 A0 63 A1 9F 54 FB F2 86 C5 03 D1 69 84 65 FB 1F D5 09 CB B4 72 46 C6 A1 61 25 C2 60 EC 8E 19 3E 59 4E 27 11 A1 04 ED D9 53 9B 41 38 8E C3 DA A3 FE B6 C2 E8 F5 2D ED A0 60 AB 25 C9 87 E1 8F 5E 81 45 01 14 FF 61 BA 35 EC D0 F0 5F 51 01 7F 3B 76 B3 45 E8 60 F8 30 64 A3 1E E5 03 66 02 43 08 F3 31 2A 61 47 CC 56 95 5A E7 D1 CD EC B1 EF 15 80 24 16 EC E0 EC 19 28 95 11 CB F9 CD 04 8C 9C E5 DA 40 AA CF 93 97 71 F5 EE EB 4E C5 E6 98 F6 C1 61 6C CF 0C F5 96 A4 22 05 81 D1 42 9E BB 98 D4 A1 97 C8 3B D5 DB BC E8 76 14 5A 9D 4B 05 3B 49 1B DC B6 51 F0 B3 DA 5B A0 F8 ED 29 57 85 25 A8 77 63 AC C9 D6 C1 58 18 83 D8 9A F8 33 D0 42 DA C8 B9 21 24 C1 EF 27 7B 8E AB 9A 52 40 C0 C0 C3 27 39 32 DD 9F 1D 37 C2 38 BA 35 DC E8 0E 45 19 5E 93 41 96 43 25
RSA加密后生成的密文:
Out of all cryptographic primitives, the digital signature using public key cryptography is considered as very important and useful tool to achieve information security. Apart from ability to provide non-repudiation of message, the digital signature also provides message authentication and data integrity.
與原文相同,驗證成功。
實驗(2):
私鑰對消息摘要進行簽名后,運用公鑰驗證簽名,結(jié)果與摘要相同,驗證成功?。ㄈ鐖D六)
?
圖六:運行結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-783947.html
- 實驗心得
本次實驗的綜合性較高,運用了前幾課的知識,包括sha-1算法生成消息驗證碼,RSA算法實現(xiàn)不對稱加密,在運用其不對稱加密的性質(zhì)實現(xiàn)數(shù)字簽名,而這一切都是基于復(fù)雜的離散對數(shù)問題。Sha-1算法生成固定長度但又對明文具有強抗碰撞性,使得對摘要生成的簽名長度很短都能達到較好的驗證效果。文章來源地址http://www.zghlxwxcb.cn/news/detail-783947.html
- 附錄 (程序代碼)
from random import randint
from datetime import datetime
import hashlib
"""判斷是否是素數(shù)"""
def is_sushu(sushu):
??? for i in range(2,sushu):
??????? if sushu % i == 0:
??????????? return False
??? return True
"""隨機生成指定范圍的大素數(shù)"""
def Create_Sushu():
??? while True:
??????? sushu = randint(100,1000 )#下限越大,加密越安全,此處考慮計算時間,取值較小
??????? if is_sushu(sushu):
??????????? return sushu
"""計算歐拉函數(shù)"""
def Oula(sushu1 , sushu2):
??? return (sushu1-1)*(sushu2-1)
"""判斷是否互質(zhì)"""
def Is_Huzhi(int_min,int_max):
??? for i in range(2,int_min+1):
??????? if int_min % i == 0 and int_max % i == 0:
??????????? return False
??? return True
"""計算公鑰,直接計算編程較簡單,此處考慮了計算效率的優(yōu)化"""
def Creat_E(oula):
??? top = oula
??? while True:
??????? i = randint(2,top)
??????? for e in range(i,top):
??????????? if Is_Huzhi(e,oula):
??????????? ????return e
??????? top = i
"""計算私鑰"""
def Compute_D(oula,e):
??? k = 1
??? while ( k*oula+1 )% e != 0:
??????? k+=1
??? return int((k*oula+1)/e)
"""將字符串轉(zhuǎn)成ASCII"""
def Transfer_To_Ascii(messages):
??? result = []
??? for message in messages:
??????? result.append(? ord(message) )
??? return result
"""將列表轉(zhuǎn)化成字符串"""
def Transfer_To_String(string_list):
??? string = ''.join('%s' %id for id in string_list)?????? #有數(shù)字不能直接join .join('%s' %id for id in list1))
??? return string
if __name__ == "__main__":
??? """
??? p、q為大素數(shù)
??? n=p*q
??? oula = (p-1)* (q-1)
??? e 為公鑰
??? d 為私鑰
??? """
??? print("通信開始,正在計算公鑰與私鑰...")
??? time_start = datetime.now()
??? p = Create_Sushu()
??? q = p
??? while p ==q :
??????? q = Create_Sushu()
??? n = p * q
??? oula = Oula(p, q)
??? e = Creat_E(oula)
??? d = Compute_D(oula,e)
??? time_end = datetime.now()
??? print(f"計算完成,用時{str(time_end -time_start)}秒 ")
??? print(f"公鑰:n = {str(n)} , e = {str(e)}")
??? print(f"私鑰:n = {str(n)} , d = {str(d)}")
??? m = input('待簽名信息:')
??? hash = hashlib.sha1(m.encode("utf-8")).hexdigest()
??? c_list= Transfer_To_Ascii(hash)
??? print(f"sha-1消息摘要為:{hash}")
??? print("正在簽名...")
??? decode_messages=[]
??? for c in c_list:
??????? decode_message = c**d%n
??????? decode_messages.append(chr(decode_message))
??? m_list = Transfer_To_Ascii(decode_messages)
??? print(f"簽名信息:{m_list}")
??? c_list = []
??? for m in m_list:
??????? c = m**e%n
??????? c_list.append(chr(c))
??? print("正在驗證...")
??? print(f"收到的摘要為:{Transfer_To_String(c_list)}")
??? if Transfer_To_String(c_list) == hash:
??????? print("驗證成功?。?!")
到了這里,關(guān)于現(xiàn)代密碼學(xué)實驗五:簽名算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!