实验三DSA数字签名算法
2数字签名实验

数字签名实验【实验内容】通过运算器工具完成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(即签名);其输出是验证成功或失败的标记号。
DSA实验

实验步骤
运行DSAToolv13.exe,运行界面如下:
实验步骤
先点击“Start”,在弹出的对话框中选择“是”,并 随意在框架内移动鼠标,生成一个随机数种子。
实验步骤
随机数种子生产完毕后,会在DSAToolv13.exe同目 录下产生一个新文件dsaseed.rnd。若之前已经存在 此文件则直接点击“Generate”按钮。
实验步骤
从前面的DSA算法原理可知界面中各项数据的含义。 下面点击“Test”,用产生的密钥对消息进行签名并 验证。
DSA算法 算法
Digital Signature Algorithm (DSA)是Schnorr和ElGamal 签名算法的变种,被美国NIST作为DSS(Digital Signature Standard)。 算法中应用了下述参数: p:L bits长的素数。L是64的倍数,范围是512到1024; q:p - 1的160bits的素因子; g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1; x:x < q,x为私钥 ; y:y = g^x mod p ,( p, q, g, y )为公钥; H( x ):One-Way Hash函数。DSS中选用SHA( Secure Hash Algorithm )。 p, q, g可由一组用户共享,但在实际应用中,使用公共模 数可能会带来一定的威胁。
实验2 数字签名及典型协议 实验2
实验目的
通过对数字签名软件的使用,加深对 数字签名原理和过程的了解。实验会给 出有关数字签名技术的典型协议。结合 这些协议充分理解DSA和ECDSA数字 签名技术。
实验原理
数字签名算法-RSA、DSA、ECDSA、ECDH

数字签名算法-RSA、DSA、ECDSA、ECDH数字签名算法介绍和区别原⽂阅读:数字签名是⼀个带有密钥的消息摘要算法,这个密钥包括了公钥和私钥,⽤于验证数据完整性、认证数据来源和抗否认,遵循OSI参考模型、私钥签名和公钥验证。
也是⾮对称加密算法和消息摘要算法的结合体,常见的数字签名算法主要有RSA、DSA、ECDSA三种,本⽂对数字签名算法进⾏详细介绍。
Hash⼜译散列、摘要等名,本⽂统⼀称Hash。
1. RSA数字签名算法RSA是⽬前计算机密码学中最经典算法,也是⽬前为⽌使⽤最⼴泛的数字签名算法,RSA数字签名算法的密钥实现与RSA的加密算法是⼀样的,算法的名称都叫RSA。
密钥的产⽣和转换都是⼀样的,包括在售的所有SSL数字证书、代码签名证书、⽂档签名以及邮件签名⼤多都采⽤RSA算法进⾏加密。
RSA数字签名算法主要包括MD和SHA两种算法,例如我们熟知的MD5和SHA-256即是这两种算法中的⼀类,具体如下表格分布1.1. MD2、MD4、MD5算法最常见的是我们熟知的MD5加密算法,MD5全称Message-Digest Algorithm 5(信息-摘要算法 5),⽬前⽐较普遍的Hash算法,是散列算法的基础原理,MD5的前⾝有MD2、MD3和MD4。
MD5算法法是输⼊任意长度字符,输出固定长度128位的算法。
经过程序流程,⽣成四个32位数据,最后联合起来成为⼀个128位Hash值,主要⽅式是通过求余、取余、调整长度、与链接变量进⾏循环运算进⽽得出结果。
1.2. SHA-1算法SHA-1是由NIST NSA设计为同DSA⼀起使⽤的,SHA-1设计时基于和MD4相同原理,并且模仿了该算法,SHA-1抗穷举(brute-force)性更好,它产出160位的Hash值,对于⾮线性运算、移位和加法运算也与MD5类似。
SHA-1也应⽤于包括TLS和SSL、PGP、SSH、S/MIME和IPsec等多种协议中,曾被视为是MD5的后继者。
数字签名算法实验报告

