2数字签名实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字签名实验
【实验内容】
通过运算器工具完成RSA-PKCS签名算法、DSA签名算法和ECC签名算法的签名和验证
对RSA签名算法、ELGAMAL签名算法、DSA签名算法和ECC签名算法进行扩展实验
对RSA签名生成、RSA签名验证、DSA参数生成、DSA密钥生成、DSA签名生成、DSA签名验证、ECC密钥生成、ECC签名生成、ECC签名验证等进行算法跟踪
【实验原理】
数字签名是针对数字文档的一种签名确认方法,目的是对数字对象的合法性、真实性进行标记,并提供签名者的承诺。
数字签名应具有与数字对象一一对应的关系,即签名的精确性;数字签名应基于签名者的唯一特征,从而确定签名的不可伪造性和不可否认性,即签名的唯一性;数字签名应具有时间特征,从而防止签名的重复使用,即签名的时效性。
数字签名的执行方式分为直接方式和可仲裁方式。
一、RSA-PKCS签名算法
公钥密码标准(PKCS)最初是为推进公钥密码系统的互操作性,由RSA实验室与工业界、学术界和政府代表合作开发的。
在RSA带领下,PKCS的研究随着时间不断发展,它涉及了不断发展的PKI格式标准、算法和应用程序接口。
PKCS标准提供了基本的数据格式定义和算法定义,它们实际是今天所有PKI实现的基础。
其中PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名;它定义了数字签名如何计算,包括待签名数据和签名本身的格式;也定义了RSA公/私钥的语法。
RSA-PKCS签名算法基于RSA算法,被用于签署X.509/PEM证书、CRL、PKCS #6扩展证书以及其它使用数字签名的对象,例如X.401消息环。
RSA-PKCS签名算法的签名过程包括4个步骤:消息散列,数据编码,RSA加密和8位字节串到位串的转换;签名过程的输入是一个8位字节串M(即消息)和签名者的私人密钥;其输出是一个位串S(即签名);验证过程包括四个步骤:位串到字节串的转换,RSA解密,数据解码,消息散列和比较;验证过程的输入是字节串M(即消息)、签名者的公钥、位串S(即签名);其输出是验证成功或失败的标记号。
RSA-PKCS签名算法的具体算法描述可参见RFC-2313:PKCS#1 RSAv1.5加密标准。
二、ELGAMAL签名算法
选p是一个大素数,p-1有大素数因子,a是一个模p的本原元,将p和a公开。
用户随机地选择一个整数x作为自己的秘密的解密钥,,计算,取y 为自己的公开的加密钥。
公开参数p和a。
(1)产生签名
设用户A要对明文消息m加签名,,其签名过程如下:
①用户A随机地选择一个整数k,,且(k,p-1)=1;
②计算
③计算
④取(r,s)作为m的签名,并以<m,r,s>的形式发送给用户B。
(2)验证签名
用户B验证是否成立,若成立则签名为真,否则签名为假。
三、DSA签名算法
数字签名标准(Digital Signature Standard,DSS)是由美国国家标准技术研究所(NIST)于1994年正式公布的联邦信息处理标准FIPS PUB 186。
DSS目前新增了基于RSA和ECC的数字签名算法,但是最初只支持DSA(Digital Signature Algorithm)数字签名算法,该算法是ElGamal签名算法的改进,安全性基于计算离散对数的难度。
DSA算法由美国国家安全局NSA指导设计,用来提供唯一的数字签名函数;它虽然是一种公钥技术,但是只能用于数字签名。
DSA中规定了使用安全散列算法(SHA-1),将消息生成固定长度的散列值,与一随机数k一起作为签名函数的输入;签名函数还需使用发送方的密钥x和供所有用户使用的全局公开密钥分量(p,q,g),产生的两个输出(r,s)即为消息的签名。
接收方收到消息后再产生出消息的散列值,将散列值与收到签名中的s一起输入验证函数;验证函数还需输入全局公开密钥分量(p,q,g)和发送方的公钥y,产生的输出若与收到的签名中的r相同,则验证了签名是有效的。
DSA的具体算法描述如下:
(一)DSA的参数
(1)全局公开密钥分量(p,q,g),可以为一组用户公用:
P是一个满足2L-1<p<2L的大素数,其中512≤L≤1024且L是64的倍数;
q是p-1的素因子,满足2159<q<2160,即q的比特长度为160;
,其中h是一个整数,满足1<h<p-1,且。
(2)用户私钥x
x是随机或伪随机整数,满足0<x<q。
(3)用户公钥y
用户公钥是由私钥计算而来的,给定x计算y容易,但给定y计算x是离散对数问题,被认为在计算上是安全的。
(4)用户为待签名消息选取的秘密数k
k为随机或伪随机的整数,要求0<k<q;每次签名都要重新生成k。
(二)签名过程
发送方使用随机选取的秘密值k,计算
其中:H(M)是使用基于SHA-1生成的M的散列值;(r,s)就是基于散列值对消息M的数字签名;k-1是k模q的乘法逆,且0<k-1<q。
最后签名者应验证r=0或s=0是否成立,若r=0或s=0,就应另选k值重新生成签名。
(三)验证过程
接收者收到(M,r,s)后,首先验证0<r<q,0<s<q,若通过则计算:
若v=r,则确认签名正确,可认为收到的消息是可信的。
四、ECC签名算法
椭圆曲线密码体制(Elliptic Curve Cryptography,ECC)实现了密钥效率的重大突破,其安全性基于椭圆曲线离散对数问题的难解性。
ECC和RSA相比的主要优点在于使用少的多的比特大小的密钥能取取得与RSA同等强度的安全性,减少了处理开销,具有存储效率、计算效率和通信带宽的解决等方面的优势,适用于计算能力没有很好支持的系统。
椭圆曲线签名体制ECDSA是以ECC为基础的。
其签名过程包括:基于散列函数生成消息摘要、椭圆曲线计算和模计算;签名过程的输入包括:用位串表示的任意长度的消息M、一套有效的椭圆曲线域参数、私钥d;签名过程的输出是两个整数(r,s),其中0≤r,s≤n-1。
其验证过程包括:生成消息摘要、模运算、椭圆曲线计算和签名核实;验证过程的输入包括:收到的用位串表示的消息M、收到的该消息的签名(r,s)、一套有效的椭圆曲线域参数、一个有效的公钥Q;若产生的输出v与r相等,则验证成功。
ECC签名算法的具体描述如下:
(一)系统建立和密钥生成
(1)系统建立
选取一个基域GF(p)或GF(2m)和定义在该基域上的椭圆曲线E(a,b)和E(a,b)上的拥有素数阶n的点P(XP,y p)(通常称为基点G,即G=P),其中有限域GF(p)或GF(2m)、椭圆曲线参数(a,b)、基点G(即点P(XP,y p))的阶n都是公开信息。
(2)密钥生成
系统建立后,每个参与实体进行如下计算:在区间[1,n-1]中随机选取一个整数d,计算Q=d G;实体的公钥为点Q,实体的私钥为整数d。
(二)签名过程
发送者在区间[1,n-1]中随机选取一个整数k,计算椭圆曲线的点(x1,x2)=kG;转换域元素x 1到整数,进行如下计算:
其中:H(M)是使用基于SHA-1生成的消息M的散列值,(r,s)是基于散列值对消息M的数字签名。
最后验证r=0或s=0是否成立,若r=0或s=0,就应另选k值重新生成签名。
(三)验证过程
接收者在接收到(M,r,s)后,首先验证r,s是否是在区间[1,n-1]内的整数,若验证通过则计算:
计算椭圆曲线点(x1,x2)=u1G+u2Q,验证(x1,x2)是否为无穷远点,若验证通过则转换域元素
x 1到整数,计算。
若v=r,则确认签名正确,可认为收到的消息是可信的
【实验环境】
ISES客户端
Microsoft CLR Debugger 2005或其它调试器
【实验步骤】
一、RSA-PKCS签名算法
(一)签名及验证计算
(1)进入实验实施,默认选择即为“RSA-PKCS”标签,显示RSA-PKCS签名实验界面。
(2)选择明文格式,输入明文信息。
(3)点击“计算SHA1值”按钮,生成明文信息的散列值,如图1.1.8-1所示。
图1.1.8-1
(4)选择密钥长度,此处以512bit为例,点击“生成密钥对”按钮,生成密钥对和参数。
(5)选择“标准方法”标签,在标签下查看生成的密钥对和参数,如图1.1.8-2所示。
图1.1.8-2
(6)标准方法签名及验证
点击“标准方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果;上述过程如图1.1.8-3所示。
图1.1.8-3
(7)选择“中国剩余定理方法”标签,在标签下查看生成的密钥对和参数,如图1.1.8-4
所示。
图1.1.8-4
(8)中国剩余定理方法签名及验证
点击“中国剩余定理方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果;上述过程如图1.1.8-5所示。
图1.1.8-5
(二)扩展实验
(1)设置签名系统参数
①直接点击“测试素性”按钮,使用系统初始预设的RSA参数,如图1.1.8-6所示。
图1.1.8-6
①点击“生成pq”按钮,系统会自动产生2个大素数。
然后,点击“测试素性”按钮,
再次确认其素性,如图1.1.8-7所示。
图1.1.8-7
注:这个过程比较费时,可能要花费几分钟。
(2)注册用户
①在“用户名”文本框中输入一个“注册用户列表”中未出现的用户名,如“alice”,
点击“注册”按钮,如图1.1.8-8所示。
图1.1.8-8
②在“用户注册”窗口,点击“密钥测试”按钮,系统会为该用户生成一对公私钥,
如图1.1.8-9所示。
图1.1.8-9
注:这个过程比较费时,可能要花费几分钟。
③点击“密钥登记”按钮,主窗口的“注册用户列表”中就会出现一个新的用户信息。
如图
1.1.8-10所示。
图1.1.8-10
④重复上述过程,产生不少于2个注册用户,如图1.1.8-11所示。
图1.1.8-11
(3)在“主窗口”中,点击“数字签名”,进入“数字签名”窗口,如图1.1.8-12所示。
图1.1.8-12
(4)确定签名方。
在“签名方基本信息”中的“用户名UID”文本框中输入一个已经注
册的用户名,然后点击“获取私钥”按钮,即得到签名方的一些基本信息,如图
1.1.8-13所示。
图1.1.8-13
注:上图中的“报文序号I”会随着该用户的签名次数而增加,防止重放攻击。
(5)确定验证方。
在“验证方公钥”中的“验证方用户名”文本框中输入一个已经注册
的用户名,然后点击“获取公钥”按钮,即得到验证方的一些基本信息,如图1.1.8-14所示
图1.1.8-14
(6)签名运算
①输入签名消息。
在“明文M”文本框中输入要签名的消息,然后点击“确定”按钮,得到该消息摘要,如图1.1.8-15所示。
图1.1.8-15
②签名。
点击“签名”按钮,得到该消息的保密签名结果,如图1.1.8-16所示。
图1.1.8-16
注:这个过程比较费时,可能要花费几分钟。
③发送签名。
点击“发送签名”按钮,返回“主窗口”,等待验证方验证。
(7)在“主窗口”中,点击“验证签名”,进入“验证签名”窗口,如图1.1.8-17所示。
图1.1.8-17
(8)确定验证方。
在“验证方基本信息”中的“用户名UID”文本框中输入一个已经注
册的用户名,点击“获取私钥”按钮,即得到验证方的一些基本信息,如图1.1.8-18所示。
图1.1.8-18
(9)确定签名方。
在“签名方公钥”中的“签名方用户名”文本框中输入一个已经注册
的用户名,点击“获取公钥”按钮,即得到签名方的一些基本信息,如图1.1.8-19所示。
图1.1.8-19
(10)验证签名。
点击“验证”按钮,验证结果将会出现在“验证结果”文本框中,如图
1.1.8-20所示。
图1.1.8-20
注:这个过程比较费时,可能要花费几分钟。
(三)算法跟踪
在“算法跟踪”框下点击“获得RSA签名”/“验证RSA签名”按钮,进入调试器,选择对应的算法函数对RSA签名生成和RSA签名验证进行算法跟踪;跟踪完成后会自动返回实验界面显示计算结果;切换回调试器,停止调试,关闭调试器,不保存工程。
具体步骤可参照古典密码实验中实验步骤二。
二、ELGAMAL签名算法
(一)扩展实验
(1)在“RSA-PKCS”标签下的扩展实验中,点击“ELGAMAL扩展实验”按钮,进入ELGAMAL
签名算法扩展实验窗体。
(2)设置签名系统参数。
在文本框“大素数p”内输入一个大的十进制素数(不要超过
8位);然后在文本框“本原元a”内输入一个小于p的十进制正整数,点击“测试”,如图1.1.8-21所示。
图1.1.8-21
注:确保素数p和a的合法性。
(3)注册用户
①在“用户名”文本框中输入一个“注册用户列表”中未出现的用户名,如“alice”,
点击“注册”按钮,如图1.1.8-22所示。
图1.1.8-22
③在“用户注册”窗口中的文本框“私钥x”中输入一个小于素数p的十进制非负整
数,点击“确定”按钮;然后,点击“计算公钥”按钮,系统会为该用户生成一对公私钥;如图1.1.8-23所示。
图1.1.8-23
③点击“密钥登记”按钮,主窗口的“注册用户列表”中就会出现一个新的用户信息。
如图
1.1.8-24所示。
图1.1.8-24
④重复上述过程,产生不少于2个注册用户,如图1.1.8-25所示。
图1.1.8-25
(4)在“主窗口”中,点击“数字签名”,进入“数字签名”窗口,如图1.1.8-26所示。
图1.1.8-26
(5)确定签名方。
在“签名方基本信息”中的“用户名UID”文本框中输入一个已经注
册的用户名,然后点击“获取私钥”按钮,即得到签名方的一些基本信息,如图
1.1.8-27所示。
图1.1.8-27
(6)签名运算
①输入签名消息。
在“明文M”文本框中输入一个小于p的十进制非负整数,作为欲签名的消息;在“随机数k”文本框中输入一个小于p的十进制非负整数,作为共享密钥的初始信息;然后点击“确定”按钮,如图1.1.8-28所示。
图1.1.8-28
②签名。
点击“签名”按钮,得到该消息的保密签名结果,如图1.1.8-29所示。
图1.1.8-29
注:“验证信息”暂时为空,等验证方验证后,自动填充该消息。
③发送签名。
点击“发送签名”按钮,激活验证签名窗口,等待验证方验证。
(7)在“主窗口”中,点击“验证签名”,进入“验证签名”窗口,如图1.1.8-30所示。
图1.1.8-30
(8)确定验证方。
在“验证方基本信息”中的“用户名UID”文本框中输入一个已经注
册的用户名,然后点击“获取私钥”按钮,即得到验证方的一些基本信息,如图
1.1.8-31所示。
图1.1.8-31
(9)验证签名。
点击“验证”按钮,验证结果将会出现在“验证结果”文本框中,如图
1.1.8-32所示。
图1.1.8-32
(10)点击“发送确认”按钮,将验证结果通知签名方。
三、DSA签名算法
(一)签名及验证计算
(1)选择“DSA”标签,进入DSA签名实验界面。
(2)选择明文格式,输入明文信息。
(3)点击“计算SHA1值”按钮,生成明文信息的散列值,如图1.1.8-33所示。
图1.1.8-33
(4)生成参数及密钥
选择密钥长度,此处以512bit为例,点击“生成G、P、Q”按钮,生成DSA参数;点击“生成密钥”按钮,生成密钥对Y和X;上述过程如图1.1.8-34所示。
图1.1.8-34
(5)签名及验证
点击“获得签名值”按钮,获取明文摘要的签名值r和s,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果r和s进行验证,并显示验证结果;上述过程如图1.1.8-35所示。
图1.1.8-35
(二)算法跟踪
在“算法跟踪”框下点击“生成DSA参数”/“生成DSA密钥”/“获取DSA签名”/“验证DSA签名”按钮,进入调试器,选择对应的算法函数对DSA参数生成、DSA密钥生成、DSA 签名生成和DSA签名验证进行算法跟踪;跟踪完成后会自动返回实验界面显示计算结果;切换回调试器,停止调试,关闭调试器,不保存工程。
具体步骤可参照古典密码实验中实验步骤二。
四、ECC签名算法
椭圆曲线具有在有限域GF(p)和GF(2m)上的两种类型,因此ECC签名算法有两种具体形式,此处以GF(p)为例,GF(2m)可参照完成。
(一)签名及验证计算
(1)选择“ECC”标签,进入ECC签名实验界面。
(2)选择明文格式,输入明文信息。
(3)点击“计算SHA1值”按钮,生成明文信息的散列值,如图1.1.8-36所示。
图1.1.8-36
(4)参数及密钥生成
选择“F(p)”标签,在标签下选择椭圆曲线参数和密钥生成的参数,此处以m=112(seed)为例,点击“取得密钥对”,生成椭圆曲线参数和密钥对,如图1.1.8-37所示。
图1.1.8-37
(5)签名及验证
点击“获得签名值”按钮,获取明文摘要的签名值r和s,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果r和s进行验证,并显示验证结果;上述过程如图1.1.8-38所示。
图1.1.8-38
(二)扩展实验
(1)设置签名系统参数
①直接点击“测试曲线”按钮,使用系统初始预设的椭圆曲线参数,如图1.1.8-39所示。
图1.1.8-39
②在文本框“素数p”,“常数a”和“常数b”内输入十进制非负整数;点击“测试”,如图
1.1.8-40所示。
图1.1.8-40
(2)注册用户
①在“用户名”文本框中输入一个“注册用户列表”中未出现的用户名,如“alice”,点击“注册”按钮,如错误!未找到引用源。
所示。
图1.1.8-41
②在“用户注册”窗口,可以“序号”或“坐标”确定生成元,如错误!未找到引用源。
所示。
图1.1.8-42
③点击选择“序号”,并在相应的文本框内输入一个小于“解点数”的十进制数值,然后点击“生成元测试”按钮,如图1.1.8-43所示。
图1.1.8-43
④点击选择“坐标”,并在相应的文本框内输入右边列表框中出现的一个坐标值,然后点击“生成元测试”按钮,如图1.1.8-44所示。
图1.1.8-44
⑤在文本框“私钥d”内输入一个小于生成元G的阶数的十进制非负整数,然后点击“确定”按钮;然后点击“计算公钥”按钮,得到对应的公钥,如图1.1.8-45所示。
图1.1.8-45
⑥点击“登记密钥”按钮,主窗口的“注册用户列表”中就会出现一个新的用户信息。
如图
1.1.8-46所示。
图1.1.8-46
⑦重复上述过程,产生不少于2个注册用户,如图1.1.8-47所示。
图1.1.8-47
(3)在“主窗口”中,点击“签名”,进入“签名”窗口,如图1.1.8-48所示。
图1.1.8-48
(4)确定签名方。
在“签名用户信息”中的“用户名”文本框中输入一个已经注册的用
户名,然后点击“确认”按钮,即得到签名方的一些基本信息,如图1.1.8-49所示。
图1.1.8-49
(5)签名运算。
①输入签名消息。
在“明文M”文本框中输入一个小于n的十进制非负整数,作为欲签名的消息;在“随机数k”文本框中输入一个小于的十进制非负整数,作为共享密钥的初始信息;然后点击“确定”按钮,如图1.1.8-50所示。
图1.1.8-50
②签名。
点击“签名”按钮,得到该消息的保密签名结果,如图1.1.8-51所示。
图1.1.8-51
注:“验证信息”暂时为空,等验证方验证后,自动填充该消息。
③发送签名。
点击“发送签名”按钮,激活验证签名窗口,等待验证方验证。
(6)在“主窗口”中,点击“验证签名”,进入“验证签名”窗口,如图1.1.8-52所示。
图1.1.8-52
(7)确定验证方。
在“验证方基本信息”中的“用户名UID”文本框中输入一个已经注
册的用户名,点击“获取私钥”按钮,即得到验证方的一些基本信息,如图1.1.8-53所示。
图1.1.8-53
(8)验证签名。
点击“验证”按钮,验证结果将会出现在“验证结果”文本框中,如图
1.1.8-54所示。
图1.1.8-54
(9)点击“发送确认”按钮,将验证结果通知签名方。
(三)算法跟踪
在“算法跟踪”框下点击“取得ECC密钥”/“获得ECC签名”/“验证ECC签名”按钮,进入调试器,选择对应的算法函数对ECC密钥生成、ECC签名生成、ECC签名验证进行算法跟踪;跟踪完成后会自动返回实验界面显示计算结果;切换回调试器,停止调试,关闭调试器,不保存工程。
具体步骤可参照古典密码实验中实验步骤二。
实验实施
【实验思考】
参照实验原理,对应各部分的签名运算和验证,分析各个算法签名与验证过程的异同参照实验原理,根据算法跟踪实验画出各个算法函数的主要流程图
总结三种签名算法的优缺点,并分析其安全性。