电子签章(Electronic Signature)、数字签章(Digital Signature)、加密签名、公钥私钥、非对称加密、哈希加密、C#、MD5

摘要:

电子签章(Electronic Signature)泛指所有以电子形式存在,依附在电子文件并与其逻辑相关,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者同意电子文件所陈述事项的内容。包括数字签章技术和逐渐普及的用于身份验证的生物识别技术如指纹、面纹、DNA技术等。本文从OA系统项目中数字签章技术的设计来讲述如何使用微软公司的编程平台Vs.Net中的C#语言来实现数字签章技术。

正文:

1、所谓电子签章就是用于电子文件之上,与传统的手写签名、盖章具有完全相同功能的技术。有了电子签章,任何信息都可以放心地通过网络以电子文件的形式传输,因此,电子签章问题是电子商务和电子政务建设中必须首先解决的核心问题。

2、传统的交易行为和政府间的公文传送,必须要用书面的文件来完成,为了保证文件是某个当事人或者机关签发的,并且文件没有被篡改,还必须要有签发人的手写签字或者公章。电子文件并非只用于合同的签订和政府文件的传递,而是适用于所有信息的传递。可以理想化地认为,未来的信息传递,可以不借助于任何纸张。

3、  实例

目前最成熟的电子签章技术就是“数字签章(Digital Signature)”,它是以公钥及私钥的“非对称型”密码技术制作的电子签章。使用原理大致为:由计算机程序将密钥和需传送的文件浓缩成信息摘要予以运算,得出数字签章,将数字签章并同原交易信息传送给对方,后者可用公钥来验证该信息确实由前者传送、并可查验文件在传送过程是否遭他人篡改,并防止对方抵赖。由于数字签章技术采用的是单向不可逆运算方式,要想对其破解,以目前的计算机速度以及技术而言,几乎是不可能的。文件传输可选择明文或密文进行传输。因此,从某种意义上讲,使用电子文件和数字签章,甚至比使用经过签字盖章的书面文件安全得多。

设计之初,我就先提出了需要解决的几个问题:

如何保证电子文件在传输过程中不被篡改?

如何保证电子文件合法性及不可抵赖?

一般来说要保证电子文件在传输过程中不被篡改,一是对电子文件进行私钥加密。在传输方使用私钥对电子文件进行明文加密,接收方再用私钥对传输过来的密文进行解密,以此来达到电子文件不被篡改。但此方法需要传输方与接收方都拥有私钥而且出现问题后双方都可能指责对方将私钥解密,因此单纯使用此方法,一般都只用于安全性要求不高的应用,不值得推荐。二是传输方对电子文件创建哈希,将电子文件与哈希一同发给接收方,接收方对接受到的电子文件也创建哈希,然后对比哈希值,以此来达到电子文件不被篡改。这是本人所选用的方案。下面是根据本人电子签章设计所写的一个DEMO片段,以供参考。

以下是对电子文件创建哈希的具本实现(使用了MD5加密):

         <summary> /// 得到指定电子文件的哈希 /// </summary> /// <param name="filePath">电子文件地址</param> /// <returns>哈希值</returns> public static byte[] GetFileHash(string filePath) { try { FileStream objFile = File.OpenRead(filePath); HashAlgorithm MD5 = HashAlgorithm.Create("MD5"); byte[] Hashbyte = MD5.ComputeHash(objFile); objFile.Close(); return Hashbyte;         } catch { return null; } }

要实现合法性及不可抵赖就必需使用公钥私钥非对称加密方式并结合哈希加密方式。

公钥及私钥是一对很有意思的组合,它们是成对使用的,一一对应的,使用私钥加密的数据,可以使用公钥来证明是否是由此公钥所对应的私钥所加密的,将电子文件的哈希用私钥加密,接收人就算出电子文件的哈希,然后用公钥来验证电子文件是否是传输者所确认的文件。

生成公钥及私钥:

         <summary> /// 得到公钥与私钥 /// </summary> /// <param name="ContainerName">私钥容器名</param> /// <param name="privatekey">真为得到私钥,假为得到公钥</param> /// <returns>公钥或私钥</returns> public static string GetKeyFromContainer(string ContainerName,bool privatekey) { CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp); return rsa.ToXmlString(privatekey); } 