竭诚为您提供优质文档/双击可除数字签名算法实验报告篇一:数字签名实验报告附件2:北京理工大学珠海学院实验报告ZhuhAIcAmpAusoFbeIJIngInsTITuTeoFTechnoLogY实验题目数字签名实验实验时间20XX.4.8一、实验目的:(1)掌握数字签名技术的原理;(2)熟悉密钥的生成及其应用。
二、实验内容以及步骤:RsA-pKcs签名算法(一)签名及验证计算(1)进入实验实施,默认选择即为“RsA-pKcs”标签,显示RsA-pKcs签名实验界面。
(2)选择明文格式,输入明文信息。
点击“计算shA1值”按钮,生成明文信息的散列值。
(3)选择密钥长度,此处以512bit为例,点击“生成密钥对”按钮,生成密钥对和参数。
选择“标准方法”标签,在标签下查看生成的密钥对和参数。
(4)标准方法签名及验证点击“标准方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果;上述过程如图1.1.8-3所示。
(5)选择“中国剩余定理方法”标签,在标签下查看生成的密钥对和参数。
(6)中国剩余定理方法签名及验证点击“中国剩余定理方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果。
eLgAmAL签名算法(1)在“RsA-pKcs”标签下的扩展实验中,点击“eLgAmAL 扩展实验”按钮,进入eLgAmAL签名算法扩展实验窗体。
(2)设置签名系统参数。
在文本框“大素数p”内输入一个大的十进制素数(不要超过8位);然后在文本框“本原元a”内输入一个小于p的十进制正整数,点击“测试”。
(3)注册用户,在“用户名”文本框中输入一个“注册用户列表”中未出现的用户名,如“alice”,点击“注册”按钮。
(4)在“用户注册”窗口中的文本框“私钥x”中输入一个小于素数p的十进制非负整数,点击“确定”按钮;然后,点击“计算公钥”按钮,系统会为该用户生成一对公私钥。
DSA数字签名算法

DSA数字签名算法DSA数字签名算法1 引言为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。
其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。
DSA(Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。
DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。
它也可用于由第三方去确定签名和所签数据的真实性。
DSA 算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。
2. 数字签名2.1 数字签名的概念数字签名在ISO7498—2标准中定义为:“附加在数据单元上的一些数据,或是对数据单元所作的密码变换,这种数据和变换允许数据单元的接收者用以确认数据单元来源和数据单元的完整性,并保护数据,防止被人(例如接收者)进行伪造”。
数字签名是通过一个单向函数对要传送的信息进行处理得到的用以认证信息来源并核实信息在传送过程中是否发生变化的一个字母数字串。
数字签名提供了对信息来源的确定并能检测信息是否被篡改。
数字签名要实现的功能是我们平常的手写签名要实现功能的扩展。
平常在书面文件上签名的主要作用有两点,一是因为对自己的签名本人难以否认,从而确定了文件已被自己签署这一事实;二是因为自己的签名不易被别人模仿,从而确定了文件是真的这一事实。
采用数字签名,也能完成这些功能:(1)确认信息是由签名者发送的;(2)确认信息自签名后到收到为止,未被修改过;签名者无法否认信息是由自己发送的。
数字签名和手签的区别是:手签是模拟的,易伪造,而数字签名是基于数学原理的,更难伪造。
数字签名的技术基础是公钥密码技术。
密钥必须以某种安全的方式告诉解密方。
dsa的原理与应用

DSA的原理与应用1. DSA的简介DSA(Digital Signature Algorithm)是一种数字签名算法,用于在公共网络中确保数据的完整性、认证和不可否认的功能。
DSA算法是基于离散对数问题的数学原理,结合了哈希函数和密码学的技术,能够有效地防止数据被篡改和伪造。
2. DSA的原理DSA的原理主要基于离散对数问题和模幂运算。
其关键步骤包括:密钥生成、签名生成和签名验证。
2.1 密钥生成首先,系统需要生成一对公私钥。
私钥是一个大整数,只有持有私钥的人才能够进行签名生成操作;而公钥可以被任何人使用来验证签名。
密钥生成的具体步骤如下:1.选择一个大素数p和一个与p-1互质的整数q,其中q是p-1的一个因子。
2.选择一个整数g,满足g^((p-1)/q) ≡ 1 (mod p)。
g也被称为生成元。
3.选择一个整数x,满足 0 < x < q,作为私钥。
4.计算y ≡ g^x (mod p),作为公钥。
2.2 签名生成当一个用户需要对一份数据进行签名时,需要使用私钥进行签名生成操作。
签名生成的具体步骤如下:1.计算一个随机数k,满足 0 < k < q。
2.计算r ≡ (g^k mod p) mod q。
3.计算s ≡ k^(-1) (SHA(m) + xr) mod q,其中SHA(m)是对原始数据进行哈希计算得到的值。
4.签名结果为(r, s)。
2.3 签名验证当接收到带有数字签名的数据时,可以使用公钥进行签名验证,确保数据的完整性和真实性。
签名验证的具体步骤如下:1.首先,验证r和s是否在1和q-1之间。
2.计算w ≡ s^(-1) mod q。
3.计算u1 ≡ SHA(m) · w mod q。
4.计算u2 ≡ r · w mod q。
5.计算v ≡ ((g^u1 · y^u2) mod p) mod q。
6.如果v等于r,则签名验证成功,否则签名验证失败。
密码学实验-实验6 DSA数字签名算法

实验报告一、实验目的理解DSA算法原理二、实验内容与设计思想数字签名是一种以电子形式给消息签名的方法,是只有信息发送方才能进行的签名、信息发送方进行签名后将产生一段任何人都无法伪造的字符串,这段特殊的字符串同时也是对签名真实性的一种证明。
电子信息在传输过程中,通过数字签名达到与传统手写签名相同的效果。
数字签名的实现原理简单地说,就是发送方利用hash算法对要传送的信息计算得到一个固定长度的消息摘要值,用发送方的私钥加密此消息的hash值所生成的密文即数字签名;然后将数字签名和消息一同发送给接收方。
接收方收到消息和数字签名后,用同样的hash算法对消息进行计算,得到新的hash值,再用发送方的公钥对数字签名解密,将解密后的结果与新的hash值比较,如果相等则说明消息确实来自发送方。
DSA(Digital Signature Algorithm)源于ElGamal和Schnorr签名算法,1991年被美国NIST采纳为数字签名标准DSS(Digital Signature Standard),具体实现过程参见图1。
DSS安全性基于有限域求离散对数的困难性,算法描述如下:1.密钥生成算法1)选取160比特长的素数q和L比特长的素数p,满足q|(p−1),其中L≡0(mod 64)且512≤L≤1024;2)随机选取正整数h,1<h<(p-1),令g=h(p−1)/q mod p>1;q,p和g作为系统公开参数;3)每个用户,随机选取正整数x,1≤x≤q−1,计算y=g x mod p;用户的公钥为y,私钥为x。
2.签名算法对于消息M,首先随机选取整数k,1≤k≤p−2,计算r=(g k mod p) mod qs=(H(M)+xr)k−1mod q则M的签名为(r,s),其中H为Hash函数SHA。
3.验证算法接收方收到消息M′和签名(r′,s′)后,计算e1=H(M′)s′−1mod qe2=r′s′−1mod q验证等式(g e1y e2mod p) mod q如果v=r′成立,则说明消息确实来自发送方。
数字签名第一次实验报告

