数字签名课程设计
- 格式:doc
- 大小:221.00 KB
- 文档页数:19
数字签名及哈希函数第一篇:数字签名及哈希函数数字签名与哈希函数懂得一点公钥密码基础知识的人都知道,发信息的人用自己的私钥对所发信息进行加密(Encryption),接收信息者用发信者的公钥来解密(Decryption),就可以保证信息的真实性、完整性与不可否认性。
(注:这里提到的加密、解密是指密码运算,其目的并非信息保密。
)那么,我们也可以笼统地说,以上方法就已经达到了数字签名的目的。
因为首先,私钥是发信者唯一持有的,别的任何人不可能制造出这份密文来,所以可以相信这份密文以及对应的明文不是伪造的(当然,发信者身份的确定还要通过数字证书来保证);出于同样原因,发信者也不能抵赖、否认自己曾经发过这份信息;另外,信息在传输当中不可能被篡改,因为如果有人试图篡改,密文就解不出来。
这样,用私钥加密,公钥解密的技术方法就可以代替传统签名、盖章,保证了信息的真实性、完整性与不可否认性。
但是,这样做在实际使用中却存在一个问题:要发的信息可能很长,非对称密码又比较复杂,运算量大,而为了保证安全,私钥通常保存在USB Key或IC卡中,加密运算也是在Key或卡中进行。
一般来说,小小的USB Key或IC卡中的微处理器都做得比较简单而处理能力较弱,这样,加密所用的时间就会很长而导致无法实用。
另外,即使对于网站服务器而言,虽然它的处理能力很强,但服务器要同时处理许许多多签名加密的事情,也同样存在着加密耗时长系统效率低的问题。
有没有解决这个问题的办法呢?有的,常用的方法是使用哈希函数。
什么是哈希函数哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。
1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。
信息安全课程设计说明书题目:DSA多功能数字签名院(系):计算机科学与工程学院专业:信息安全姓名:学号:指导教师:2014年1 月5日摘要随着计算机网络和信息技术的发展,信息安全在各领域发挥着越来越重要的作用,其中密码学已成为信息安全技术的核心,为了确保数据传输的安全性,不得不采取一系列的安全技术,如加密技术、数字签名、身份认证、密钥管理、防火墙、安全协议等。
其中数字签名就是实现网上交易安全的核心技术之一,它可以保证信息传输的保密性、数据交换的完整性、发送信息的不可否认性、交易者身份的确定性等。
DSA (Digital Signature Algorithm,数字签名算法,用作数字签名标准的一部分),它是另一种公开密钥算法,它不能用作加密,只用作数字签名。
DSA使用公开密钥,为接受者验证数据的完整性和数据发送者的身份。
它也可用于由第三方去确定签名和所签数据的真实性。
DSA算法的安全性基于解离散对数的困难性,这类签字标准具有较大的兼容性和适用性,成为网络安全体系的基本构件之一。
本文主要是介绍使用DSA算法完成的一个数字签名与验证的过程,可以导入导出密钥,进行哈希计算获取摘要,完成签名文件的并导出签名并可以在源文件的后面追加签名的信息,对于摘要的计算这里介绍了两种算法MD5和SHA-1。
这次的的课设主要是为了能够更好的了解和学习数字签名这方面的知识。
关键字: DSA算法数字签名密钥目录引言 (3)1 系统的需求 (3)1.1软件建设目标 (3)1.2系统功能需求 (3)1.3使用范围 (4)1.4故障处理 (4)1.5硬件环境 (4)2 系统的开发相关原理介绍 (4)2.1数字签名的介绍 (4)2.2DSA数字签名原理 (5)2.3SHA-1和MD5的介绍 (6)3 系统详细设计 (7)3.1系统结构 (7)3.2公钥和私钥的计算 (8)3.3摘要值的计算 (10)3.4文件的数字签名与验证 (12)3.5文件、密钥的导入导出 (15)3.6源文件和签名信息的提取 (16)3.7开发环境 (18)4 所遇到的问题和分析解决 (19)5 结论与心得 (20)参考文献 (22)引言随着电子商务的发展,网络上资金的电子交换日益频繁,如何防止信息的伪造和欺骗成为非常重要的问题。
c 签到系统课程设计一、课程目标知识目标:1. 让学生理解签到系统的基本原理和功能,掌握相关编程语言的基础知识。
2. 使学生掌握数据库的基本操作,如数据的增、删、改、查。
3. 帮助学生了解网络通信的基本概念,如HTTP请求和响应。
技能目标:1. 培养学生运用所学知识设计并实现一个简单的签到系统的能力。
2. 培养学生独立分析问题、解决问题的能力,提高编程实践技能。
3. 培养学生团队协作和沟通能力,能在项目中进行有效分工和合作。
情感态度价值观目标:1. 激发学生对计算机科学的兴趣,培养探究精神和创新意识。
2. 培养学生认真负责的态度,对待学习和项目任务有较高的执行力。
3. 培养学生遵守法律法规和道德规范,尊重知识产权,养成良好的网络素养。
课程性质:本课程为实践性较强的课程,结合编程语言、数据库和网络通信知识,设计一个具有实际应用的签到系统。
学生特点:学生具备一定的编程基础,对新鲜事物充满好奇心,喜欢动手实践,但可能缺乏独立分析和解决问题的经验。
教学要求:结合学生特点,采用任务驱动法,引导学生主动探究,注重理论与实践相结合,培养学生实际操作能力和团队协作能力。
通过本课程的学习,使学生达到上述课程目标,并能够将所学知识应用于实际项目中。
二、教学内容1. 签到系统概述:介绍签到系统的概念、应用场景和基本功能,引导学生了解课程背景和实际意义。
相关教材章节:第一章 引言2. 编程语言基础:回顾与签到系统相关的编程语言知识,如Python、Java 等,重点掌握数据类型、条件语句和循环语句。
相关教材章节:第二章 编程语言基础3. 数据库操作:讲解数据库的基本概念,学习MySQL等数据库的安装与使用,掌握数据的增、删、改、查操作。
相关教材章节:第三章 数据库操作4. 网络通信基础:介绍HTTP请求和响应的基本概念,学习使用网络编程库实现客户端与服务器之间的通信。
相关教材章节:第四章 网络通信基础5. 签到系统设计与实现:根据需求分析,设计签到系统的功能模块,学习编写代码实现各模块功能,并进行测试与优化。
《密码学》课程设计实验报告实验序号:06 实验项目名称:数字签名RSA签名RSA签名核心代码说明由于在实验报告5中已经对RSA的相关代码进行了分析,这里主要给出签名和验签的代码。
在对某个二进制文件进行签名之前,我们首先需要计算其数据摘要,这里我们采用md5哈希算法,其对应的代码如下md5哈希算法在RSA的签名中,其实就是用私钥进行解密的过程,其对应的代码如下RSA签名其中解密对应的代码如下,pow函数提供了快速幂的功能RSA解密在RSA验签的过程中,其实就是用公钥进行加密的过程,其对应的代码如下RSA验签其中加密对应的算法如下RSA加密RSA签名实验结果演示首先是计算待签名文件的md5值md5结果对得到的md5值进行签名,可以得到如下的结果RSA签名结果对签名进行验签,可以发现成功验证签名验证签名ECC签名代码整体说明相关文件(ecc.py)由于在前面的ECC加解密(实验报告5)中已经对ECC的相关接口进行了介绍,这里我们不再重复。
这里主要给出签名和验签的主要流程签名的主要流程如下1.选择一个随机数k,k∈{1,2,⋯,n−1}2.计算点R(x R,y R)=kG,并记r=x R3.利用保密的解密钥d计算s=(Hasℎ(m)−dr)k−1 (mod n)4.以<r,s>作为消息m的签名,并以<m,r,s>的形式传输或者存储验签的主要流程如下1.计算s−1 (mod n)2.利用公开的加密钥Q计算U(x U,y U)=s−1(Hasℎ(m)G−rQ)3.如果x U=r,则<r,s>是用户A对m的签名ECC签名核心代码说明由于在实验报告5中已经对ECC的相关代码进行了分析,这里主要给出签名和验签的代码。
进行签名的代码主要如下,可以发现和我们上面提到的签名步骤是一一对应的ECC签名进行验签的代码如下,和上述我们提到的验签步骤也是一一对应的ECC验签ECC签名实验结果演示同RSA签名一样,我们首先需要计算文件对应的数据摘要,这里我们使用md5哈希算法md5数据摘要接着对数据摘要进行签名,得到如下的签名结果ECC签名结果对得到的签名进行验签,可以发现成功验证ECC验签五、分析与讨论1)与ECC的签名相比,RSA的签名和验签显得更为优雅,即解密对应签名,加密对应验签2)和RSA签名相比,ECC引入了随机数k,使得即使对同一个数据进行签名,产生的结果也可能不一样,这在一定程度上增加了ECC签名的安全性3)与传统的分组密码相比,使用公钥密码实现数字签名非常方便且更加安全。
实验三 数字签名实验【实验目的】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、数字签名原理在日常生活中,经常需要人们签署各种信件和文书,随着信息时代的来临,人们希望对越来越多的电子文件进行迅速的、远距离的签名,这就是数字签名。
1.RSA数字签名的目的和意义RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛认可和应用。
发展至今,电子安全领域的各方面已经形成了较为完备的国际规范。
RSA作为最重要的公开密钥算法,在各领域的应用数不胜数。
RSA在硬件方面,以技术成熟的IC应用于各种消费类电子产品。
RSA在软件方面的应用,主要集中在Internet上。
加密连接、数字签名和数字证书的核心算法广泛使用RSA。
日常应用中,有比较著名的工具包Open SSL(SSL,Security Socket Layer,是一个安全传输协议,在Internet上进行数据保护和身份确认。
Open SSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang 等发起编写的。
Open SSL应用RSA实现签名和密钥交换,已经在各种操作系统得到非常广泛的应用。
另外,家喻户晓的IE浏览器,自然也实现了SSL协议,集成了使用RSA技术的加密功能,结合MD5和SHA1,主要用于数字证书和数字签名,对于习惯于使用网上购物和网上银行的用户来说,几乎天天都在使用RSA技术。
RSA更出现在要求高度安全稳定的企业级商务应用中。
在当今的企业级商务应用中,不得不提及使用最广泛的平台j2ee。
事实上,在j2se的标准库中,就为安全和加密服务提供了两组API:JCA和JCE。
JCA (Java Cryptography Architecture)提供基本的加密框架,如证书、数字签名、报文摘要和密钥对产生器;JCA由几个实现了基本的加密技术功能的类和接口组成,其中最主要的是java.security包,此软件包包含的是一组核心的类和接口,Java中数字签名的方法就集中在此软件包中。
JCE(Java Cryptography Extension) 在JCA的基础上作了扩展,JCE也是由几个软件包组成,其中最主要的是javax.crypto 包,此软件包提供了JCE加密技术操作API。
javax.crypto中的Cipher 类用于具体的加密和解密。
在上述软件包的实现中,集成了应用RSA 算法的各种数据加密规范(RSA算法应用规范介绍参见:/rsalabs/node.asp?id=2146 ,这些API内部支持的算法不仅仅只有RSA,但是RSA是数字签名和证书中最常用的),用户程序可以直接使用java标准库中提供的API进行数字签名和证书的各种操作。
2.数字签名算法的基本框架1.密钥的产生①选择两个保密的大素数P和q。
②计算N=p q,≯(N) =(p-1)(g-1),其中≯(N)是N的欧拉函数值。
③选择一个整数e,满足l<e<≯(N),且g c d(≯(N),e)≡1。
④计算私钥d(解密密钥),满足e d≡l(mod≯(N)),d是e在模≯(N)下的乘法逆元。
⑤以(e, n)为公钥,(d ,N)为密钥,销毁p,q,≯(N)。
2.加密加密时首先将明文比特串进行分组,使得每个分组对应得串在数值上小于N,即分组的二进制长度小于l092N。
然后,对每个明文分组M,作加密运算:C=E k(M)=M e mod N3.解密对密文分组的解密运算为:M=D k (C) =C d mod N由定理1和定理2可以证明解密运算能恢复明文M并非所有的公开密钥系统,均可同时达到秘密性与数字签名功能。
一般而言,一公开密钥系统若作为密码系统,则无法作为数字签名,反之亦然。
只有很少数的系统可同时作为密码系统和数字签名,如本文讨论的RSA系统。
RSA签名算法如下:设N=p q,且p和q是两个大素数,e和d满足e d≡l(mod ≯(N))。
公开密钥:N,e私有密钥:d签名过程:发送方使用自己的私钥d对明文m进行数字签名变换:y=x d mod N:并将加密后的消息和签名y发送给接收方;验证过程:接收方使用发送方的公钥e对收到的消息y进行数字签名验证变换x’=y e mod N,并使用发送方的密钥解密恢复消息x,比较x’与x,如果x’=x则证实发送方的身份合法。
这样,用户A若想用RSA签名方案对消息x签名,他只需公开他的公钥N和e,由于签名算法是保密的,因此A是唯一能产生签名的人,任何要验证用户A 签名的用户只需查到A的公钥即可验证签名。
对于实现签名和公钥加密的组合,常用方法是:假定通信双方为A和B。
对于明文x,A计算他的签名y=x d mod N,然后利用B的公开加密函数E B对信息对(x, y)加密得到Z,将密文Z传送给B,当B 收到密文Z后,他首先用他的解密函数D B来解密得到(x,y)=D B (Z)= D B(E B(x,y)),然后利用A的验证算法来检查x’=x=y e mod N是否成立。
3.主要模块的算法以及关键代码①.文件选择模块的主要算法及关键代码CfileDialog dlg(TRUE,NULL,".\\签名的文件",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL) ;if(dlg.DoModal()==IDOK){m_file_sign=dlg.GetPathName();}else m_file_sign="";UpdateData(FALSE);②.保存公钥的文件路径的主要算法及关键代码CFileDialog dlg(FALSE,NULL,".\\公钥",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL) ;if(dlg.DoModal()==IDOK){m_pkey_sign=dlg.GetPathName();}else m_pkey_sign="";UpdateData(FALSE);③.保存签名后的文件的路径主要算法及关键代码CFileDialog dlg(FALSE,NULL,".\\签名后的文件",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL) ;if(dlg.DoModal()==IDOK){m_signed_sign=dlg.GetPathName();}else m_signed_sign="";UpdateData(FALSE);④.数字签名的主要算法及关键代码HCRYPTPROV hProv;//秘钥容器句柄BYTE *pbBuffer;//被签名的数据HCRYPTHASH hHash;HCRYPTKEY hKey;BYTE *pbKeyBlob; //签名者得公钥数据BYTE *pbSignature; //数字签名DWORD dwSigLen;DWORD dwBlobLen;DWORD dwBufferLen;LPTSTR szDescription = "";CFile m_pubkey_file,m_sign_file,m_signdatafile;if(m_pkey_sign==""||!m_pubkey_file.Open(m_pkey_sign,CFile:: modeCreate|CFile::modeReadWrite)){MessageBox("请选择正确的保存公钥的文件路径");return;}if(m_file_sign==""||!m_signdatafile.Open(m_file_sign,CFile::mo deReadWrite)){MessageBox("请选择正确的文件路径");return;}if(m_signed_sign==""||!m_sign_file.Open(m_signed_sign,CFile:: modeCreate|CFile::modeReadWrite)){MessageBox("请选择正确保存数字签名的文件路径");return;}UpdateData(TRUE);m_state_sign="";//获取缺省的秘钥容器if(CryptAcquireContext(&hProv,NULL,NULL,m_prov_sign,0)){m_state_sign+="已获取CSP上下文,秘钥生成算法:"+GetProvType(m_prov_sign)+"\n";}else//密钥容器不存在创建之{if(CryptAcquireContext(&hProv,NULL,NULL,m_prov_sign,CRYPT_NEWKEYSET))m_state_sign+="已创建一个新的密钥容器,秘钥生成算法:"+GetProvType(m_prov_sign)+"\n";else{ m_state_sign+=MyHandleError("在获取CSP时发生错误,程序停止.");UpdateData(FALSE);return;}}// 从密钥容器中取数字签名用的密钥if(CryptGetUserKey(hProv,AT_SIGNATURE,&hKey))m_state_sign+="签名密钥已经获取. \n";else{if(GetLastError() == NTE_NO_KEY) //密钥容器里不存在signature key pair创建之{if(CryptGenKey(hProv, //CSP句柄AT_SIGNATURE, //创建的密钥对类型为signature key pair0, //key类型,这里用默认值&hKey)) //创建成功返回新创建的密钥对的句柄m_state_sign+="创建一个秘钥对\n";else{ m_state_sign+=MyHandleError("在创建签名密钥对时发生错误,程序停止.\n"); UpdateData(FALSE);return;}}else{m_state_sign+=MyHandleError("在获取签名密钥时发生错误,程序停止.");UpdateData(FALSE);return;}}// 因为接收消息者要验证数字签名,所以要导出公钥给接收者。
if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,NULL,&dwBlobLen)) //得到公钥的大小m_state_sign+="已获取公钥的大小,";else{ m_state_sign+=MyHandleError("计算公钥大小时发生错误,程序停止.");UpdateData(FALSE);return;}// 为存储公钥的缓冲区分配内存。