对电子文件的哈希进行数字签名:

         <summary> /// 对哈希进行数字签名 /// </summary> /// <param name="privateKey">私钥</param> /// <param name="fileHash">电子文件哈希</param> /// <returns></returns> public static byte[] EncryptHash(string privateKey,byte[] fileHash) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.FromXmlString(privateKey); RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA); RSAFormatter.SetHashAlgorithm("MD5"); return RSAFormatter.CreateSignature(fileHash); } 

对数字签名用公钥进行验证

         <summary> /// 对数字签名用公钥进行验证 /// </summary> /// <param name="publicKey">公钥</param> /// <param name="fileHash">接收到的电子文件的哈希</param> /// <param name="electronicSignature">数字签名</param> /// <returns>数字签名有效为真,数字签名无效为假</returns> public static bool DecryptHash(string publicKey,byte[] fileHash,byte[] electronicSignature) { RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); RSA.FromXmlString(publicKey); RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA); RSADeformatter.SetHashAlgorithm("MD5"); return RSADeformatter.VerifySignature(fileHash,electronicSignature); } 

主体程序

        static void Main() { // 生成电子文件 string filePath = "C:\\公文.txt"; StreamWriter sw = File.CreateText(filePath); sw.Write("测试公文"); sw.Close(); // 对电子文件进行哈希             byte[] fileHash = GetFileHash(filePath); // 取得公钥 string publicKey = GetKeyFromContainer("公文",false); // 取得私钥 string privateKey = 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(""); string fileCopyPath = "C:\\公文接收.txt"; File.Copy(filePath,fileCopyPath,true); Console.WriteLine("是否篡改文件?(Y/N)"); string sRe = string.Empty; do { sRe = Console.ReadLine(); } while(sRe != "Y" && sRe != "N"); byte[] fileCopyHash; if(sRe == "N") { Console.WriteLine("接收方收到电子文件。"); Console.WriteLine("接收方:B"); Console.WriteLine("接收文件地址:"); Console.WriteLine(fileCopyPath); fileCopyHash = GetFileHash(fileCopyPath); Console.WriteLine("哈希:"); Console.WriteLine(ConvertBytesToString(fileCopyHash)); } else { Console.WriteLine("正在篡改文件。"); sw = new StreamWriter(fileCopyPath); sw.WriteLine("公文已被篡改。"); sw.Close(); Console.WriteLine("接收方收到电子文件。"); Console.WriteLine("接收方:"); Console.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、  结论及展望

当然,根据《中华人民共和国电子签名法》第十三条,本例只完成了其中第三第四二条款,其第一第二二个条款还需完善。以下是第十三条:

(一)电子签名制作数据用于电子签名时,属于电子签名人专有;

(二)签署时电子签名制作数据仅由电子签名人控制;

(三)签署后对电子签名的任何改动能够被发现;

(四)签署后对数据电文内容和形式的任何改动能够被发现。

转载出处:https://blog.csdn.net/qincode/article/details/23284645

C# 电子签章的实现相关推荐

  1. 【电子签章】HTML格式合同转化成PDF文件 已下载

    代码下载地址: http://www.demodashi.com/demo/12476.html 一.主要思路 通过itextpdf 生成想要的pdf 文件 通过itextpdf 中 XMLWorke ...

  2. js 返回上一页面_pdf.js实战,含水印、电子签章解决方案

    项目涉及到移动端查看电子合同的问题,前前后后试了三种方案,真是一步一个坑,三种方案各有各的优点,不水,直接上代码,按照自己的需求选择. 一.pdf-vue 直接使用vue-pdf插件,核心的代码是pd ...

  3. 如何调整金格电子章服务器印章_电子签章赋能勘察设计新动力

    近些年,随着社会信息化程度的不断提高,大量的电子图纸作为承载信息的媒介成为辅助决策的重要手段,而确保电子图纸的安全性,唯一性和信息准确性成为首要问题,而对于电子图纸的成果保护,电子签章审批中签名的合法 ...

  4. java为PDF盖(签)电子签章--位置定位

    1.电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者 ...

  5. 使用电子签章确立在线医疗电子病历的法律地位

    确立电子病历的法律地位 防控疫情,普通群众只是居家减少外出,而医务人员只有一个选择,那就是迎难而上,抗击疫情.比较欣慰的是,为减轻医务人员压力,许多互联网平台纷纷开通线上问诊通道.互联网医院,在此次阻 ...

  6. 保险行业的电子签章应用场景:印章统一管、合同在线签

    随着"互联网保险"业务逐渐规范化,合法.有效的电子签章产品正在逐步成为各大保险公司规范在线投保业务的重要签约工具. "电子保单"逐步成为保险业务发展新常态: 2 ...

  7. 不动产登记+电子签章全程无纸化网上办,零跑腿!

    近日,国务院督查组在乌兰察布市集宁区暗访房本办理发现,有群众历时44天跑了4趟才拿到房本,但找"黄牛"代办1天内"神速"出证--办证效率低时间长.工作人员涉嫌与 ...

  8. 平台电子签章实现方法

    有的单位,需要在文件上盖章,从而彰显正式,以及法律效益!几经研究终于找到实现的办法,下面我们详细的讲下. 主要步骤: 1.公章制作:在OA个人信息-我的签名,哪里设置公章.先把公章制作成图片,然后新增 ...

  9. vue-pdf 打印文字空白、每一页多一个空白页、电子签章不显示

    bug图 效果图 标题 1 电子签章不显示 1. 1 修改node_modules/pdfjs-dist/build/pdf.worker.js 注释下图选定代码 1.2 修改node_modules ...

  10. HTML5印章绘制电子签章图片,中文英文椭圆章、中文英文椭圆印章 电子签章图片采集

    电子签章图片采集 印章图片的采集两种互补方式: 方式1:在线生成印章图片方式,但是这种方式有个弊端,对印章中公司名称字数有限制,字数越多可能就完蛋了. 方式2:上传印章扫描件,系统来对扫描图片进行处理 ...

最新文章

  1. 硬回车与软回车[转]
  2. hdu4635(最多加多少边,使得有向图不是强连通图)
  3. Spark Streaming从Kafka中获取数据,并进行实时单词统计,统计URL出现的次数
  4. android jni 调用java_Android JNI开发系列(九)JNI调用Java的静态方法实例方法
  5. 5.8 正则化和数据标准化
  6. php友价商城手游,2019年T5友价商城网站程序-伪静态规则
  7. 3位水仙花数计算pythonoj_Python解答蓝桥杯省赛真题之从入门到真题
  8. 《Node.js开发实战详解》学习笔记
  9. [Vue.js]实战 -- 电商项目(二)
  10. 尝试使用Microsoft IE 7.0 Beta 1
  11. loadrun Java 添加参数_loadrunner手动关联参数化问题总结
  12. 苹果手机一直显示搜索服务器,苹果手机safari浏览器搜索页面没有了
  13. 17 款程序员神级 Chrome 插件,爱了爱了!
  14. rounding mode
  15. 最近在琢磨的一个问题和我的尝试
  16. 微软的winget包管理器
  17. Java发送手机短信
  18. 外包 | LBP/HOG/CNN 实现对 CK/jaffe/fer2013 人脸表情数据集分类
  19. 如何成为合格的LINUX系统管理员(ZZ)
  20. flask获取参数类型和请求响应

热门文章

  1. IntelliJ IDEA使用教程(动图详解):Mac 系统下安装 IntelliJ IDEA
  2. App Inventer制作蓝牙通讯软件
  3. html表单实例:用户反馈表单页面代码
  4. mac安装绿联USB转以太网驱动
  5. ubuntu18.04+语音识别
  6. 使用命令运行jmeter并自动生成测试报告
  7. rs232读取智能电表_深度了解智能电度表,面板内容大揭秘!
  8. Cisco ASA 5585防火墙ASDM配置
  9. 计算机考研具体学科准备
  10. RF无线射频电路设计难点分析