数字签名实验【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验步骤】一、RSA-PKCS签名算法(一)签名及验证计算(1)进入实验实施,默认选择即为“RSA-PKCS”标签,显示RSA-PKCS签名实验界面。
(2)选择明文格式,输入明文信息。
(3)点击“计算SHA1值”按钮,生成明文信息的散列值,如图1.1.8-1所示。
(4)选择密钥长度,此处以512bit为例,点击“生成密钥对”按钮,生成密钥对和参数。
(5)选择“标准方法”标签,在标签下查看生成的密钥对和参数,如图1.1.8-2所示。
(6)标准方法签名及验证点击“标准方法”标签下的“获得签名值”按钮,获取明文摘要的签名值,签名结果以十六进制显示于相应的文本框内;点击“验证签名”按钮,对签名结果进行验证,并显示验证结果;上述过程如图1.1.8-3所示。
(二)扩展实验(1)设置签名系统参数①直接点击“测试素性”按钮,使用系统初始预设的RSA参数,如图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所示。
dsa签名算法原理

dsa签名算法原理DSA签名算法原理密钥技术是保证网络安全的基本保障。
密钥技术中的数字签名是保证安全的重要手段之一。
DSA(Digital Signature Algorithm,数字签名算法)是美国国家标准技术研究所(NIST) 在1992年制定的一种数字签名算法,DSA算法在保证有效性和安全性的具有使用方便,计算速度快等特点。
`本文将对DSA算法原理进行介绍。
`1. 数字签名的定义数字签名是一种理论上可行且在现实环境中被广泛使用的技术,它能够保证消息的真实性、完整性和不可抵赖性。
数字签名是利用公开密钥技术,将发送者的身份和在一条消息中所包含的信息相关联,然后再以一种无法伪造的方式将其与消息一同传送给接收者。
2. DSA签名算法的定义DSA算法是一种基于离散对数问题的数字签名算法,其根据数论中离散对数问题的难解性原理来保证数字签名的安全性。
DSA算法主要包括两部分:密钥生成和签名验证。
DSA 算法生成的密钥可以用于数字签名和验证,其具备保密性,防止密钥被暴力破解后将会导致密文信息的泄漏,同时还具有生成速度快的缺点。
3. DSA算法原理DSA算法的核心思想是基于离散对数问题的难解性,其大致过程如下:(1) `密钥生成`:选择一个大的质数q,并且一个大质数p,q满足p-1能够被q整除;选择两个数h和g,h是一个小于(p-1)自然数,且g=h^[(p−1)/q] mod p,g的阶为q,即g^q mod p=1,g 是模p的一个原根;在Zq中随机选择一个小于q的整数x作为私钥,计算出y=g^x mod p,并将公钥(p,q,g,y)公开。
(2) `签名过程`:接收到需要签名的信息m之后,按照如下步骤进行签名处理:a. 选择一个小于q的整数k,并计算出r=(g^k mod p) mod q;b. 计算s=k^-1 * (Hash(m) + xr) mod q;c. 签名:(r,s) 是签名结果。
(3) `验证过程`:接收到签名信息后,根据公钥进行消息的验证,具体的过程如下a. 验证签名值r和s是否在区间(0, q)内,若不在,则认为验证失败;b. 计算w=s^-1 mod p,并计算出u1= (Hash(m) * w) mod q和u2= (r * w) mod q;c. 计算v= ((g^u1 * y^u2) mod p) mod q;d. 验证(v=r)是否成立,成立则签名验证通过,否则验证失败。
DSA系统实验报告

