✅ 操作成功!

电子签章制作

发布时间:2023-06-07 作者:admin 来源:文学

电子签章制作

电子签章制作

英文电视剧-肥东县邮编

2023年2月22日发(作者:石勒简介)1.电子签章技术的应用2、引言传统的交易行为和政府间的公文传送,必须要用书面的文件来完成,为了保证文件是某个当事人或者机关签发的,并且文件没有被篡改,还必须要有签发人的手写签字或者公章。网络环境中,文件的传递采取电子的方式,比如E-mail。这种方式最大的优点就是速度快,文件可以在数秒中到达远在万里之外的客户手中。在“时间就是金钱、效率就是生命”的生意场上,这种优势无疑成为广大厂商的首选。电子文件并非只用于合同的签订和政府文件的传递,而是适用于所有信息的传递。可以理想化地认为,未来的信息传递,可以不借助于任何纸张。但如何保证一项文件或者一条信息是某个人发出的?某个人发出文件或者信息后,如果发现对自己不利抵赖怎么办?如果文件或者信息在网络传输过程中被他人截取,并被篡改了怎么办?许多人都知道,我们平时发送和接收的电子邮件是不加密的,对于某些人比如网管员来说,看这些文件甚至比看没有封上的书面信件更容易。3、 实例某信息公司要求研发一套办公自动化系统,其中就包括了对电子公文进行电子签章的功能,本人有幸参与并设计了电子签章部份。目前最成熟的电子签章技术就是“数字签章(Digital Signature)”,它是以公钥及私钥的“非对称型”密码技术制作的电子签章。使用原理大致为:由计算机程序将密钥和需传送的文件浓缩成信息摘要予以运算,得出数字签章,将数字签章并同原交易信息传送给对方,后者可用公钥来验证该信息确实由前者传送、并可查验文件在传送过程是否遭他人篡改,并防止对方抵赖。由于数字签章技术采用的是单向不可逆运算方式,要想对其破解,以目前的计算机速度以及技术而言,几乎是不可能的。文件传输可选择明文或密文进行传输。因此,从某种意义上讲,使用电子文件和数字签章,甚至比使用经过签字盖章的书面文件安全得多。设计之初,我就先提出了需要解决的几个问题:如何保证电子文件在传输过程中不被篡改?如何保证电子文件合法性及不可抵赖?一般来说要保证电子文件在传输过程中不被篡改,一是对电子文件进行私钥加密。在传输方使用私钥对电子文件进行明文加密,接收方再用私钥对传输过来的密文进行解密,以此来达到电子文件不被篡改。但此方法需要传输方与接收方都拥有私钥而且出现问题后双方都可能指责对方将私钥解密,因此单纯使用此方法,一般都只用于安全性要求不高的应用,不值得推荐。二是传输方对电子文件创建哈希,将电子文件与哈希一同发给接收方,接收方对接受到的电子文件也创建哈希,然后对比哈希值,以此来达到电子文件不被篡改。这是本人所选用的方案。下面是根据本人电子签章设计所写的一个DEMO片段,以供参考。以下是对电子文件创建哈希的具本实现(使用了MD5加密): 1 /// 2 /// 得到指定电子文件的哈希3 /// 4 /// 电子文件地址5 /// 哈希值6 public static byte[] GetFileHash(string filePath)7 {8 try9 {10 FileStream objFile = ad(filePath);11 HashAlgorithm MD5 = ("MD5");12 byte[] Hashbyte = eHash(objFile);13 ();14 return Hashbyte; 15 }16 catch17 {18 return null;19 }20 }要实现合法性及不可抵赖就必需使用公钥私钥非对称加密方式并结合哈希加密方式。公钥及私钥是一对很有意思的组合,它们是成对使用的,一一对应的,使用私钥加密的数据,可以使用公钥来证明是否是由此公钥所对应的私钥所加密的,将电子文件的哈希用私钥加密,接收人就算出电子文件的哈希,然后用公钥来验证电子文件是否是传输者所确认的文件。生成公钥及私钥:1 /// 2 /// 得到公钥与私钥3 /// 4 /// 私钥容器名5 /// 真为得到私钥,假为得到公钥6 /// 公钥或私钥7 public static string GetKeyFromContainer(string ContainerName,bool privatekey)8 {9 CspParameters cp = new CspParameters();10 tainerName = ContainerName;11 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);12 return tring(privatekey);13 }对电子文件的哈希进行数字签名:1 /// 2 /// 对哈希进行数字签名3 /// 4 /// 私钥5 /// 电子文件哈希6 /// 7 public static byte[] EncryptHash(string privateKey,byte[] fileHash)8 {9 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();10 11 lString(privateKey);12 13 RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);14 15 hAlgorithm("MD5");16 17 return Signature(fileHash);18 }19 对数字签名用公钥进行验证1 /// 2 /// 对数字签名用公钥进行验证3 /// 4 /// 公钥5 /// 接收到的电子文件的哈希6 /// 数字签名7 /// 数字签名有效为真,数字签名无效为假8 public static bool DecryptHash(string publicKey,byte[] fileHash,byte[] electronicSignature)9 {10 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();11 12 lString(publicKey);13 14 RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);15 16 hAlgorithm("MD5");17 18 return Signature(fileHash,electronicSignature);19 }主体程序1 static void Main()2 {3 // 生成电子文件4 string filePath = "C:公文.txt";5 StreamWriter sw = Text(filePath);6 ("测试公文");7 ();8 9 // 对电子文件进行哈希 10 byte[] fileHash = GetFileHash(filePath);11 // 取得公钥12 string publicKey = GetKeyFromContainer("公文",false);13 // 取得私钥14 string privateKey = GetKeyFromContainer("公文",true);15 16 ine("发送方:A");17 ine("电子文件地址:");18 ine(filePath);19 20 ine("哈希:");21 ine(ConvertBytesToString(fileHash));22 23 ine("使用私钥进行数字签名:");24 // 取得电子签名25 byte[] ElectronicSignature = EncryptHash(privateKey,fileHash);26 ine(ConvertBytesToString(ElectronicSignature));27 28 ine("传送给接收方。");29 ine("");30 string fileCopyPath = "C:公文接收.txt";31 (filePath,fileCopyPath,true);32 33 ine("是否篡改文件?(Y/N)");34 string sRe = ;35 do36 {37 sRe = ne();38 }39 while(sRe != "Y" && sRe != "N");40 41 byte[] fileCopyHash;42 if(sRe == "N")43 {44 ine("接收方收到电子文件。");45 46 ine("接收方:B");47 ine("接收文件地址:");48 ine(fileCopyPath);49 50 fileCopyHash = GetFileHash(fileCopyPath);51 ine("哈希:");52 ine(ConvertBytesToString(fileCopyHash));53 }54 else55 {56 ine("正在篡改文件。");57 sw = new StreamWriter(fileCopyPath);58 ine("公文已被篡改。");59 ();60 61 ine("接收方收到电子文件。");62 63 ine("接收方:");64 ine("接收文件地址:");65 ine(fileCopyPath);66 67 fileCopyHash = GetFileHash(fileCopyPath);68 ine("哈希:");69 ine(ConvertBytesToString(fileCopyHash));70 }71 72 ine("公钥:");73 ine(publicKey);74 75 //使用公钥进行验证76 ine("使用公钥进行验证:");77 if(DecryptHash(publicKey,fileCopyHash,ElectronicSignature))78 {79 ine("通过验证,电子文件合法有效。");80 }81 else82 {83 ine("未通过验证,电子文件非法或被人篡改过。");84 }85 86 (); 87 }4、 问题的解决由主体程序我们可以得出这样的结论,当对电子文件进行数字签名时,此时电子文档是得到了签名者的认可的,也证明了此时电子文档的合法性与不可抵赖。如果此电子文档在传输过程中被篡改后,则数字签名失效,并可证明被篡改的电子文档与进行数字签名时被认可的电子文档不一致。这样就保护了双方利益。而此实现也楔合了《中华人民共和国电子签名法》第五条第二款,“能够可靠地保证自最终形成时起,内容保持完整、未被更改。但是,在数据电文上增加背书以及数据交换、储存和显示过程中发生的形式变化不影响数据电文的完整性。”5、 结论及展望当然,根据《中华人民共和国电子签名法》第十三条,本例只完成了其中第三第四二条款,其第一第二二个条款还需完善。以下是第十三条:(一)电子签名制作数据用于电子签名时,属于电子签名人专有; (二)签署时电子签名制作数据仅由电子签名人控制; (三)签署后对电子签名的任何改动能够被发现; (四)签署后对数据电文内容和形式的任何改动能够被发现。本来是不想使用论文这种形式来写这篇,但为了锻炼自己写论文的能力,还是斗胆用论文写出来了,如有何不确之处,望勉之。完整代码如下:using System;using ;using graphy;namespace oozinoz1{/// /// Class5 的摘要说明。/// public class Class5{static void Main(){// 生成电子文件string filePath = "C:公文.txt";StreamWriter sw = Text(filePath);("测试公文");();// 对电子文件进行哈希 byte[] fileHash = GetFileHash(filePath);// 取得公钥string publicKey = GetKeyFromContainer("公文",false);// 取得私钥string privateKey = GetKeyFromContainer("公文",true);ine("发送方:A");ine("电子文件地址:");ine(filePath);ine("哈希:");ine(ConvertBytesToString(fileHash));ine("使用私钥进行数字签名:");// 取得电子签名byte[] ElectronicSignature = EncryptHash(privateKey,fileHash);ine(ConvertBytesToString(ElectronicSignature));ine("传送给接收方。");ine("");string fileCopyPath = "C:公文接收.txt";(filePath,fileCopyPath,true);ine("是否篡改文件?(Y/N)");string sRe = ;do{sRe = ne();}while(sRe != "Y" && sRe != "N");byte[] fileCopyHash;if(sRe == "N"){ine("接收方收到电子文件。");ine("接收方:B");ine("接收文件地址:");ine(fileCopyPath);fileCopyHash = GetFileHash(fileCopyPath);ine("哈希:");ine(ConvertBytesToString(fileCopyHash));}else{ine("正在篡改文件。");sw = new StreamWriter(fileCopyPath);ine("公文已被篡改。");();ine("接收方收到电子文件。");ine("接收方:");ine("接收文件地址:");ine(fileCopyPath);fileCopyHash = GetFileHash(fileCopyPath);ine("哈希:");ine(ConvertBytesToString(fileCopyHash));}ine("公钥:");ine(publicKey);//使用公钥进行验证ine("使用公钥进行验证:");if(DecryptHash(publicKey,fileCopyHash,ElectronicSignature)){ine("通过验证,电子文件合法有效。");}else{ine("未通过验证,电子文件非法或被人篡改过。");}(); }/// /// 将Byte[]转换成十六进制字符串/// /// 要转换的Byte[]/// 十六进制字符串public static string ConvertBytesToString(byte[] bytes){string bytestring = ;if(bytes != null && > 0){for(int i = 0;i<;i++){bytestring += bytes[i].ToString("X") + " ";}}return bytestring;}/// /// 得到指定电子文件的哈希/// /// 电子文件地址/// 哈希值public static byte[] GetFileHash(string filePath){try{FileStream objFile = ad(filePath);HashAlgorithm MD5 = ("MD5");byte[] Hashbyte = eHash(objFile);();return Hashbyte; }catch{return null;}}/// /// 得到公钥与私钥/// /// 私钥容器名/// 真为得到私钥,假为得到公钥/// 公钥或私钥public static string GetKeyFromContainer(string ContainerName,bool privatekey){CspParameters cp = new CspParameters();tainerName = ContainerName;RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);return tring(privatekey);}/// /// 对哈希进行数字签名/// /// 私钥/// 电子文件哈希/// public static byte[] EncryptHash(string privateKey,byte[] fileHash){RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();RSA.FromXmlString(privateKey);RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);hAlgorithm("MD5");return Signature(fileHash);}/// /// 对数字签名用公钥进行验证/// /// 公钥/// 接收到的电子文件的哈希/// 数字签名/// 数字签名有效为真,数字签名无效为假public static bool DecryptHash(string publicKey,byte[] fileHash,byte[] electronicSignature){RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();lString(publicKey);RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);hAlgorithm("MD5");return Signature(fileHash,electronicSignature);}}}

👁️ 阅读量:0