第一篇:非对称加密及数字签名解析
鲍勃有两把钥匙,一把是公钥,另一把是私钥。
鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
鲍勃给苏珊回信,决定采用“数字签名”。他写完后先用Hash函数,生成信件的摘要(digest)。
然后,鲍勃使用私钥,对这个摘要加密,生成“数字签名”(signature)。
鲍勃将这个签名,附在信件下面,一起发给苏珊。
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成“数字签名”,写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)。
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明“数字签名”是否真的是鲍勃签的。
下面,我们看一个应用“数字证书”的实例:https协议。这个协议主要用于网页加密。
首先,客户端向服务器发出加密请求。
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
HTTPS(HypertextTransfer Protocol Secure)即安全的HTTP。HTTPS的安全基础是安全套接层(Secure Sockets Layer,SSL)。HTTP工作在应用层(OSI模型的最高层),SSL协议工作在一个较低的子层,位于TCP/IP协议和HTTP协议之间。在HTTP报文传输前对其加密,并在到达时对其解密。严格地讲,HTTPS并不是一个单独的协议,而是工作在SSL协议上的HTTP协议。
HTTPS主要作用有两种:(1)确认通讯双方的身份,(2)建立安全通道,保证数据传输安全。
HTTPS与HTTP协议的差异
(1).HTTP 的URL是以“http://”开始,HTTPS的URL是以“https://”开始;(2).HTTP默认端口为80,HTTPS的默认端口为443;(3).采用HTTPS的Web Server需要到CA申请证书;
(4).HTTPS由HTTP+SSL来实现,可进行加密传输、身份认证等,要比HTTP安全(5).HTTP的信息是明文传输,而HTTPS的信息是加密传输
用公钥加密的数据只有私钥才能解密;相反的,用私钥加密的数据只有公钥才能解密,正是这种不对称性才使得公用密钥密码系统被广泛应用。
第二篇:数字签名和证书在网络技术加密中的综合应用
数字签名和证书在网络技术加密中的综合应用
摘要 随着网络技术的发展,引发各种竞争,网络安全问题也被提上议事日程。在加密技术应用中,数字签名和数字证书技术都是信息保密的重要技术方法,如果把数字签名和数字证书结合起来,综合应用,则更能有效提高网络信息安全程度,而且过程简洁,两种技术无缝接轨,能有效保证网络信息传递的安全,值得在实践中进一步发展创新。
关键词 数字签名;数字证书;网络;加密
中图分类号TP39 文献标识码A 文章编号 1674-6708(2010)31-0200-02
0 引言
随着计算机技术的快速发展,信息网络技术广泛推普应用,与之相应的网络安全问题也被提上议事日程。因为信息与网络涉及到国家的各个方面,包括政治的、经济的、军事的、文化的等诸多领域,在计算机网络中存储、传输和处理的信息,包括政府部门的宏观调控决策、国家安全信息、商业经济信息、银行资金转账、股票证券、能源资源数据和高科技科研数据等息,其中有很多是敏感信息和国家机密,所以承载和集散这些数据信息的载体,如网络、计算机等,难免会成为各种攻击和破坏的对象。万维网络因之不断地遭遇黑客的攻击、破坏捣乱,许多国家机密及重要情报资料被窃取和破坏,甚至造成局部网络系统的瘫痪等,这些破坏行为已经给各个国家、众多使用计算机网络的部门和个人造成程度不同的损失。特别是,当许多安全保密应对措施出现的时候,网络攻击又更猖獗,近乎达到无孔不入的地步。因此,提高安全意识,加强网络技术的安保措施,实施网络技术加密,保障网络使用安全,已经成为网络技术应用和发展的重要内容。
目前,最常用的网络安全防护技术主要有:加密技术、身份验证技术、网络防病毒技术和防火墙技术等。这些技术各有千秋,都能对网络信息安全保障,立下汗马功劳,但又各有不足。尤其是,以往的安全防范措施多是各自为政,互不关联,其防范效果也就有限了。我们设想,如果把几种加密技术和措施结合起来使用,可能有效提高加密层级,比如,把加密技术和身份验证技术结合应用,其安全效果当大幅度提高,保障性更强。其初步的界定是:加密技术和身份验证技术相结合,是指对在网络中所发送的明文消息,用加密密钥加密成密文进行传送,同时给以数字签名和数字证书保障,接收方用解密密钥进行解密,核对证书,确认身份,再现明文消息,从而保证传输过程中密文信息即使被泄露,在无密钥的情况下仍是安全保密的。通过数字签名和数字证书技术的结合应用,以很小的投入和代价,提供可靠的安全保护,目的是保护有关数据、文件、口令和控制信息,保护网上集散的信息数据,能有效地保证网络技术应用和信息资料的安全。数字签名
1.1 数字签名的界定
所谓数字签名(Digital Signature),是公开密钥加密技术的一种应用,是指用发送方的私有密钥加密报文摘要,然后将其与原始的信息附加在一起,合称为数字签名。
1.2 数字签名的使用方法
数字签名的具体使用方法是:报文的发送方从报文文本中生成一个128位或160位的单向散列值(或报文摘要),并用自己的私有的密钥对这个散列值进行加密,形成发送方的数字签名;然后将这个数字签名作文的附件和报文一起发送给报文的接收方;报文的接收方首先从接收到的原始报文中计算出128位的散列值(或报文摘要),接着再用发送方的公开密钥对报文附加的数字签名进行解密;如果这两个散列值相同,那么接收方就能确认数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别和验证,保证报文的完整性、权威性和发送者对报文的不可抵赖性。数字签名机制提供了一种鉴别方法,普遍用于银行、电子商务等,以解决伪造、抵赖、冒充、篡改等问题。
1.3 数字签名的技术实现
在技术实现上,数字签名的步骤一般有如下几步:
1)发送方用一个Hash函数对消息进行处理,产生消息摘要(Message Digest);
2)发送方将自己的私人密钥和消息摘要进行DSA算法(Digital Signature Algorithm)计算,产生数字签名;
3)将数字签名和消息一起发送出去;
4)接收方用同样的Hash函数对消息进行计算,产生消息摘要;
5)接收方用DSA算法消息摘要和发送方的公开密钥进行计算,产生数字签名S1。同时从接收到的消息中可以得到附加的数字签名S2。对比数字签名S1和S2,若S1与S2相等,则该数字签名得到验证,否则数字签名验证失败,消息发出后可能曾被修改或者是伪造的。整个过程如图1。
图1数字签名及其验证过程
数字签名因其使用方便,技术层级高,在网络信息传递的保密过程中,最常应用。数字证书
2.1 数字证书的概念
顾名思义,数字证书是一个文件。数字证书(Digital Certification,Digital ID)是网络上用以证实一个用户的身份和证实其对网络资源的访问权限。它是一个加密并用口令保护的文件,一般的数字证书总是把一个密钥同一个用户的一个或多个属性进行绑定。数字证书包含有证书拥有者的个人主要信息,可以编码的信息、证书验证机构CA(Certification Authority)和证实的有效期等。其中,个人信息包括证书持有者的姓名、证件编号和电子邮件地址等等,编码的信息指文件中包含一个公开密钥以用来验证消息发送者事先用匹配的私有密钥签过的数字签名。数字证书的内部格式由CC ITTX.509国际标准所规定。
2.2 数字证书的传输
一般是每一个公钥做一张数字证书,私钥用最安全的方式交给用户或自己生产密钥对,数字证书的内容包括用户的公钥、姓名、发证机构的数字签名及用户的其他信息,对方可以借此来验证身份的真假。当然,证书必须预防密钥丢失,可采用恢复密钥和密钥托管等方式处理丢失问题。证书的有效期超过后,必须重新签发,如果私钥丢失或被非法使用,则应废止证书。数字签名与数字证书的综合使用
把数字签名和数字证书技术两者综合起来,一起用于信息传递过程的保密工作,可以有效地提高加密层级,保障网络信息安全。这主要是因为其保密过程增加了几道防范措施。数字签名和数字证书综合应用于网络信息加密,其过程依附在信息传递过程中的。
3.1 数字签名和数字证书的综合应用流程
1)发送者A将一个签名的证书请求(包含她的名字、公钥、可能还有其他一些信息)发送到CA。
2)CA使用发送者A 的请求创建一个消息。CA使用其私钥对消息进行签名,以便创建一个单独的签名。CA将消息和签名返回给发送者A。消息和签名共同构成了发送者A的证书。
3)发送者A将证书发送给发送者B,以便授权他访问发送者A的公钥。
4)发送者B使用CA的公钥对证书签名进行验证。如果证书签名是有效的,就承认证书中的公钥是发送者A的公钥。
图2数字认证过程
与数字签名的情况一样,任何有权访问CA公钥的接收者都可以确定证书是否由特定CA 签名的。这个过程不要求访问任何机密信息。上面这个方案假定发送者B有权访问CA的公钥。如果发送者B拥有发含该公钥的CA证书副本,则他有权访问该密钥。具体的认证过程如图2。
从这过程看来,数字签名和数字证书两种技术,其应用过程并不矛盾,不会产生排斥,倒是能互相照应,无缝接轨,过程也很简洁,使用方便。
3.2 数字签名和数字证书的综合应用举例
把数字加密和数字证书结合起来,可以加大网络信息保密的力度。假如甲方要给乙方供应商发送一份业务合同,其步骤可以是:
第一步,在文字处理软件中填写合同内容细节,在文档地步,插入电子签名,表示甲方已经确认合同;
第二步,用数字签名来生成一个唯一的数字,这就使得合同有了甲方的电子签名和数字签名,附在文件中,以保证合同条款年内容不被修改;
第三步,用私有数字证书对这合同文件进行签名。然后,用电子邮箱把合同文件发给乙方供应商。
乙方供应商收到合同文件之后,现获得甲方的公钥数字证书,确保电子邮件的确来自甲方。乙方运行数字签名持续来验证合同文件在甲方发出之后没有被修改。最后乙方打开文件,在文件底部的电子签名处,看到甲方同意合同条款的签名。这样,几个环节和程序都获得证实,合同文件确实来自甲方,并未被泄密或被修改。然后,乙方即可处理甲方来件,即处理合同订单。这就是经过数字证书和数字签名等保密技术保护的网络信息传递过程。作为比较可靠的数字加密技术,数字签名和数字证书的结合,可以应用于电子邮件、电子支付、电子基金转移等各种用途,以保障其信息安全。结论
随着计算机网络技术的迅猛发展,网络安全问题日益成为人们关注的焦点,加密技术与网络安全密切相关,网络加密的技术和理论也将不断完善和发展,在网络安全中的应用也将越来越广。作为具体的加密技术应用,数字签名和数字证书这两种技术,各有千秋,而把两者结合起来,综合应用,则更能有效保证网络信息传递的安全,值得在实践中进一步发展创新。
参考文献
[1]Atul Kahate著.邱仲潘,等译.密码学与网络安全[M].清华大学出版社,2005.[2]王玲.网络信息安全的数据加密技术[M].信息安全与通信保密,2007.[3]王群.计算机网络安全技术[M].清华大学出版社,2008.
第三篇: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的 应用将来会越来越广泛。