DSA系统实验报告DSA系统实验报告一、引言数据结构与算法(DSA)是计算机科学中非常重要的一门课程,它涉及到了计算机程序的核心基础。
在本次实验中,我们将探索DSA系统的设计与实现,并通过实验来验证其功能和性能。
本文将详细介绍实验的背景、目的、方法、结果和讨论。
二、实验背景数据结构与算法是计算机科学的基础,它为解决实际问题提供了重要的工具和方法。
DSA系统是为了帮助学生学习和理解数据结构与算法而设计的一种教学工具。
通过使用DSA系统,学生可以更加直观地了解数据结构的内部实现和算法的执行过程,提高他们的编程能力和问题解决能力。
三、实验目的本次实验的主要目的是设计并实现一个简单的DSA系统,通过该系统来演示和验证一些经典的数据结构和算法。
具体目标包括:1. 实现常见的数据结构,如数组、链表、栈、队列、二叉树等;2. 实现常见的算法,如排序算法、查找算法、图算法等;3. 提供友好的用户界面,使学生能够直观地操作和观察数据结构和算法的执行过程;4. 分析和评估不同数据结构和算法的性能,帮助学生理解其优缺点。
四、实验方法为了实现上述目标,我们采用了以下的实验方法:1. 使用面向对象的编程语言,如Java或C++,以便更好地实现数据结构和算法的抽象和封装;2. 设计合理的类和接口,以实现各种数据结构和算法,并提供必要的操作和方法;3. 设计用户界面,使学生能够通过图形化界面来操作和观察数据结构和算法的执行过程;4. 设计测试用例,验证数据结构和算法的正确性,并分析其性能。
五、实验结果经过一段时间的设计和开发,我们成功地实现了一个简单的DSA系统。
该系统包括了常见的数据结构和算法,并提供了直观的用户界面。
学生可以通过该系统来学习和理解数据结构和算法的内部实现和执行过程。
我们进行了一系列的测试,验证了系统的正确性和性能。
六、实验讨论在实验过程中,我们发现了一些问题和挑战。
首先,设计和实现数据结构和算法需要深入理解其原理和特点,这对于初学者来说可能是一项挑战。
实验三-DSA数字签名算法

