电子签章的开发_第1页
电子签章的开发_第2页
电子签章的开发_第3页
电子签章的开发_第4页
电子签章的开发_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2、引言传统的交易行为和政府间的公文传送,必须要用书面的文件来完成,为了保证文件是某个当事人或者机关签发的,并且文件没有被篡改,还必须要有签发人的手写签字或者公章。网络环境中,文件的传递采取电子的方式,比如E-mail。这种方式最大的优点就是速度快,文件可以在数秒中到达远在万里之外的客户手中。在“时间就是金钱、效率就是生命”的生意场上,这种优势无疑成为广大厂商的首选。电子文件并非只用于合同的签订和政府文件的传递,而是适用于所有信息的传递。可以理想化地认为,未来的信息传递,可以不借助于任何纸张。但如何保证一项文件或者一条信息是某个人发出的?某个人发出文件或者信息后,如果发现对自己不利抵赖怎么办?如果文件或者信息在网络传输过程中被他人截取,并被篡改了怎么办?许多人都知道,我们平时发送和接收的电子邮件是不加密的,对于某些人比如网管员来说,看这些文件甚至比看没有封上的书面信件更容易。3、实例某信息公司要求研发一套办公自动化系统,其中就包括了对电子公文进行电子签章的功能,本人有幸参与并设计了电子签章部份。目前最成熟的电子签章技术就是“数字签章(DigitalSignature)”,它是以公钥及私钥的“非对称型”密码技术制作的电子签章。使用原理大致为:由计算机程序将密钥和需传送的文件浓缩成信息摘要予以运算,得出数字签章,将数字签章并同原交易信息传送给对方,后者可用公钥来验证该信息确实由前者传送、并可查验文件在传送过程是否遭他人篡改,并防止对方抵赖。由于数字签章技术采用的是单向不可逆运算方式,要想对其破解,以目前的计算机速度以及技术而言,几乎是不可能的。文件传输可选择明文或密文进行传输。因此,从某种意义上讲,使用电子文件和数字签章,甚至比使用经过签字盖章的书面文件安全得多。设计之初,我就先提出了需要解决的几个问题:如何保证电子文件在传输过程中不被篡改?如何保证电子文件合法性及不可抵赖?一般来说要保证电子文件在传输过程中不被篡改,一是对电子文件进行私钥加密。在传输方使用私钥对电子文件进行明文加密,接收方再用私钥对传输过来的密文进行解密,以此来达到电子文件不被篡改。但此方法需要传输方与接收方都拥有私钥而且出现问题后双方都可能指责对方将私钥解密,因此单纯使用此方法,一般都只用于安全性要求不高的应用,不值得推荐。二是传输方对电子文件创建哈希,将电子文件与哈希一同发给接收方,接收方对接受到的电子文件也创建哈希,然后对比哈希值,以此来达到电子文件不被篡改。这是本人所选用的方案。下面是根据本人电子签章设计所写的一个DEMO片段,以供参考。以下是对电子文件创建哈希的具本实现(使用了MD5加密):///<summary>I ///得到指定电子文件的哈希I ///</summary>I ///<paramname="filePath">电子文件地址</param>° ///<returns>哈希值</returns〉7日田89申由7日田89申由10{try{FileStreamobjFile=File.OpenRead(filePath);HashAlgorithmMD5=HashAlgorithm.Create("MD5");121byte[]Hashbyte=MD5.ComputeHash(objFile);131objFile.Close();14returnHashbyte;15}16catch17申{18returnnull;19}L}20要实现合法性及不可抵赖就必需使用公钥私钥非对称加密方式并结合哈希加密方式。公钥及私钥是一对很有意思的组合,它们是成对使用的,一一对应的,使用私钥加密的数据,可以使用公钥来证明是否是由此公钥所对应的私钥所加密的,将电子文件的哈希用私钥加密,接收人就算出电子文件的哈希,然后用公钥来验证电子文件是否是传输者所确认的文件。生成公钥及私钥:///<summary>I ///得到公钥与私钥I ///</summary>I///<paramname="ContainerName">私钥容器名</param>I///<paramname="privatekey">真为得到私钥,假为得到公钥</param>° ///<returns>公钥或私钥</returns〉78日田910111278日田910111213CspParameterscp=newCspParameters();cp.KeyContainerName=ContainerName;RSACryptoServiceProviderrsa=newRSACryptoServiceProvider(cp);returnrsa.ToXmlString(privatekey);}对电子文件的哈希进行数字签名:///<summary>I ///对哈希进行数字签名I ///</summary>I///<paramname="privateKey">私钥</param>I ///<paramname="fileHash">电子文件哈希</param>///<returns></returns>78日田910111278日田910111213{RSACryptoServiceProviderRSA=newRSACryptoServiceProvider。;RSA.FromXmlString(privateKey);RSAPKCS1SignatureFormatterRSAFormatter=newRSAPKCS1SignatureFormatter(RSA);14I RSAFormatter.SetHashAlgorithm("MD5");

