一、实验目的
1.掌握数字签名的基本原理,理解RSA算法如何提供数字签名。
2.熟悉实验环境和加密软件CrypTool 1.4(CrypTool 2)的使用。
3.编写代码实现签名算法。
二、实验内容
消息:
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
实验(1):

图一:签名过程

图二:验证过程
实验(2):
1、运用python自带的库生成sha-1消息摘要(图三):

图三:sha-1实现
2、将实验4的RSA算法实现倒置,解密对应签名,加密对应验证(如图四,五)

图四:解密对应签名

图五:加密对应验证
实验(1):
数字签名:
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):
私钥对消息摘要进行签名后,运用公钥验证签名,结果与摘要相同,验证成功!(如图六)

图六:运行结果
本次实验的综合性较高,运用了前几课的知识,包括sha-1算法生成消息验证码,RSA算法实现不对称加密,在运用其不对称加密的性质实现数字签名,而这一切都是基于复杂的离散对数问题。Sha-1算法生成固定长度但又对明文具有强抗碰撞性,使得对摘要生成的签名长度很短都能达到较好的验证效果。
from random import randint
from datetime import datetime
import hashlib
"""判断是否是素数"""
def is_sushu(sushu):
for i in range(2,sushu):
if sushu % i == 0:
return False
return True
"""随机生成指定范围的大素数"""
def Create_Sushu():
while True:
sushu = randint(100,1000 )#下限越大,加密越安全,此处考虑计算时间,取值较小
if is_sushu(sushu):
return sushu
"""计算欧拉函数"""
def Oula(sushu1 , sushu2):
return (sushu1-1)*(sushu2-1)
"""判断是否互质"""
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
"""计算公钥,直接计算编程较简单,此处考虑了计算效率的优化"""
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)
"""将字符串转成ASCII"""
def Transfer_To_Ascii(messages):
result = []
for message in messages:
result.append( ord(message) )
return result
"""将列表转化成字符串"""
def Transfer_To_String(string_list):
string = ''.join('%s' %id for id in string_list) #有数字不能直接join .join('%s' %id for id in list1))
return string
if __name__ == "__main__":
"""
p、q为大素数
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("验证成功!!!")
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,
我有一个允许更新用户记录的表单。它包含:password和:password_confirmation字段,但我不希望在数据库中已存储加密密码时对它们运行验证。View文件中的字段:'ConfirmPassword'%>在互联网上搜索时,我发现了这段代码,我认为它是针对以前版本的Ruby/Rails的。(我会把它放在我的用户模型中。)validates_presence_of:password,:on=>create由于我的用户模型中密码验证的语法不同(如下),我对我需要的语法感到困惑。validates:password,:presence=>true,:confirmation=>
我正在使用devise,当用户更改密码时,网站会将他们注销。我在网上读到,添加sign_in可以解决问题但不起作用,并且当密码更改时用户会注销。这是我的代码if@user.errors[:base].empty?and@user.update_attributes(params[:user])sign_in(current_user,:bypass=>true)flash[:success]="Useraccounthasbeensuccessfullyupdated"redirect_toedit_user_path(params[:site_id],@user)elserender
如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。
1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我需要实现具有各种灵活需求的密码安全。这些要求基本上取自Sanspasswordpolicy:Strongpasswordshavethefollowingcharacteristics:Containatleastthreeofthe
我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为
我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s