实验三DSA数字签名算法姓名:学号:学院:信息工程学院指导老师:郑明辉1.DSA算法原理数字签名是数据在公开行信道中传输的安全保障,能够实现数据的公开、公正、不可抵赖等特点的方法,只能公开的密钥、密码签名算法。
国际供认的公开密钥签字算法主要有RSA算法、ElGAMAL算法或者其变形的签名算法。
DSA(Digite Signature Arithmotic )是Schnore和ElGamal算法的变型。
美国国家标准技术研究所(NIST)1994年5月19日公布了数字签名标准的(DSS),标准采用的算法便是DSA,密钥长度为512~1024位。
密钥长度愈长,签名速度愈慢,制约运算速度的只要因素是大数的模指数运算。
2.DSA签名中的参数参数描述:Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。
算法中应用了下述参数:p:L bits长的素数。
L是64的倍数,范围是512到1024;q:p - 1的160bits的素因子;g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1;x:x < q,x为私钥;y:y = g^x mod p ,( p, q, g, y )为公钥;H( x ):One-Way Hash函数。
DSS中选用SHA( Secure Hash Algorithm )。
p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。
签名及验证协议如下:1. P产生随机数k,k < q;2. P计算r = ( g^k mod p ) mod qs = ( k^(-1) (H(m) + xr)) mod q签名结果是( m, r, s )。
3. 验证时计算w = s^(-1)mod qu1 = ( H( m ) * w ) mod qu2 = ( r * w ) mod qv = (( g^u1 * y^u2 ) mod p ) mod q若v = r,则认为签名有效。
DSA算法

