第一篇:数字签名方案的实现
数字签名方案的实现
欧家权、应用数学、2111011451
一:数字签名的背景
随着信息、电子技术的迅速发展,全球己步入信息社会。由于整个社会将形成一个巨大的计算机网络,任何部门的计算机网络一旦出现安全问题,都会直接影响到整个国家的网络安全,所以计算机网络安全问题已引起了各国的高度重视。
随着我国信息化进程的加快,网络化将向各经济部门、政府机关、军队、学校和社会团体等方向延伸,先进的计算机系统能把整个社会乃至军队联结起来。计算机作为国家的关键基础设施和战略命脉,其安全状况直接影响到国家的安全和发展。加密技术是保证信息安全的关键技术,其理论是信息安全的核心内容之一。密码学是一门古老而又年轻的学科,1949年以前,密码学是一种艺术而并不是作为一门严格的科学存在。1949年shannon[’]发表的“保密系统的信息理论”一文为私钥密码系统建立了理论基础,从此密码学成为了一门科学。而1976年Diffie和Hellman[2]的“密码学的新方向”则开创了公钥密码学的新纪元。
目前的数据加密、数字签名、消息认证等技术都是以密码技术作为基础设计出来的。随着信息化的高速发展,密码学理论的研究和应用越来越受到重视。数字签名的概念由Diffie和Hellman提出,是现代密码学最重要最基本的概念之一。数字签名的设计思想等同于手写签名,即将签名者的身份与其签署的消息绑定,表示某人已对某消息进行了签字。任何的验证者均能验证消息确实为签名者所签署,而伪造一个合法用户的签名却是困难的。数字签名是实现数字通信中可认证性、完整性和不可否认性的重要密码技术,是应用最为广泛的公钥密码技术之一。
综上所述,数字签名的应用范围相当广泛,而数字签名最重要的应用之一就是数字版权管理系统的应用。随着网络和数字技术的快速发展,以数字形式存在的产品在人们的日常工作、学习和生活中占据越来越重要的地位。这些数字产品包括:电影、音乐、图片、电视、软件、书籍、期刊等,我们通称之为数字内容。数字内容通常都是有版权的,版权所有者销售数字内容并希望获得最大的经济收益。然而,数字内容的数字特性在为合法的用户提供存储、传输、处理等便利性的同时,也为盗版者的盗版行为提供了捷径。如果不采取有效的措施,盗版者就可以将数字内容精确复制并通过互联网络传播,版权所有者的利益将受到严重的侵害。
如何通过技术手段来保护数字内容的版权己成为近年来工业界和学术界研究的热点问题,许多开放的或专有的数字内容保护系统被提出来并得到不同程度的应用。数字内容保护技术是对各类数字内容的知识产权进行保护的一系列软硬件技术,合理地使用这些技术能够有效平衡数字内容价值链中各参与方的利益和需求,带动数字内容制作、消费电子和信息技术等产业的发展,并有助于开展新的商业模式,促进整个数字内容市场的发展和信息的传播,具有广泛的经济和社会意义。
因此,基于数字签名技术与数字版权保护技术的特点与共性,研究数字签名理论在数字版权管理系统中的应用是一个很有意义的课题,本文将在对数字签名进行研究的基础上,将数字签名的技术与数字版权管理系统进行有机结合,使数字签名理论能为数字版权的保护作出贡献。
2000年6月30日,美国克林顿总统用数字签名和手写签名两种方式正式签署((数字签名法律》,使数字签名在美国与传统签名一样具有了法律效力。
2004年8月28日,第十届全国人民代表大会常务委员会在第十一次会议通过了《中华人民共和国数字签名法》,该法自2005年4月1日已经开始施行。
随着各国相关法律的建立,数字签名在今后将与手写签名或者盖章具有同等的法律效力。以数字签名方式签署的合同、文件等电子文档与传统签名方式签署的纸质文件具有同样的法律效应,这就为基于互联网的电子商务、电子政务等各种应用铺平了道路。
我国将在国家计委的项目—网络身份认证管理示范工程基础上,逐步开展以公安户政信息和特征识别码为支持平台的网络身份管理等工作,为数字签名法的实施提供技术上的保障。数字签名法立法通常遵循技术中立的原则。目前,国际上流行的态度是,数字签名标准的发展应该统一、透明和客观,放弃为每一种认证方法进行立法的做法,承认各种数字签名的形式的合法性,只要其符合国际标准,均具有同等的法律效力和可强制执行力。反映到立法上,就是要确立技术的中立地位,避免规定使用特定技术,只从功能上对数字签名做出规定。这样,才能为未来新的数字签名技术的发展预留法律空间。
数字签名技术的发展是无止境的,一些原本被认为安全的技术,随着时间的推移和技术的进步也逐渐暴露出其缺陷。如,美国朗讯科技公司的贝尔实验室信息科学研究中心的DanielBleiehenbaehe研究员于2000年2月5日宣布在著名的数字签名算法DSA的随机数生成技术存在着重大缺陷。因为密钥的有效性依赖于数字产生的随机度,但DSA的随机数产生方法上存在偏重某些数字的现象。在概率上,从某个特定范围的数字中选择随机数的概率是从其它范围的数字中选择的2倍。正是这种偏重性大大减弱了DSA的安全性能,从而会加大整个系统的脆弱性。不过以目前性能还不足够发达的计算机而言,该缺陷还不至于立即构成威胁。但在不久的将来,因特网和企业/政府的内部网络业务的完整性就会面临危险。VPN(虚拟个人网络)、在线购物和金融交易等都有可能受到影响。
在国际密码学会议(Crypt。2004)上,研究人员宣布,他们发现了破解数种Hash算法的方法,其中包括MD4,MDS,NAVAL一128,RIPEMD。这些都是常搭配数字签名使用的算法。分析表明,SHAI的减弱条件的变种算法可能被破解,但完整的SHAI并没有被破解,也没有找到SHAI的碰撞。研究结果说明,SHAI的安全性暂时没有问题,但随着技术的进步,也面临着危险。随着数字签名与普通签名有同等效力的法规出台,数字签名技术的研究与应用将进入一个新的阶段。随着电子政务、电子商务等应用的普及和认识的提高,人们对数字签名本身的安全要求也在不断提高。对己有签名方案的安全分析和攻击将不断升级,密码学中各种算法的安全性将面临严峻的考验。另一方面,需要依靠数字签名技术的网络应用呈快速增长的趋势。例如:2004年的美国总统大选已开始部分采用网上投票,据称,世界上搞网上投票和电子投票的不止美国一家,瑞士、英国也己开始尝试这种新的投票方法。随着信息化的发展,我国信息安全技术的研究和产业已受到党和国家的高度重视,江泽民总书记曾明确指出:“信息和网络安全关系国家安全”。信息安全的地位越来越高,越来越引起政府的重视,投入上也越来越大。
在军事上,信息战这种新型作战模式的出现被视为是一次军事革命,今后的战争中决定胜负的因素不再仅仅是炸药、飞机和大炮,信息将成为一种重要的克敌制胜的武器。目前这种新型战争的各项准备工作各国都在高速进行,而这主要取决于计算机硬件、软件、网络通信技术的发展水平。数字签名技术由于其能有效地防止信息的伪造、确定信息的来源和判断信息是否完整等能力,使其在信息战中有着极其重要的作用。
数字签名的特性使得数字签名在运用到数字版权管理系统的协议中能起到重要的作用。现今对数字产品的版权保护的主要技术是数字水印技术,数字水印算法己经有了较大发展,能够应用于所有网络上的数字媒体,抗攻击性和可用性也正在提高。目前,有些系统己经开始尝试将数字水印算法用于数字媒体的版权保护过程中。但是我们应该看到,在开放环境下,密码算法的安全性和安全协议的安全性是保障
信息安全的两个基本方面。在开放环境下若要保护数字版权,使用数字水印算法来保证版权的安全性固然很重要,但也必须考虑到版权保护过程中所采用协议的安全性。当攻击者转向攻击协议而不是数字水印算法本身时,如果协议本身存在安全漏洞,则整个系统就起不到真正保护数字版权的作用。1883年,AugusteKerckhoffS〔3}阐述了第一个密码系统的设计准则,他在该准则中建议:我们应该假设对手知道加密数据的方法,数据的安全性必须仅依赖密钥的选择。像商用的密码算法和协议那样,为了使数字版权管理系统在开放环境下能起到版权保护作用,系统的设计必须遵守KerCkhoffS准则。显然,通过引入完备的安全协议,可以最大限度的防范攻击者对整个系统的破坏。随着数字化信息应用的普及,数字版权保护安全协议的研究必将会成为一个新的研究热点。
二:数字签名的原理
2.1 数字签名具备的特征 数字签名类似于数字化的手写签名, 但它们又不完全相同.数字签名与单独的数据, 如签名的合同或电子邮件有关.数字化的手写签名也是为了完成相同的工作, 但是它却无法引用待签的文档.强迫进行数字化的手写签名比强迫进行数字签名容易的多: 只需从另一个文档拷贝签名即可.数字签名通常提供更高 的安全度, 因为它们与签名的文档相关, 而且如果无法读取所使用的密钥, 就很难伪造签名.由此, 数字签名要具备以下特征:(1)签名不能被伪造;(2)签发方签过名后不能对签发文件的事实进行抵赖和否认;(3)信息发出后, 任何人不能对其进行篡改;(4)若双方关于签名发生纠纷, 可以给第三方仲裁机构提供用于仲裁的证据。
2.2 数字签名的原理
数字签名的基础是密码技术, 目前较多使用公钥加密技术, 如基于RSA Date Secu rity 公司的PKCS(Pub lic Key Cryp tography Standards)、DSA(D igi2tal Signatu re A lgo rithm)、PGP(P ret ty Good P rivacy)等.在1994 年美国标准与技术协会公布了数字签名标准(DSS)后, 公钥加密技术在数字签名中的应用更为广泛.公钥加密系统使用密钥对公钥和私钥来加密和解密信息.用户可以公布其公钥, 公钥的公布不会损害系统的保密性.而私钥只有密钥对的所有者才知道, 从而可把私钥作为其所有者的身份特征.发送者A 用其私钥S KA 对文件X 进行加密, 结果D S KA(X)传送给接收者B.B 用已知的A 的公钥P KA 解密得出E PKA(D S KA(X))= X.由于除A 外无人具有A 的私钥S KA , 所以除A 外没有别人能产生密文D S KA(X), 也就唯一标识了A 的身份.若A 要抵赖曾发送文件给B,B 可将X 及D S KA(X)出示给第三者.第三者很容易用P KA 去证实A 确实发送文件X给B.反之, 若B 将X 伪造为X ′, 则B 不能在第三者前出示D S KA(X ′), 就证明B 伪造了报文.这样就实现了数字签名.为了保证传输的数据不被篡改, 在现有的数字签名方案中, 通常以单向函数(如Hash 函数等)作用于文件, 产生固定长度的二进制作为信息摘要, 再将信息摘要用公钥加密作为签名与文件一起发送.由于采用单向函数, 给定一个固定长度的字符串, 很难找到一个具有明确意义的消息, 使其函数值与该字符串的信息摘要值完全相同.所以消息一旦被修改或破坏,就会与原来的信息摘要值不匹配.接收方很容易通过计算文件的信息摘要值与传来的函数值的不同, 而察觉出消息被非法用户篡改过.目前, J ava 开发包JDK 中支持DSA 签名,JDK1.3 及以后的版本还支持RSA 签名.而且, J ava还提供了2 个信息摘要函数MD5 和SHA.以DSA签名算法和基于MD5 的信息摘要为例, 数字签名及验证的过程签名是首先计算被签名文件的MD5 码, 该码经过DSA 私钥和DSA 加密算法加密后, 形成数字签名, 然后再附加到原文件之后, 向外发送.收件人得到带有数字签名的文件后, 要对数字签名进行鉴别.首先取出签名者的公钥, 数值签名经过公钥和DSA 解密算法解密后, 恢复出原来的MD5 码.然后计算原文件的MD5 码, 再与前者比较, 如果相同, 则文件属实, 否则文件或签名已经过改动.2.3 数字证书
由于数字签名依赖于公钥的完整性, 那么验证人如何确保他们获得的公钥不是来自某个冒名顶替者呢? 而且, 在数字签名认证发送人的同时, 接收人如何能够确保发送人值得信任呢? 这些问题的解决方案就是数字证书.由共同信任的第三方或证书授权机构CA(Certificate Authority)颁发证书.CA 不仅有签名者的公钥, 还有该用户的其他信息.证书含有一个有效期.颁发机构用它的专用密钥在证书上签名.该过程隐含一个假定, 即CA 的公钥是广泛可用的和真实的.公钥证书以X.509 标准为基础.默认情况下, Java 开发包使用的是X.509 证书.一个证书包括: 一个公钥;一个唯一的名字实体(个人或公司), 它是证书的所有者, 包括用户名字、公司、组织、城市、地址、国家代码、省份等信息;数字签名: 一个证书被一个分发者的实体签名, 保证证书确实包含另一个实体(所有者)的公钥;分发者的标识名信息.一般是每一个公钥做一张数字证书,私钥用最安全的方式交给用户或自己生产密钥对,数字证书的内容包括用户的公钥、姓名、发证机构的数字签名及用户的其他信息,对方可以借此来验证身份的真假。当然,证书必须预防密钥丢失,可采用恢复密钥和密钥托管等方式处理丢失问题。证书的有效期超过后,必须重新签发,如果私钥丢失或被非法使用,则应废止证书。
数字签名流程如图所示:
三:数字签名的实现方式
由于数字签名的实现方式多种多样,可以在不同的应用平台上采用数字签名,所以下面列举两种比较常见的实现方式进行讨论。
3.1 :ASP.NET 中数字签名的实现 密码系统是WEB 应用程序的安全通讯的基础,主要目的是保护数据,保护用户的标识或数据不被泄漏,保护数据不遭受未授权篡改或者损坏。保证接收的数据来自某特定的用户。加密是密码系统在实践中的应用,它是用算法使数据变得不规则的过程。密码系统有对称和不对称两种加密方法。在使用.NET 技术创建WEB 应用程序的过程中,可以通过编程方式使用密码系统来加强WEB 应用程序的安全性。根据所使用的编程平台,可以使用几种加密库中的一种,给WEB 应用程序添加加密、散列和数字签名功能。
签名数据处理:
.NET Framework 为签名数据和文件提供了RSACryptoServiceProvider 和DSACryptoServiceProvider 类。使用RSACryptoServiceProvider 和DSACryptoServiceProvider 类,有两个可用于签名数据的选项,如表:
签名数据的第一步是创建 RSACryptoServiceProvider 类的新实例以生成公钥/ 私钥对。可以在应用程序中创建一个 RSACryptoServiceProvider 类的新实例,它从计算机密钥证书存储区中读取公钥/私钥对,并把密钥对保存到一个名为SignKeyContainer 的新的密钥容器中:
C s p P a r a m e t e r s p a r a m = n e wCspParameters();
P a r a m.K e y C o n t a i n e r N a m e = ”SignKeyContainer”
Param.Flags=CspProviderFlags.UseMachineKeyStore;R S A C r y p t o S e r v i c e P r o v i d e robjRSA=new RSACryptoServiceProvider(param);
注意,当使用RSA CryptoServiceProvider 对象时,必须指定计算机的密钥证书存储区,它是只有ASPNET 用户才有访问权的证书存储区。如果要使用个人密钥存储区,必须使用模拟方式。
SignData 方法需要字节数据作为参数,所以第二步必须把要进行签名的数据转换为字节数组。使用System.Text 命名空间中的UnicodeEncoding 类把字符串转换为字节数组:
U n i c o d e E n c o d i n g U E = n e wUnicodeEncoding();
byte[] arTextTOSign=UE.GetBytes(txtClear.Text);
最后,调用SignData 方法对数据进行散列和签名。DSACryptoServiceProvider类使用S H A 1 哈希算法。如果使用RSACryptoServiceProvider 类,可以在SignData方法的第二个参数中指定哈希算法,如下面的代码所示,其中使用M D 5 哈希算法:
byte[] arDigitalSignature;arDigitalSignature=objRSA.SignData(arTextTOSign,”MD5”);
解密数据处理:
解密已经过数字签名的数据时,要完成下列步骤:
1)接收方使用发送方的公钥解密签名,得到原来的哈希值。
如果签名可以解密,则接收方可以确信数据来自发送方(或私钥的所有者)。
2)对数据应用哈希算法来生成第二个哈希值。
3)比较两个哈希值。如果哈希值匹配,则接收方可以确信数据没有被修改过。
要验证数字签名,必须拥有: 签名数据的用户所持有的公钥 数字签名 已签名的数据
签名者使用的哈希算法
例如由前面签名数字第一步中SignKeyContainer 密钥容器创建的一个RSACryptoServiceProvider 类的新实例,为了验证签名,需要调用V e r i f y D a t a 或VerifyHash 方法,这依赖于签名是如何创建的。VerifyData和VerifyHash方法都返回布尔值,True 表明签名有效;False 表明签名无效。下面的例子示例使用VerifyData 方法验证数字签名。在此例中,arTextTOSign和arDigitalSignature都是由远程用户提供的字节数组:
if(objRSA.VerifyData(arTextTOSign,”MD5”, arDigitalSignature))
lblVerify.Text=”Validsignature”;
else
lblVerify.Text=”InValidsignature”
3.2 Java实现方式:
Java 开发包中包含了一系列工具用来提供加密、信息融合、密钥管理、认证、存取控制和数字签名等功能, 可以很方便地实现对Java 应用程序和JavaApp let小程序的数字签名和客户端认证.Java Applet 小程序简单、短小, 非常适合网络传输的要求, 而且不受平台限制.以签名Applet 小程序为例说明数字签名的具体实现过程.实现签名的工具:
密钥和证书管理工具(Keytoo ls): 它主要是负责公私密钥对、向CA 发证书申请、接受CA 的回复、记录信任的公钥—— 实体对应表, 维护密钥库(Keysto re).Java 文档处理工具(jar): 如果要对代码签名, 需要先用jar 将其打包, 然后用jarsigner 来签名.J ava 文档签名及验证工具(jarsigner): 该工具通过密钥库中的数据来对jar 文件进行签名和认证.策略编辑器(po licytoo l): 编辑系统安全策略的文件.实现签名的步骤:
在客户端安装JRE1.3.0 01(Java 运行环境.3.0.1版本)以取代IE 的JVM(Java 虚拟机).在服务器端的调用App let 的HTML 文件中也需要将它包含进来, 以便没有事先安装JRE 的客户端下载.具体实现步骤如下:
服务器端(代码分发端):
(1)开发J ava 源程序并编译, 生成myf ile.class文件.(2)用JAR 对类文件和资源文件进行封装:jar cvf myf ile.jar myf ile.class(3)用Keytoo l 产生公钥ö密钥对(DSA 是Keytoo l 程序缺省的算法), 生成X.509V 1 证书, 键入命令:keytoo l genkey keysto re myf ile.keysto re alias myf ile(4)使用(3)生成的密钥对jar 文件进行签名:jarsigner keysto re myf ile.keysto re myf ile.jarmyf ile(5)输出公钥证书.数据的接收方是通过与生成数字签名的私钥对应的公钥来鉴定签名文件的, 因此要给数据的接收方发送一份公钥证书的副本.键入命令:keytoo l expo rt keysto re myf ile.keysto re alias myf ile file myfile.cer此命令将生成名为myfile.cer 证书文件, 这个cer 文件就是要拷贝到客户端的唯一文件.这样就完成了服务器端的设置.这时就可以将jar 文件和keysto re 文件以及cer 文件(在这里使用的是myf ile.jar, myf ile.keysto re, myf ile.cer)拷贝到服务器的目录下了.客户端(代码接收端):
(1)安装好JRE1.3.0 01 后, 将服务器端生成的myf ile.cer 文件拷贝到jre 的特定目录下.(2)输入证书并视其为可信任, 将公钥倒入到jre 的cacert s(这是jre 的默认keysto re):keytoo l impo rt alias myf ile f ile myf ile.cer keysto re cacert s注意这里要输入的cacert s 的密码是changeit,而不是自己设定的keysto re 的密码.(3)修改安全策略配置文件.运行命令po licytoo l.系统会自动弹出一个po li cytoo l 的对话框, 选择file 菜单的open 项, 打开客户端目录下的java.po liy 文件, 然后在edit 菜单中选择Change keysto re, 在对话框的new keysto re u rl 栏中输入密钥库cacert s 在客户机中的路径, 在new keysto re type 中输入JKS, 这是cacert s 的固定格式, 然后单击Add Policy Entry, 在出现的对话框中Code Base 中输入App let 程序在服务器端的位置:http: URL: 8080其中的URL 是服务器的IP 地址, 8080 是服务器(这里用的是Tomcat)端口.在SignedBy 中输入别名(alias): 这里是myf ile.然后单击add perm ission 按钮, 在出现的perm ission 对话框中选择你想给这个Applet 的权限, 最后保存.(4)从服务器端取得字节码, 验证字节码的合法性与完整性, 根据策略文件分配相应的权限, 执行代码, 完成后被垃圾回收器回收内存.四:数字签名的应用
数字签名是互联网上不可缺少的安全处理技术, 目前已有很多人在研究新算法, 以适应于特定领域内数字签名的需求, 其中包括以下几个研究方面。
1、高效可验证的安全数字签名方案。这种数字签名方案能够防止通过猜测RSA 算法的某些变量来选择信息进行攻击, 它的安全性不是基于树型结构的信任关系, 而是利用一种被称为“散列和标记”的范式。这种签名的惟一性是建立在它的假设上, 即假设加密所用的散列函数是经过详细定义的, 并且是合理的(可以不符合标准)。我们可以分3 步证明它的安全性: 首先随机构造一个预测模型, 且能够描述并证明这个模型是可靠的, 然后证明所构造的模型可以用一个满足特定计算特性(这些特性经过详细定义)的散列函数来代替;最后通过证明满足这些特定计算性质的散列函数是存在的, 从而论证假设的合理性。
2、防止适应性攻击的门限签名方案。在门限签名方案中, 数字签名是由一组用户产生, 而不是由个人或一个组织产生, 签名所用的私钥由一个组内的多个用户共享。为了给消息M 产生一个有效的签名, 至少需要t+1 个人合作, 由门限签名方案产生的签名和只有个人拥有私有密钥产生的签名具有相似性, 也就是说是否用分布方式产生数字签名这一点对接收端来说是透明的。门限签名方案的作用主要是防止来自内部或外部对签名密钥的攻击, 涉及门限签名的目标有两个方面: 一是提高数字签名代理的有效性;二是防止密钥被伪造, 使攻击者更难获得签名所用的私钥。因为组内必须有多个人才能产生数字签名, 这一点使门限签名方案具有强壮性, 即使攻击者就是组内的个别成员, 也能保证信息不被泄漏, 这项工作的实施草案可利用RSA 和DSS 数字签名方案进行设计实现。
3、面向流信息的数字签名。对信息流进行数字签名与对规则信息进行签名不同, 传统的签名方案是面向消息的, 接受端在收到全部信息之后才能对签名进行验证。然而流信息是很长的(可能是无限长)的位序列, 接收者必须一边接收消息, 一边获取消息内容, 不能有延迟。如果让接收者收到全部信息之后再进行验证是不现实的, 这种流信息包括数字视频、数字音频、数据流及java applet 程序等。对于这类签名包括两种情况: 一种是发送端已知信息是有限长的(如电影), 另一种是发送端不知道信息的长度(可能无限长, 如广播)。这种对流信息的签名技术还能应用于其它领域, 如在通讯代价高时对长文件的高效验证, 这时可以将基于数字签名的过滤器装载代理服务器上。
4、不可否认数字签名。数字签名是用来保密组织之间传递的秘密协议, 保证传递的个人信息的私有性, 因此即使在收发双方产生了纠纷, 仍然不希望参与验证签名合法的第3 方能看到信息原文, 这就需要限制验证合法性的第3方的权利。当然限制过多会使第3 方失去判断和解决纠纷的能力, 数字签名也就失去了它的价值。能够解决上述问题的一种签名方案是不可否认数字签名(undeniable signature),接收端对签名的验证过程必须在合法的发送者的参与下使用确认协议(confirmation protocol)来完成, 同时发送者也可以使用否认协议(denialprotocol)来证明签名是伪造的。当收发双方A,B 发生纠纷时, 则要求A,B 在公开场合下执行否认协议, 如果发送方A 拒绝参与配合, 则不打自招, 说明此数字签名为真;否则, A 只有通过该协议的所有步骤才能成功地否认数字签名。
五:数字签名的面临的问题
数字签名技术正处于发展阶段, 还有很多技术没有解决。下面具 体来讨论一下。
1、标准化问题: 在数字签名中, 只有标准的才是通用的, 只有通用的才有生命力。而目前标准的制定者除了IETF、ITU 和RSA Security主要的三家外, 还有许多组织(如公司、研究所、政府机构)也参与到新的IETF RFC 的开发中, 这使得制定统一的标准更加困难。
2、信任问题: 认证权威机构CA 的主要功能是发行、管理和撤消证书。证书的持有者和使用者都必须信任发行这些证书的CA。然而,什么CA 才是可信任的呢? 这是一个很重要的问题。目前的认证信任模型都是基于认证链的, 认证链的根即根认证权威机构(rootCA)凭什么可以信任? 此外, 由于PKI 往往是多个并行的, 它们之间进行互连,无论是分层PKI 的根CA 或网格中的任何CA 都必须使用桥CA(bridge CA)进行交叉认证, 那么又凭什么相信桥CA 呢?
3、标识和认证问题: 用户认证在数字签名中主要通过密钥认证来进行, 认证方式有二。一是采用不明确的方式, 如使用口令对加密过的密钥进行解密操作;二是采用明确的方式, 如在智能卡中使用PIN。无论采用何种方式, 进行签名之前, 都要明确其对应的应用, 这就要求在进行多个签名时需要多次认证才能获得多个认可, 这是安全需要的, 却是很不方便的。若采用智能卡进行认证, 当用户没有携带智能卡时还是需要额外的口令方式的数字签名。而且, 即使携带智能卡, 也还需要相应的读卡设备, 这对于出差在外还是不方便。
4、文档展示问题: 当用户授权实施签名时, 该用户依赖于系统组件来确保被签名对象与用户要签的对象是对应的, 而不是该对象的一个变体或另外一个完全不同的对象, 或者叫“所见即所签”往往用户看到的内容与实际内容是有出入的。
5、注册认证问题: 为确保用户身份真实性, 要求欲注册证书者携带有效身份到当地的CA 或RA 办理手续, 这对不在CA 或RA 所在地的用户是不太方便的。为解决此问题, 可以申请网上注册, 然而网上注册有两大问题: 一是如何确保用户的身份不做假, 二是如何确保用户的申请数据没有被篡改或出现传输错误。即, 如何确保用户的身份正确或CA 所收到的公钥的确是代表用户认证的。这依赖于一个安全的注册过程, 而这个过程应该如何建立,.NET 技术的出现是否能给解决这问题带来曙光?
6、群签名: 群签名方案允许组中合法用户以用户组的名义进行签名, 具有签名者匿名、只有权威才能辨认签名者等多种特点, 有着广泛应用。目前最常用的群签名方案有K-P-W 可变群签名方案、LC 群签名方案和T-J 群签名方案。但是, 这些方案都存在弱点, 如K-P-W群签名方案, 攻击者可以对参数n 进行素因子分解、GC 可以将组成员的有效签名转换为组中其他组成员的有效签名, 此外, 还存在GC 在签名过程中和身份验证过程中的伪造。此外, 还有隐形签名、确认者签名、团体签名等, 有应用需求, 但技术实现还处在“初级阶段”。
7、生物统计学。这可能是实现用户认证的最强大的方法, 主要包括: 指纹扫描、视网膜扫描和虹膜扫描、语音识别、面部识别等。生物统计因子不会被丢失或窃取, 或者被遗忘, 然而, 它容易出现个人身体属性的误拒绝、个人身体属性的误接受和无法登记个人的身体属性。目前要使用生物统计学认证, 一是技术还不够成熟, 二是太昂贵, 这也将影响数字签名的推广。
六:总结
数字签名技术应用领域日益广泛,是当前信息安全技术研究的热点。本文首先从数字签名的概念、分类、原理,以及其应用过程中可能遇到的问题等方面做了详细论述。然后介绍了目前这项技术研究的热点和新的发展方向。由于许多领域对数字签名技术提出了新的应用需求,在未来的信息领域中这一技术仍有着广阔的发展前景。
参考文献
[1]赵翔.数字签名综述[J].计算机工程与设计.2006.[2] StallingsW.密码编码与网络安全: 原理与实践[M ].北京: 电子工业出版社, 2001.239~ 241 [3] 洪 琳, 李 展.数字签名、数字信封和数字证书[ J ].计算机应用, 2000, 20(2): 21~ 22 [4] Garm s J , Somerfield D.J ava 安全性编程指南[M ].北京: 电子工业出版社, 2002.136~ 169 [5] 刘智勇.智能交通控制理论及其应用[M].北京.科学出版社.2003 [6]邵质斌,尹四清,浅谈数字签名技术[D].山西:中北大学计算机科学与技术系,2006.[7]鱼双键,详解数字签名鱼双键[J].科技情报开发与经济.2006.16(2):215-216.[8]赵翔,数字签名综述[J].计算机工程与设计.2006.27(2):195-197.[9]李明浩,吴智文.数字签名面临[D].福建: 厦门大学计算机科学系, 广东: 广东机电职业技术学院机电工程系.2005.[10] 范红.数字签名技术及其在网络信息安全中的应用[J].中国科学院研究生院学报, 2001,18(2):4.[11]刘渊.网上在线支付数字签名的研究与设计[J ].计算机应用研究,2003(11):110-112.
第二篇:PDF数字签名
制做PDF文件电子签名的方法
1、在一张白纸上写一个您最得意的签名,并扫描或用数码像机将签名转为图片文件;
2、用photoshop打开上面做好的签名图片文件,裁切成刚好能容纳您签名的大小,并 去掉图片的背景颜色(方法详见后附),将处理好的图片另存为.GIF 图片格式文件待用;
3、打开Adobe Acrobat 9 Pro(本制做方法适用于Adobe Acrobat 9 Pro 版本,其它 版本请做相应调整),任意新建一个PDF文件;
4、点击Adobe Acrobat 9 Pro 工具栏中的“签名”—“放置签名”,并用鼠标在新建的 那个PDF文件中画一个长方形的签名区(名字相签多大就画多大);
5、在随后弹出的窗口中选择“我要立即创建新的数字签名”,并点“下一步”;
6、在下一个窗口选择“新建PKCS#12数字身份证文件”,并点“下一步”;
7、在弹出的新窗口中输入“姓名”、“部门”,“单位名称”,“电子邮件地址”(以上这些 都只能输英文或拼音,不支持汉字);然后选择国家并点“下一步”;
8、在接下来弹出的窗口中选择电子签名文件制做好后要存放的文件夹,输入并确认您 以后签名时验证身份要用的密码;最后点击“完成”
9、在“签名文档”窗口中的“签名为:”档中选择“新建ID”,在“外观(A):”栏选择 “创建新外观„”;
10、弹出的“配置签名外观”窗口中的标题栏输入这类签名的标识,例:“无日期签名” 等等;在“配置图形”--“显示:”中选择“导入的图形(I)”并点击“文件(F)„”;从“选择图片”窗口的“浏览(B)„”中找到第2步制做好的图片文件并点“确定”返回;这时您就可以“配置签名外观”窗口的“预览”栏中看见您手写的签名了;您也会看到,除了您的签名外,它后面还跟着一些其它信息;这些信息是通过“配置文本”-“显示:”后面的选择项来控制的,您可以根据您的签名需要选择;
11、至此,点“确定”后,您的电子签名就算制做完成了,以后在签名时,只需重复第 4步并输入密码就OK了!
12、如果需要在签名时同时输入签名“原因”,就需要在“配置签名外观”窗口的“配 置文本”选项中勾选上“原因”,点击“确定”完成电子签名制做后,再在“编辑”菜单栏选择“首选项”—“种类”—“安全性”—“高级首选项”—“创建”标签中勾选“签名时显示原因”。这样,以后签名时就可以输入您的签名“意见”(原因)了;
13、如果您对刚才制做的这个签名不满意,可以在Adobe Acrobat 9 Pro 工具栏中的“高 级”—“安全性设置”,中删除这个数字身份证;如果你想对制做好的签名做一个备份,以后电脑系统重装后可以直接导入使用,您也可以在这个窗口中将您制做好的“数字身份证”导出保存。
14、对于您不满意的签名外观,可以在“编辑”菜单栏选择“首选项”—“种类”—“安 全性”—“外观”栏中进行“编缉”或“删除”;也可以在此处应用“新建”按钮直
名人堂:众名人带你感受他们的驱动人生马云任志强李嘉诚柳传志史玉柱
接创建一个新的签名外观。
15、修改签名密码:运行Adobe Acrobat 9 Pro,依次点击菜单栏中的“高级”—“安 全性设置”—“数字身份证文件”,再点击右侧最上面一行中的“更改口令”就可更改您签名时要输入的密码了!
第三篇:白话数字签名
白话数字签名
由于数字签名基于非对称加密技术,所以我们需要先啰嗦一下对称加密和非对称加密技术。
对称加密
何谓加密?加密是一种“把数据搞乱掉”的技术。加密技术涉及到4种东东:
明文:可以被人或程序识别的数据。例如一个文本文件、一段歌词、一个Word文档、一首MP3、一个图片文件、一段视频等等。
加密算法:将数据搞乱掉的方法。
密钥(密码):一个你在进行加密操作时给出的字符串,让加密算法不但把明文“搞乱掉”,而且要乱得“与众不同”。这样即使别人搞到了解密算法,如果没有当初加密时所使用的密码,一样无法进行解密操作。
密文:明文被加密算法和密钥加密后的结果。它看上去就是一堆乱码,没有人或程序能知道它到底表示什么信息。
作为加密的一个实例,我将使用由我杜撰的“景氏替换加密算法”演示一下加密过程。明文:good good study, day day up.密钥:google
景氏替换加密算法:将明文中的所有的字母“d”替换成密钥。
密文:将“good good study, day day up.”中的所有字母“d”替换成“google”,就得到密文“googoogle googoogle stugoogley,googleay googleay up.”。这个密文乱得还可以吧?一般人看了肯定不知道它是什么意思。
那么什么是解密呢?解密就是把密文再变回明文的过程。
例如“景氏替换解密算法”就是:将密文中所有与密钥相同的字符串替换成“d”。密文:googoogle googoogle stugoogley,googleay googleay up.密钥:google
景氏替换解密算法:将密文中所有与密钥相同的字符串替换成“d”。
明文:将“googoogle googoogle stugoogley,googleay googleay up.”中的所有“google”替换成“d”,就得到了明文“good good study, day day up.”。
您肯定已经注意到了,我们在进行加密和解密时使用的密钥必须是相同的,例如在上例中,加密和解密都必须使用相同的密钥“google”。所以像“景氏替换加密算法”这种就被称为对称加密算法。目前最为流行的对称加密算法是DES和AES,此外,对称加密算法还有IDEA、FEAL、LOKI、Lucifer、RC2、RC4、RC5、Blow fish、GOST、CAST、SAFER、SEAL等。WinRAR的文件加密功能就是使用的AES加密算法。
非对称加密
非对称加密算法是一类与众不同的加密算法,它的密钥不是1个,而是2个(一对),我们先姑且称它们为密钥K1和密钥K2。非对称加密算法的特点是,如果用密钥K1进行加密,则有且仅有密钥K2能进行解密;反之,如果使用密钥K2进行了加密,则有且仅有密钥K1能进行解密。注意“有且仅有”的意思——如果用密钥K1进行了加密,是不能用密钥K1
进行解密的;同样,如果用密钥K2进行了加密,也无法用密钥K2进行解密。这是一个非常重要的特性,至于如何在实际中运用这个特性,请看下文。
我想给Clark传送一个AV小电影,又怕被他的老婆发现......话说俺得了一个很不错的AV小电影,想通过网络传送给Clark,可是又怕被他的老婆发现(因为Clark的老婆是一个超级黑客,她可以使用sniffer技术截获任何通过网线传送给Clark的数据。别跟我说用VPN,它超出了本文讨论的范围),怎么办呢?对了,我们需要一个“将数据搞乱掉”的技术——加密技术。我先使用WinRAR对小电影进行压缩,然后加上密码“TswcbyyqjsjhfL”(还记得么?WinRAR的文件加密功能使用的是叫作AES的对称加密算法)。接着,将这个加密后的文件通过QQ传送给Clark。然后,兴冲冲地拨打Clark的手机: “喂?Clark么?好久不见,呵呵......我给你发了个好东东呦,在QQ上,收到没?......密码是TswcbyyqjsjhfL,对,就是天生我才必有用,千金散尽还复来的首字母,第一个和最后一个字母要大写呦......”
可是,Clark,我是真的不知道你的老婆大人刚刚就在你的身边呀!而且你也知道,我打电话从来都是喜欢很大声的......呜呜呜......在Clark跪了一夜的搓衣板之后,我们都明白:如果是已经保存在自己硬盘上的文件,使用对称加密技术进行加密是没有问题的;如果是两个人通过网络传输文件,使用对称加密就很危险——因为在传送密文的同时,还必须传送解密密钥。我们需要一个与众不同的加密算法,一个不需要传递解密密钥的加密算法。非对称加密正好可以满足我们的需要。基本思路是这样的:首先,生成一对满足非对称加密要求的密钥对(密钥K1和密钥K2)。然后,将密钥K1公布在网上,任何人都可以下载它,我们称这个已经公开的密钥K1为公钥;密钥K2自己留着,不让任何人知道,我们称这个只有自己知道的密钥K2为私钥。当我想给Clark传送小电影时,我可以用Clark的公钥对小电影进行加密,之后这个密文就连我也无法解密了。这个世界上只有一个人能将密文解密,这个人就是拥有私钥的Clark。
后来......后来,Clark痛定思痛,决定申请一个数字证书。流程是这样的:首先,登录当地的数字证书认证中心网站,填表->出示个人有效证件原件和复印件->缴费->等待数字证书认证中心制作数字证书->领取数字证书。如果您的公司需要申请大量的数字证书,还可以与认证中心的销售人员商量,先领取免费的试用版的数字证书供技术人员试用。
后来的后来,我又得到了一本电子版的不良漫画,当然,我又想到了Clark。我先在数字证书认证中心下载了Clark的公钥证书(就是一个含有公钥信息的文件),使用非对称加密算法对不良漫画进行加密,再将密文通过QQ传送给Clark。然后,我兴冲冲地拨打Clark的手机: “喂?Clark么?好久不见,呵呵......我给你发了个好东东呦,在QQ上,收到没?......已经用你的公钥加密了。用你的私钥解密就行了^_^”
Clark兴冲冲地插入他的私钥(忘了说了,私钥并不是一个文件,而是一个USB设备,外形就跟U盘一样,至于为什么要这样,下一篇再说),解密,然后开始看漫画,完全没察觉他的老婆大人就在身后......Clark,俺这个月手头有点紧......唉,这个月买了太多的书,到月底揭不开锅了。正巧在QQ上遇到了Clark:
1-2-3:“Clark,我需要200两纹银,能否借给我?”
Clark:“没问题。我这就给你转账。请给我一张借条。”
1-2-3:“太谢谢了,我这就用Word写一个借条给你。”
然后,我新建一个Word文档,写好借条,存盘。然后,然后怎么办呢?我不能直接把借条发送给Clark,原因有:
1.我无法保证Clark不会在收到借条后将“纹银200两”改为“纹银2000两”。
2.如果我赖账,Clark无法证明这个借条就是我写的。
3.普通的Word文档不能作为打官司的证据。
好在我早就申请了数字证书。我先用我的私钥对借条进行加密,然后将加密后的密文用QQ发送给Clark。Clark收到了借条的密文后,在数字证书认证中心的网站上下载我的公钥,然后使用我的公钥将密文解密,发现确实写的是“借纹银200两”,Clark就可以把银子放心的借给我了,我也不会担心Clark会篡改我的借条,原因是:
1.由于我发给Clark的是密文,Clark无法进行修改。Clark倒是可以修改解密后的借条,但是Clark没有我的私钥,没法模仿我对借条进行加密。这就叫防篡改。
2.由于用我的私钥进行加密的借条,有且只有我的公钥可以解密。反过来讲,能用我的公钥解密的借条,一定是使用我的私钥加密的,而只有我才拥有我的私钥,这样Clark就可以证明这个借条就是我写的。这就叫防抵赖。
3.如果我一直赖着不还钱,Clark把我告上了法庭,这个用我的私钥加密过的Word文档就可以当作程堂证供。因为我国已经出台了《中华人民共和国电子签名法》,使数字签名具有了法律效力。
您一定已经注意到了,这个使用我的私钥进行了加密的借条,具有了防篡改、防抵赖的特性,并且可以作为程堂证供,就跟我对这个借条进行了“签名”的效果是一样的。对了,“使用我的私钥对借条进行加密”的过程就叫做数字签名。(由于数字签名算法的速度比较慢,所以在实际对文件签名的过程比上面提到的方法稍稍复杂一些,这个在下一篇再讲)。
我是1-2-3,我真的是1-2-3,我是真的1-2-
3正如您已经知道的,Clark的老婆是一名超级黑客——就是传说中能用计算机作任何事的人。这不,不久前她就轻松入侵了QQ数据库,下载了Clark的所有好友的ID和密码以及聊天记录。然后,时不时地伪装成Clark的好友跟Clark聊天,搞得Clark最近总是神经兮兮、疑神疑鬼的。这不,昨天我在QQ上遇到了Clark:
1-2-3:“Clark,最近还好吧?我又搞到一个好东东呦,要不要?”
Clark:“48475bbt556”
Clark并不是疯掉了,那个“48475bbt556”也不是我跟Clark之间的什么通关暗语。这个“48475bbt556”就是Clark在键盘上胡乱敲上去的,不过,我却知道Clark是什么意思。我立刻把“48475bbt556”粘贴到Word里,然后用我的私钥对这个Word文档加密,再将这个Word文档发送给Clark。Clark在那边用我的公钥将Word文档解密,打开,发现里面写的就是“48475bbt556”,就知道QQ这边的确就是真正的我本人了。因为拥有我的私钥的人在这个世界上就只有我一人而已,Clark的老婆大人就是再神通广大也模仿不了,这就是数字签名的验证功能。
顺便提一句,不但人可以申请数字证书,设备(例如Web服务器)也可以申请数字证书(叫作设备证书)。利用数字签名的验证功能,就可以验证服务器的身份了,这可是防钓鱼的终极解决方案呦。
第四篇:数字签名课程设计
数字签名的目的和意义
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算法应用规范介绍参见: http://www.xiexiebang.com/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)为公钥,(d ,N)为密钥,销毁p,q,≯(N)。2.加密 加密时首先将明文比特串进行分组,使得每个分组对应得串在数值上小于N,即分组的二进制长度小于l092N。然后,对每个明文分组M,作加密运算: C=E k(M)=M e mod N 3.解密 对密文分组的解密运算为: 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’=ye 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的公开加密函数EB对信息对(x, y)加密得到Z,将密文Z传送给B,当B收到密文Z后,他首先用他的解密函数DB来解密得到(x,y)=DB(Z)= DB(EB(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::modeReadWrite)){ 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 pair 0, //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;} // 为存储公钥的缓冲区分配内存。 if((pbKeyBlob =(BYTE*)malloc(dwBlobLen))) m_state_sign+=”已为公钥分配内存n“;else { m_state_sign+=MyHandleError(”为公钥分配内存时出现异常,退出.n“);UpdateData(FALSE);return;} // 真正导出公钥数据 if(CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,pbKeyBlob,//公钥 这个数据可以存入文件,发送给接收者。一般被存入数字证书 &dwBlobLen)){ m_pubkey_file.Write(pbKeyBlob,dwBlobLen); m_state_sign+=”已导出公钥,存储在“+m_pubkey_file.GetFilePath()+”n“;} else { m_state_sign+=MyHandleError(”导出公钥时发生错误,退出“);UpdateData(FALSE);return;} // 创建hash对象 if(CryptCreateHash(hProv,m_hash_sign,//CALG_MD5,0,0,&hHash)){ m_state_sign+=”已创建hash对象,加密算法“+GetHashType(m_hash_sign)+”nn“;} else { m_state_sign+=MyHandleError(”在创建hash对象时发生错误,退出“);UpdateData(FALSE);return;} //把签名的数据读入内存 //分配空间 if((pbBuffer=(BYTE *)malloc(m_signdatafile.GetLength()))) m_state_sign+=”已经为数据“+m_signdatafile.GetFilePath()+”分配空间nn“;else { m_state_sign+=MyHandleError(”为数据分配内存时发生异常,退出“);UpdateData(FALSE);return;} if(m_signdatafile.Read(pbBuffer,m_signdatafile.GetLength()))//把数据读入内存 m_state_sign+=”数据已经读入内存!“;else {m_state_sign+=MyHandleError(”数据读入内存发生错误,退出“);UpdateData(FALSE);return;} dwBufferLen = m_signdatafile.GetLength();// 对数据进行hash运算 if(CryptHashData(hHash,pbBuffer,dwBufferLen,0)) m_state_sign+=”已对数据进行hash运算n“;else { m_state_sign+=MyHandleError(”在对数据进行hash运算时发生错误,退出.“);UpdateData(FALSE);return;} // 使用signature key pair的私钥对hash数据签名 dwSigLen= 0;if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,NULL,&dwSigLen))//得到数字签名大小 m_state_sign+=”已获取数字签名的大小,“;else { m_state_sign+=MyHandleError(”计算数字签名大小时发生错误,退出.“);UpdateData(FALSE);return;} // 为数字签名缓冲区分配内存 if((pbSignature =(BYTE *)malloc(dwSigLen))) m_state_sign+=”已为数字签名分配缓冲n“;else { m_state_sign+=MyHandleError(”为数字签名分配内存时异常,退出.“);UpdateData(FALSE);return;} // 得到数字签名 if(CryptSignHash(hHash,AT_SIGNATURE,szDescription,0,pbSignature, //这里将返回数字签名,同被签名的数据一起发送给接收方 &dwSigLen)) { m_sign_file.Write(pbSignature,dwSigLen); m_state_sign+=”已导出数字签名,存储在“+m_sign_file.GetFilePath()+”nn“;} else { m_state_sign+=MyHandleError(”导出数字签名时发生异常,退出.“);UpdateData(FALSE);return;} // 销毁hash对象.if(hHash){ CryptDestroyHash(hHash); m_state_sign+=”销毁hash对象nn“;} m_state_sign+=”数字签名成功nn“;//关闭文件 m_pubkey_file.Close(),m_sign_file.Close(),m_signdatafile.Close(MessageBox(”数字签名成功!“,”“,MB_OK);UpdateData(FALSE);⑤.数字签名认证的主要算法及关键代码 HCRYPTPROV hProv;HCRYPTKEY hPubKey;BYTE *pbKeyBlob;DWORD dwBlobLen;HCRYPTHASH hHash;BYTE *pbSignature; //数字签名 DWORD dwSigLen;LPTSTR szDescription = ”“;UpdateData(TRUE);m_state_veri=”“;// 获得CSP句柄,密钥容器名为登陆用户名 if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0)){ m_state_veri+=”已获取CSP,秘钥生成算法:);“+GetProvType(m_prov_veri)+”n“;} else //密钥容器不存在创建之 { if(CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET)) m_state_veri+=”已创建一个新的密钥容器秘钥生成算法:“+GetProvType(m_prov_veri)+”n“; else { m_state_veri+=MyHandleError2(”在获取密钥容器时发生错误,退出n“);UpdateData(FALSE);return;} } CFile signdatafile,yuanwenfile,pubkeyfile;if(m_pkey_veri==”“||!pubkeyfile.Open(m_pkey_veri,CFile::modeReadWrite)){ MessageBox(”请选择正确的公钥文件!“);return;} if(m_file_veri==”“||!yuanwenfile.Open(m_file_veri,CFile::modeReadWrite)){ MessageBox(”请选择正确的原文件!“);return;} if(m_signed_veri==”“||!signdatafile.Open(m_signed_veri,CFile::modeReadWrite)){ MessageBox(”请选择正确的签名文件!“);return;} dwBlobLen=pubkeyfile.GetLength();pbKeyBlob=(BYTE *)malloc(dwBlobLen);pubkeyfile.Read(pbKeyBlob,dwBlobLen);if(CryptImportKey(hProv,pbKeyBlob,dwBlobLen,0,0,&hPubKey)) m_state_veri+=”公钥已经成功导入!nn“;else { m_state_veri+=MyHandleError2(”公钥导出出错.n“);UpdateData(FALSE);return;} // 创建哈希对象 if(CryptCreateHash(hProv,m_hash_veri,//CALG_MD5,0,0,&hHash)) m_state_veri+=”已经获取hash对象,hash算法“+GetHashType(m_hash_veri)+”nn“;else { m_state_veri+=MyHandleError2(”创建hash对象时出错,退出“);UpdateData(FALSE);return;} // 跟生成时一样对数据进行hash运算 BYTE *pbBuffer;pbBuffer=(BYTE *)malloc(yuanwenfile.GetLength());yuanwenfile.Read(pbBuffer,yuanwenfile.GetLength());DWORD dwBufferLen = yuanwenfile.GetLength();pbSignature=(BYTE *)malloc(signdatafile.GetLength());signdatafile.Read(pbSignature,signdatafile.GetLength());dwSigLen = signdatafile.GetLength();if(CryptHashData(hHash,pbBuffer,dwBufferLen,0)) m_state_veri+=”对数据hash运算成功!nn“;else { m_state_veri+=MyHandleError2(”对数据进行hash运算出错,退出“);UpdateData(FALSE);return;} // 验证数字签名 if(CryptVerifySignature(hHash,pbSignature, //数字签名数据 dwSigLen,hPubKey, //签名者的公钥 szDescription,0)) { MessageBox(”恭喜:是正确的数字签名!“); m_state_veri+=”恭喜:是正确的数字签名!“;} else { MessageBox(”错误:签名是错误的n“); m_state_veri+=”错误:签名是错误的n请检查参数是否设置正确,若正确则请联系发送方";} UpdateData(FALSE);//------ // Free memory to be used to store signature.if(pbSignature)free(pbSignature);if(pbKeyBlob)free(pbKeyBlob);// Destroy the hash object.if(hHash) CryptDestroyHash(hHash);// Release the provider handle.if(hProv) CryptReleaseContext(hProv, 0);signdatafile.Close(),yuanwenfile.Close(),pubkeyfile.Close();4.RSA数字签名算法运行情况: 4.1 主界面初始化 4.2 签名界面 4.3 设置密钥 4.4 选择签名文件 4.5 选择保存公钥位置 4.6 选择选择签名后保存位置 4.6 进行数字签名结果 4.7 进行数字签名认证 4.8 进行数字签名认证结果 5.总结与展望: 通过本次对RSA算法的学习,明白了该算法加密解密的原理,以及他的安全性问题和缺点,通过这几周的实验,在学习中累计经验解决问题,让我对RSA算法有了较通透的理解,受益匪浅。随着Internet的发展,实现电子商务是未来的潮流和趋势,基于Internet开放环境下的信息安全将越来越受到重视,而RSA算法在身份认证,数字签名,信息加密等方面得到非常广泛的应用,对它作深入的了解是很有必要的。虽然RSA算法可靠性较高,但是还是有一些缺陷,就是运算量太大,速度太慢,适合加密比较短的明文。RSA方法既可用于保密,也可用于签名和认证,目前已经广泛应用与各种产品,平台等软件上。许多流行的操作系统上如微软,Apple,Sun和Novell都是在其产品上融入RSA。在硬件上,如安全电话,以太网和智能卡都使用了RSA技术。而且几乎所有Internet安全协议如S/MIME,SSL和S/WAN都引入了RSA加密方法。ISO9796标准把RSA列为一种兼容的加密算法。可以预见,在不远的几年内,RSA的 应用将来会越来越广泛。 数字签名及安全电子邮件 一、背景知识 使用个人证书,在电子邮件中至少有以下功能。 保密性:你可以使用收件人的数字证书对电子邮件进行加密。这样,只有收件人的私钥才能解密这封邮件,即使第三方截获邮件,由于没有收件人的私钥,也无法阅读该邮件。当然,要发送加密电子邮件,必须先拥有对方的数字证书。 认证身份:你可以使用你本人的数字证书对电子邮件进行数字签名,这样,收件人通过验证签名就可以确定你的身份,而不是他人冒充的。 完整性:如果验证数字签名有效,收件人不仅可以认证你的身份,还可以确信收到的邮件在传递的过程中没有被篡改。 不可否认性:数字签名要使用你本人数字证书中的私钥,而私钥仅你个人所有,所以,你不能对发送过的签名邮件进行否认。 1、电子邮件的重要性 由于越来越多的人通过电子邮件发送机密信息,因此确保电子邮件中发送的文档不是伪造的变得日趋重要。同时保证所发送的邮件不被除收件人以外的其他人截取和偷阅也同样重要。 通过使用 Outlook Express 和 Foxmail,可以在电子事务中证明身份,就象兑付支票时要出示有效证件一样。也可以使用数字证书来加密邮件以保护邮件的保密性。数字证书结合了 S/MIME 规范来确保电子邮件的安全。 2、对电子邮件进行数字签名 对电子邮件进行数字签名,能够确保电子邮件中发送的文档不是伪造的,即收件人能够确信该邮件来自于其声称的发件人,同时邮件从发件人的机器传达到接收人的机器没有经过任何改动。 当发件人在待发邮件中添加数字签名时,发件人就在邮件中加入了数字签名和自己的数字证书。邮件的接收方接收到该邮件后,首先判断发件人的证书是否有效(该证书是否是可信任的CA签发的,该证书是否在有效期内,该证书是否已经被撤销),如果证书有效,从发件人的证书中提取公钥信息,来验证邮件的数字签名是否有效。 3、对电子邮件进行加密 对电子邮件进行加密(使用接收人的数字证书中的公钥进行加密)可以保证所发送的邮件不被除收件人以外的其他人截取和偷阅。 当发件人对邮件进行加密时,使用接收人的数字证书中的公钥对邮件进行加密。邮件的接收方接收到该邮件后,使用自己的私钥对邮件进行解密,可以得到邮件的明文。因为使用公钥加密的数据,只有对应的私钥才可以解密,而对一封加密邮件来说,只有接收人才具有对应的私钥,也就是只有接收人才可以对邮件解密得到邮件的明文。其他任何人截获了该邮件都是无法识别的乱码。有效的保证了邮件内容的保密性。 4、电子邮件证书使用的简易性 如果接收到有问题的安全邮件,例如邮件已被篡改或发件人的数字证书已过期,则在被允许阅读邮件内容前,会看到一条安全警告,它详细说明了问题所在。根据警告中的信息,接收人可以决定是否查看邮件。 以上所述的签名和加密邮件的过程都是由邮件客户端程序(如Microsoft Outlook,Foxmail、Netscape Messager等)来完成。对于邮件的发送人来说,就是在邮件发送之前,简单的点击“签名”和“加密”按钮就可以了;对于邮件的接收人来说,邮件接收到后,邮件客户端程序更能够自动对签名邮件进行验证,对加密邮件进行解密,并将验证和解密结果显示给邮件的接收人,不需要任何人工操作,非常方便。 5、安全电子邮件的工作方式 安全电子邮件的工作方式有两种: 第一种情况是采用个人或单位证书发送安全电子邮件。如吉林省数字证书认证中心、广东省数字证书认证中心等就颁发个人证书或单位证书,然后你可以选择用这两种证书发送安全的电子邮件。 第二种方式是直接给电子信箱的所有人或单位的电子信箱地址颁发数字证书,如江西省数字证书认证中心、安徽省数字认证中心等就颁发专门的邮件证书。 由于以上两种方式的原理基本一样,考虑到网上的免费资源,我们以第一种方式为主加以说明。 当然,在第一种方式中使用单位证书发送安全邮件的原理基本一样,由于网上单位证书的免费资源很少,因此,我们重点以个人证书为例。另外,要发送安全电子邮件,必须使用一些电子邮件客户端软件,如Outlook Express、Foxmail等,打开网页收发邮件是不能进行数字签名的,我们这里以Outlook Express 5.0为例,说明安全电子邮件的发送过程。 二、实验目的及要求 1、掌握用Outlook Express发送数字签名电子邮件的方法。 2、掌握用Outlook Express发送加密电子邮件的方法。 三、实验准备 1、上网计算机,IE5.0以上,Outlook Express 5.0以上。 2、已经申请好个人数字证书(本实验以在广东省数字证书认证中心申请的个人免费证书为例)。 四、实验过程 1、修改电子邮件帐号属性,绑定证书 (1)在Outlook Express5.0单击“工具”菜单中的“帐号”,选取邮件选项卡中的用于发送安全电子邮件的邮件帐号,然后单击“属性”,选择安全标签,在签名证书标识项后,点击选择按钮,如图9.1所示。 图9.1 安全属性 (2)选择数字证书,如图9.2、图9.3所示。 图9.2 选择签名证书 图9.3 已经设置好签名证书 3)如果希望对方能给你发送加密电子邮件,则点击加密首选项,再选择你的证书及算法,如图9.4所示。 图9.4 已经设置好签名和加密数字证书 2、发送数字签名电子邮件 (1)打开Outlook Express,点击新邮件,输入对方的邮件地址,并点击“签名”按钮,然后点击发送,如图9.5所示。 图9.5 撰写数字签名邮件 (2)对方用Outlook Express收到你的邮件后,首先显示图9.6所示提示。 图9.6 收到数字签名邮件 (3)点击继续,打开邮件,如图9.7所示。 图9.7 打开签名邮件 3、发送加密电子邮件 (1)当用户拥有了对方的数字证书,并添加到通讯薄中就可以向对方发送加密的电子邮件了,如图9.8所示。 图9.8 通讯簿中查看对方数字证书 (2)打开Outlook Express,点击新邮件,输入对方的邮件地址,并点击“加密”按钮,如图9.9所示。 图9.9 发送加密电子邮件 (3)对方用Outlook Express收到邮件后首先显示图9.10所示的提示。 图9.10收到加密电子邮件 (4)点击继续,打开邮件,如图9.11所示。 图9.11 打开加密电子邮件 (5)如果你没有对方的数字证书,是不能发送加密邮件的,如图9.11、图9.12所示。 图9.11 无对方证书发送加密邮件 图9.12 系统提示出错 (6)当然,也可以发送同时加密和签名的电子邮件,如图9.13、图9.14、图9.15所示。 图9.13 同时发送签名和加密邮件 图9.14 收到签名和加密邮件 图9.15 打开签名和加密邮件 至此,我们已经完成了安全电子邮件的全部操作,即如何发送加密的和签名的电子邮件,需要指出的是,有许多免费邮箱是在网页下收发邮件的,在此情况下一般不能使用数字证书。 五、练习与思考 1、加密邮件与签名邮件有什么区别? 2、随着中华人民共和国电子签名法的颁布实施,你认为签名电子邮件具有法律效力吗? 3、为什么发送加密邮件需要对方的数字证书?其加密原理是什么? 4、能用他人的证书发送签名邮件吗?为什么? 5、请用FOXMAIL设置签名及加密邮件,比较与Outlook express的异同。第五篇:数字签名及安全电子邮件