16161718return171819对数字签名用公钥进行验证1 ///<summary>2丨 ///对数字签名用公钥进行验证I ///</summary>I///<paramname="publicKey">公钥</param>I ///<paramname="fileHash">接收到的电子文件的哈希</param>I///<paramname="electronicSignature">数字签名</param>7° ///<returns>数字签名有效为真,数字签名无效为假</returns>publicstaticboolDecryptHash(stringpublicKey,byte[]fileHash,byte[]electronicSignature){I RSACryptoServiceProviderRSA=newRSACryptoServiceProvider();11I RSA.FromXmlString(publicKey);13I RSAPKCS1SignatureDeformatterRSADeformatter=newRSAPKCS1SignatureDefo15161516171819RSADeformatter.SetHashAlgorithm("MD5");returnRSADeformatter.VerifySignature(fileHash,electronicSignature);}主体程序1staticvoidMain()2日田{//生成电子文件stringfilePath="C:\\公文.txt";StreamWritersw=File.CreateText(filePath);sw.Write("测试公文”);sw.Close();8//对电子文件进行哈希byte[]fileHash=GetFileHash(filePath);//取得公钥stringpublicKey=GetKeyFromContainer("公文",false);//取得私钥stringprivateKey=GetKeyFromContainer("公文”,true);15Console.WriteLine("发送方:A");Console.WriteLine("电子文件地址:”);

181Console.WriteLine(filePath);1920Console.WriteLine("哈希:");21Console.WriteLine(ConvertBytesToString(fileHash));2223Console.WriteLine("使用私钥进彳丁数子签名:”);24//取得电子签名25byte[]ElectronicSignature=EncryptHash(privateKey,fileHash);26Console.WriteLine(ConvertBytesToString(ElectronicSignature));2728Console.WriteLine("传送给接收方。”);29Console.WriteLine("");30stringfileCopyPath="C:\\公文接收.txt";31File.Copy(filePath,fileCopyPath,true);3233Console.WriteLine("是否篡改文件?(Y/N)");341stringsRe=string.Empty;35do36划{37sRe=Console.ReadLine();38}39while(sRe!="Y"&&sRe!="N");4041byte[]fileCopyHash;42if(sRe=="N")43申{44Console.WriteLine("接收方收到电子文件。”);4546Console.WriteLine("接收方:B");47Console.WriteLine("接收文件地址:");48Console.WriteLine(fileCopyPath);4950fileCopyHash=GetFileHash(fileCopyPath);51Console.WriteLine("哈希:");52Console.WriteLine(ConvertBytesToString(fileCopyHash));53}54else55申{56Console.WriteLine("正在篡改文件。”);57sw=newStreamWriter(fileCopyPath);58sw.WriteLine("公文已被篡改。”);59sw.Close();6061Console.WriteLine("接收方收到电子文件。”);

626364656263646566676869707172737475767778白7980卜8182勺8384858687Console.WriteLine("接收文件地址:");Console.WriteLine(fileCopyPath);fileCopyHash=GetFileHash(fileCopyPath);Console.WriteLine("哈希:");Console.WriteLine(ConvertBytesToString(fileCopyHash));}Console.WriteLine("公钥:");Console.WriteLine(publicKey);〃使用公钥进行验证Console.WriteLine("使用公钥进行验证:”);if(DecryptHash(publicKey,fileCopyHash,ElectronicSignature)){Console.WriteLine("通过验证,电子文件合法有效。”);}else{Console.WriteLine("未通过验证,电子文件非法或被人篡改过。");}Console.Read();}4、 问题的解决由主体程序我们可以得出这样的结论,当对电子文件进行数字签名时,此时电子文档是得到了签名者的认可的,也证明了此时电子文档的合法性与不可抵赖。如果此电子文档在传输过程中被篡改后,则数字签名失效,并可证明被篡改的电子文档与进行数字签名时被认可的电子文档不一致。这样就保护了双方利益。而此实现也楔合了《中华人民共和国电子签名法》第五条第二款,“能够可靠地保证自最终形成时起,内容保持完整、未被更改。但是,在数据电文上增加背书以及数据交换、储存和显示过程中发生的形式变化不影响数据电文的完整性。”5、 结论及展望当然,根据《中华人民共和国电子签名法》第十三条,本例只完成了其中第三第四二条款,其第一第二二个条款还需完善。以下是第十三条:(一) 电子签名制作数据用于电子签名时,属于电子签名人专有;(二) 签署时电子签名制作数据仅由电子签名人控制;(三) 签署后对电子签名的任何改动能够被发现;(四) 签署后对数据电文内容和形式的任何改动能够被发现。本来是不想使用论文这种形式来写这篇,但为了锻炼自己写论文的能力,还是斗胆用论文写出来了,如有何不确之处,望勉之。完整代码如下:

usingSystem;usingSystem.IO;usingSystem.Security.Cryptography;namespaceoozinoz1日田{白由///<summary>I///Class5的摘要说明。r///</summary>——HU- publicclassClass5——HU- staticvoidMain(){//生成电子文件stringfilePath="C:\\公文.txt";StreamWritersw=File.CreateText(filePath);sw.Write(”测试公文”);sw.Close();//对电子文件进行哈希byte[]fileHash=GetFileHash(filePath);//取得公钥stringpublicKey=GetKeyFromContainer("公文",false);//取得私钥stringprivateKey=GetKeyFromContainer("公文”,true);Console.WriteLine("发送方:A");Console.WriteLine("电子文件地址:");Console.WriteLine(filePath);Console.WriteLine("哈希:");Console.WriteLine(ConvertBytesToString(fileHash));Console.WriteLine("使用私钥进行数字签名:”);//取得电子签名byte[]ElectronicSignature=EncryptHash(privateKey,fileHash);Console.WriteLine(ConvertBytesToString(ElectronicSignature));Console.WriteLine("传送给接收方。");Console.WriteLine("");stringfileCopyPath="C:\\公文接收.txt";File.Copy(filePath,fileCopyPath,true);Console.WriteLine("是否篡改文件?(Y/N)");stringsRe=string.Empty;I do{sRe=Console.ReadLine();卜}while(sRe!="Y"&&sRe!="N");Ibyte[]fileCopyHash;I if(sRe=="N"){Console.WriteLine("接收方收到电子文件。”);IConsole.WriteLine("接收方:B");Console.WriteLine("接收文件地址:");Console.WriteLine(fileCopyPath);IfileCopyHash=GetFileHash(fileCopyPath);Console.WriteLine("哈希:");Console.WriteLine(ConvertBytesToString(fileCopyHash));卜}else{Console.WriteLine("正在篡改文件。”);sw=newStreamWriter(fileCopyPath);sw.WriteLine("公文已被篡改。”);sw.Close();IConsole.WriteLine("接收方收到电子文件。”);IConsole.WriteLine("接收方:");Console.WriteLine("接收文件地址:");Console.WriteLine(fileCopyPath);IfileCopyHash=GetFileHash(fileCopyPath);Console.WriteLine("哈希:");Console.WriteLine(ConvertBytesToString(fileCopyHash));}IConsole.WriteLine("公钥:");Console.WriteLine(publicKey);II 〃使用公钥进行验证Console.WriteLine("使用公钥进行验证:");if(DecryptHash(publicKey,fileCopyHash,ElectronicSignature))

{Console.WriteLine("通过验证,电子文件合法有效。”);}else{Console.WriteLine("未通过验证,电子文件非法或被人篡改过。");}Console.Read();}///<summary>///将Byte[]转换成十六进制字符串///</summary>///<paramname="bytes">要转换的Byte[]</param>///<returns>十六进制字符串</returns〉publicstaticstringConvertBytesToString(byte[]bytes){stringbytestring=string.Empty;if(bytes!=null&&bytes.Length>0){for(inti=o;i<bytes.Length;i++){bytestring+=bytes[i].ToString("X")+"";}}returnbytestring;}///<summary>///<summary>///得到指定电子文件的哈希///</summary>///<paramname="filePath">电子文件地址</param>///<returns>哈希值</returns〉publicstaticbyte[]GetFileHash(stringfilePath){FileStreamobjFile=File.OpenRead(filePath);HashAlgorithmMD5=HashAlgorithm.Create("MD5");byte[]Hashbyte=MD5.ComputeHash(objFile);objFile.Close();returnHashbyte;}catch{returnnull;卜}}///<summary>///得到公钥与私钥///</summary>///<paramname="ContainerName">私钥容器名</param>///<paramname="privatekey">真为得到私钥,假为得到公钥</param>///<returns>公钥或私钥</returns〉publicstaticstringGetKeyFromContainer(stringContainerName,boolprivatekey){CspParameterscp=newCspParameters();cp.KeyContainerName=ContainerName;RSACryptoServiceProviderrsa=newRSACryptoServiceProvider(cp);returnrsa.ToXmlString(privatekey);}///<summary>///对哈希进行数字签名///</summary>///<paramname="privateKey">私钥</param>///<paramname="fileHash">电子文件哈

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论