BigInteger kInv=k.modInverse(g.getQ()); return sign(g, x, r, kInv, m); }
public static DSASignature sign(DSAGroup g, DSAPrivateKey x,
BigInteger m,
Random r) {
import net.i2p.util.NativeBigInteger;
/** * Implements the Digital Signature Algorithm (DSA) described in FIPS186 */ public class DSA {
/** * Returns a DSA signature given a group, private key (x), a random nonce * (k), and the hash of the message (m). */ public static DSASignature sign(DSAGroup g, DSAPrivateKey x, BigInteger k, BigInteger m) { BigInteger r=g.getG().modPow(k, g.getP()).mod(g.getQ());
//FIXME: is there a better way to handle this exception raised on the 'w=' line above? } catch (ArithmeticException e) { // catch error raised by invalid data return false; // and report that that data is bad. } }
数字签名实验

实验三 数字签名实验【实验目的】1、 了解公开密钥算法、摘要算法的概念和原理。
2、 掌握数字签名的原理。
3、 编写程序,利用数字签名实现对本机文件的完整性保护。
【实验内容】1、 对文件进行签名保护和完整性验证过程如下图所示:其中,签名所使用的摘要函数可使用md5、SHA1等函数,公开密钥算法可使用RSA 算法。
密钥长度1024位。
数字签名所需的私钥存放在PKCS12文件中,公钥信息以X509v3格式存放在数字证书中,该证书以DER 编码文件形式存放。
2、按照上图所示的文件完整性保护过程编写程序,该程序应能实现以下内容:(1)提供一个主运行界面,能在该界面里选择公钥证书存放路径和私钥文件存放路径。
(2)能提供对目录的可视浏览,能够选择一个或多个需要进行完整性保护的文件或目录。
(3)能对所选的文件进行数字签名。
(4)提供一个已签名文件的列表,能够在列表中选择一个或多个文件进行完整性验证,并能在文件被改动后提示用户。
【实验环境】(1) 生成好的数字证书和私钥,以PKCS12文件形式存放。
签名数据库签名数据库摘要算法摘要算法生成签名过程验证过程(2)测试用客户机一台,安装windows2000 professional系统。
【实验参考步骤】1、选定进行数字签名和验证所需的PKCS12文件。
2、在文件选择对话框中选择需要进行数字签名的文件,分别对所选中的文件的内容进行摘要,从PKCS12文件中提取私钥,对摘要值用私钥进行加密,形成数字签名。
3、将每个文件的数字签名保存在数据库中,也可保存在目录中,但须考虑签名的安全性。
4、对所选文件进行修改后再运行程序,在已签名文件中选择部分或全部文件,按照前述过程进行完整性检查,程序以特殊标记显示所有完整性被破坏的文件。
【实验报告】1、阐述本实验中的数字签名原理。
2、提交实验数据结论,并进行结果分析。
【实验预备知识】1、数字签名原理在日常生活中,经常需要人们签署各种信件和文书,随着信息时代的来临,人们希望对越来越多的电子文件进行迅速的、远距离的签名,这就是数字签名。
DSA签名技术

2021/4/8
5
DSA与RSA的比较
DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多,速度比较快。
DSA的一个重要特点是两个素数公开,这 样,当使用别人的p和q时,即使不知道私钥,你也能确认 它们是否是随机产生的,还是作了手脚。RSA算法却作不到。
DSA是一种更高级的验证方式。一般用于数字签名和认证。
DSA 不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。 在DSA数字签名和认证中,发送者使用自己的私钥对文件或消息进行签名,接受者收到消息后 使用发送者的公钥来验证签名的真实性。如果数据和签名不匹配则认为验证失败!数字签名的 作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级!
r不依赖消息,是k和全局公钥的函数。故对一个消息存在许多签名 离散对数的困难:从r恢复k是很困难的,从s恢复x是不可行的
10. Bob 将收到的信息摘要B和新产生的信息摘B’要进行比较,如果一致,说明收到的信息 没有被修改
过。 2021/4/8
3
签名过程图示
2021/4/8
4
SA签名技术简介
DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为 DSS(DigitalSignature Standard)。 DSA是基于整数有限域离散对数难题的。
DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名, 它比RSA要快很多.
DSA算法

如 (2*5) mod 3 = 1 , 则 2 和 5 互为 模数3 的逆元。 2)、SHA(M ):M的Hash值,M为待签署的 明文。SHA是一个单向散列函数。DSS中 选用SHA1( FIPS180: Secure Hash Algorithm ),此时SHA(M) 为160bits长的数 字串(16进制),其满足不可逆和抗碰撞 性。(3)、最终的签名就是整数对( r , s ), 它们和 M 一起发送到验证方。 4)、尽管 r 和 s 为 0 的概率相当小,但只要 有任何一个为0, 必须重新生成 k ,并重新 计算 r 和 s 。
因为 9^(-1)=9 mod 10,所以 s=9*(5-8*6) =3 所以,签名是 (r=6,s=3) 要认证签名,确认: 3^6 * 6^3 mod 11= 2^5 mod 11=4
DSA算法
1.Digital Signature Algorithm (DSA)是 Schnorr和ElGamal签名算法的变种,被美国 NIST作为DSS(DigitalSignature Standard)。 它是一种公开密钥算法,它不能用作加密, 只用作数字签名。DSA使用公开密钥,为接 受者验证数据的完整性和数据发送者的身份。 它也可用于由第三方去确定签名和所签数据 的真实性。 2.信息交流中,接收方希望收到的信息未被 窜改(信息完整性),还希望接收到的信息确由 自己认定的发送方所发(信息来源有效性),
DSA算法——本质上和RSA是一样的有公钥和私钥

DSA算法——本质上和RSA是⼀样的有公钥和私钥DSA算法DSA(Digital Signature Algorithm)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。
DSA加密算法主要依赖于整数有限域离散对数难题,素数P必须⾜够⼤,且p-1⾄少包含⼀个⼤素数因⼦以抵抗Pohlig &Hellman算法的攻击。
M⼀般都应采⽤信息的HASH值。
DSA加密算法的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的⼤素数因⼦不可约。
其安全性与RSA相⽐差不多。
DSA ⼀般⽤于数字签名和认证。
在DSA数字签名和认证中,发送者使⽤⾃⼰的私钥对⽂件或消息进⾏签名,接受者收到消息后使⽤发送者的公钥来验证签名的真实性。
DSA只是⼀种算法,和RSA不同之处在于它不能⽤作加密和解密,也不能进⾏密钥交换,只⽤于签名,它⽐RSA要快很多.1. DSA签名及验证DSA算法中应⽤了下述参数:p:L bits长的素数。
L是64的倍数,范围是512到1024;q:p – 1的160bits的素因⼦;g:g = h^((p-1)/q) mod p,h满⾜h < p – 1, h^((p-1)/q) mod p > 1;x:x < q,x为私钥;y:y = g^x mod p ,( p, q, g, y )为公钥;H( x ):One-Way Hash函数。
DSS中选⽤SHA( Secure Hash Algorithm )。
p, q, g可由⼀组⽤户共享,但在实际应⽤中,使⽤公共模数可能会带来⼀定的威胁。
签名及验证协议:1.P产⽣随机数k,k < q;2.P计算 r = ( g^k mod p ) mod qs = ( k^(-1) (H(m) xr)) mod q签名结果是( m, r, s )。
dsa加密算法python程序

dsa加密算法python程序DSA(Digital Signature Algorithm)是一种用于数字签名的公钥密码体制,常用于数据完整性验证和身份认证。
在Python中,我们可以使用PyCryptodome库来实现DSA加密算法。
首先,确保你已经安装了PyCryptodome库,如果没有安装,可以使用pip来安装: python.pip install pycryptodome.接下来,我们可以编写一个简单的Python程序来演示DSA数字签名的生成和验证过程:python.from Crypto.PublicKey import DSA.from Crypto.Signature import DSS.from Crypto.Hash import SHA256。
# 生成DSA密钥对。
key = DSA.generate(1024)。
# 要签名的数据。
data = b"Hello, this is a message to be signed" # 使用SHA256进行哈希。
hash_obj = SHA256.new(data)。
# 创建签名对象。
signer = DSS.new(key, 'fips-186-3')。
# 生成数字签名。
signature = signer.sign(hash_obj)。
# 验证签名。
verifier = DSS.new(key, 'fips-186-3')。
try:verifier.verify(hash_obj, signature)。
print("Signature is valid.")。
except ValueError:print("Signature is invalid.")。
在这个示例中,我们首先生成了一个1024位的DSA密钥对,然后创建了要签名的数据,并使用SHA256进行哈希。
dsa算法数字签名过程

dsa算法数字签名过程
DSA(Digital Signature Algorithm)是一种数字签名算法,用于确保数字数据的验证和完整性。
以下是DSA算法数字签名过程的一般步骤:
1. 密钥生成:首先,使用特定的算法生成公钥和私钥。
公钥是公开的,用于验证数字签名的有效性。
私钥是私有的,只有签名者知道,并用于生成数字签名。
2. 消息摘要:将要签名的消息通过哈希函数生成一个消息摘要。
这个摘要是消息的唯一数字指纹。
3. 数字签名生成:使用私钥和消息摘要生成数字签名。
这个数字签名包含了消息的哈希值和签名者的私钥信息。
4. 验证签名:接收者使用签名者的公钥来验证数字签名的有效性。
如果数字签名有效,那么接收者可以确认消息的完整性和来源。
以上步骤保证了消息的完整性和安全性,同时可以确保签名者的身份。
Java数字签名算法DSA实例详解

Java数字签名算法DSA实例详解本⽂实例讲述了Java数字签名算法DSA。
分享给⼤家供⼤家参考,具体如下:⼀、介绍DSS:Digital Signature Standard 数字签名标准DSA:Digital Signature Algorithm 数字签名算法DSA仅包含数字签名⼆、参数说明三、代码实现package com.imooc.security.dsa;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.DSAPrivateKey;import java.security.interfaces.DSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import mons.codec.binary.Hex;public class ImoocDSA {private static String src = "cakin24 security dsa";public static void main(String[] args) {jdkDSA();}public static void jdkDSA() {try {//1.初始化密钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();DSAPrivateKey dsaPrivateKey = (DSAPrivateKey)keyPair.getPrivate();//2.执⾏签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("DSA");PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("SHA1withDSA");signature.initSign(privateKey);signature.update(src.getBytes());byte[] result = signature.sign();System.out.println("jdk dsa sign : " + Hex.encodeHexString(result));//3.验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded());keyFactory = KeyFactory.getInstance("DSA");PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("SHA1withDSA");signature.initVerify(publicKey);signature.update(src.getBytes());boolean bool = signature.verify(result);System.out.println("jdk dsa verify : " + bool);} catch (Exception e) {e.printStackTrace();}}}四、实现效果jdk dsa sign :302c021*******f9e19ec98167a687eb4e8f91e7f47326bf021428080b7f0ad2ccffc71466998d8d364ba516e840 jdk dsa verify : true五、应⽤场景PS:关于加密解密感兴趣的朋友还可以参考本站在线⼯具:更多关于java相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》和《》希望本⽂所述对⼤家java程序设计有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三DSA数字签名算法
姓名:
学号:
学院:信息工程学院
指导老师:***
1.DSA算法原理
数字签名是数据在公开行信道中传输的安全保障,能够实现数据的公开、公正、不可抵赖等特点的方法,只能公开的密钥、密码签名算法。
国际供认的公开密钥签字算法主要有RSA算法、ElGAMAL算法或者其变形的签名算法。
DSA(Digite Signature Arithmotic )是Schnore和ElGamal算法的变型。
美国国家标准技术研究所(NIST)1994年5月19日公布了数字签名标准的(DSS),标准采用的算法便是DSA,密钥长度为512~1024位。
密钥长度愈长,签名速度愈慢,制约运算速度的只要因素是大数的模指数运算。
2.DSA签名中的参数
参数描述:Digital Signature Algorithm (DSA)是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。
算法中应用了下述参数:
p:L bits长的素数。
L是64的倍数,范围是512到1024;
q:p - 1的160bits的素因子;
g:g = h^((p-1)/q) mod p,h满足h < p - 1, h^((p-1)/q) mod p > 1;
x:x < q,x为私钥;
y:y = g^x mod p ,( p, q, g, y )为公钥;
H( x ):One-Way Hash函数。
DSS中选用SHA( Secure Hash Algorithm )。
p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。
签名及验证协议如下:
1. P产生随机数k,k < q;
2. P计算r = ( g^k mod p ) mod q
s = ( k^(-1) (H(m) + xr)) mod q
签名结果是( m, r, s )。
3. 验证时计算w = s^(-1)mod q
u1 = ( H( m ) * w ) mod q
u2 = ( r * w ) mod q
v = (( g^u1 * y^u2 ) mod p ) mod q
若v = r,则认为签名有效。
DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。
DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。
RSA算法却做不到。
3.源码描述
#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include "BigInt.h"
#include "sha1.h"
#include "time.h"
int shas1(const unsigned int x[], unsigned char digest[20]) {
SHA1_CTX context;
unsigned char buffer[16384]; //,digest[20];
// FILE *file;
SHA1Init(&context);
SHA1Update(&context, buffer, 1);
SHA1Final(digest, &context);
return 0;
}
CBigInt sha(CBigInt y)
{
SHA1_CTX context;
CBigInt X;
unsigned char buffer[16384],digest[20];
CString str;
char *t="0123456789ABCDEF";
if((y.m_nLength==1)&&(y.m_ulValue[0]==0))
{
str="0";
X.Mov(0);
return X;
}
str="";
int a;
char ch='\0';
str.Insert(0,ch);
X.Mov(y);
while(X.m_ulValue[X.m_nLength-1]>0)
{
a=X.Mod(16);
ch=t[a];
str.Insert(0,ch);
X.Mov(X.Div(16));
}
int i=0;
while (str[i]>0)
i++;
for (a=i,i=0;i<a;i++)
buffer[i]=str[i];
for (i=a;i<64;i++) buffer[i]='\0';
SHA1Init(&context);
SHA1Update(&context, buffer, 1);
SHA1Final(digest, &context);
int len=str.GetLength(),k;
X.Mov(0);
for(i=0;i<20;i++)
{
X.Mov(X.Mul(256));
// if((digest[i]>='0')&&(digest[i]<='9'))
k=digest[i];
// else if((digest[i]>='A')&&(digest[i]<='F'))k=digest[i]-55; // else if((digest[i]>='a')&&(digest[i]<='f'))k=digest[i]-87; // else k=0;
X.Mov(X.Add(k));
}
return X;
}
CBigInt makerandnumber( unsigned int len)
{
srand(time(NULL));
CBigInt X;
X.m_nLength=(len+31)/32;
// X.Mov(0);
for (unsigned int j=0;j<X.m_nLength;j++)
{
X.m_ulValue[j]=rand()*0x10000+rand();
}
X.m_ulValue[0]=X.m_ulValue[0]|0x1;
X.m_ulValue[j-1]=X.m_ulValue[j-1]|0x80000000;
return X;
}
CBigInt pow2( const int x, int y)
{
CBigInt p,q,t;
p.Mov(1);
q.Mov(x);
while (y>0)
{
if (y%2==0) {q.Mov(q.Mul(q)); y /= 2 ; }
else { p.Mov(p.Mul(q)); y -= 1; }
}
return p;
}
CBigInt pow3(CBigInt x, CBigInt y, CBigInt m)
{
CBigInt p,t;
p.Mov(1);
t.Mov(0);
while (y.Cmp(t)>0)
{
if (y.m_ulValue[0]&0x1==0)
{x.Mov(x.Mul(x)); x.Mov(x.Mod(m)); x.Mov(x.Div(2)); } else {p.Mov(p.Mul(x)); p.Mov(p.Mod(m)); y.Mov(y.Sub(1)); } }
return p;
}
4.过程及结果截图描述
开始运行
选择512位密钥长度,点击公开参数,如下图
随便选择一个你要签名的文件,然后选择算法
点击数字签名
然后点击签名验证。