/*
 * 由SharpDevelop创建。
 * 用户: Administrator
 * 日期: 2018-04-17
 * 时间: 15:12
 * 
 * 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
 */

using System; 
using System.IO; 
using System.Security.Cryptography;

namespace oozinoz1 

     /**//// <summary> 
     /// Class5 的摘要说明。 
     /// </summary> 
     public class Class5 
    { 
         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();             
        }

/**//// <summary> 
         /// 将Byte[]转换成十六进制字符串 
         /// </summary> 
         /// <param name="bytes">要转换的Byte[]</param> 
         /// <returns>十六进制字符串</returns> 
         public static string ConvertBytesToString( byte[] bytes) 
        { 
             string bytestring = string. Empty; 
             if(bytes != null && bytes.Length > 0) 
            { 
                 for( int i = 0;i<bytes.Length;i++) 
                { 
                    bytestring += bytes[i]. ToString( "X") + " "; 
                } 
            } 
             return bytestring; 
        }

/**//// <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); 
        } 
    } 
}

c# 电子协议签名demo相关推荐

  1. 小程序 uniapp 实现pdf 电子合同签名 并导出功能

    小程序 uniapp 实现pdf 电子合同签名 并导出功能 需求流程: 用户只允许上传pdf 后端将上传后的pdf以base64图片的形式返回 用户设置签名的位置 位置设置完成,将电子签名放到设定的位 ...

  2. 加热不燃烧电子烟方案Demo MG82F6D17

    概况 近两年,电子烟越来越受到资本的关注,很多关注消费领域的投资机构,都在扎堆看电子烟,促使越来越多的人才涌入进电子烟行业,也进一步促进了电子烟行业的发展. 伴随着电子烟行业的火热发展,各大方案企业对 ...

  3. winform 打印快递电子面单_隐私电子面单demo

    [c#]代码库using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sys ...

  4. java版本微信jssdk、微信验证签名demo(Servlet)

    开发背景 最近在学习java,所以从网上看了一些别人的代码,再加入了自己的一些理解,主要是担心之后会忘记,所以写下一篇东西记录一下思路. 一. 获取acess_token以及jsapiTicket 新 ...

  5. 发布《iBoard 电子学堂》DEMO代码

    ---------------------------------------- 版本信息:0.0.1.build590 功能:包含任意波发生器.示波器.电压表以及时钟等功能,基于 X-GUI. ht ...

  6. (IOS)签名Demo

    思路是将每一次按下屏幕的touch move时的点存到一个数组里,即一个数组相当于一个笔画:再将该代表笔画的数组保存到一个大数组中,每组每次touch的移动都历遍大数组和笔画数组,将点于点之间连接起来 ...

  7. java 生成电子合同_java实现电子合同签名

    1.引入docx4j 使用maven仓库引入jar包 ```java org.docx4j docx4j 6.1.2 ``` 2.docx4j配置 可以不添加配置文件,但debug日志会提示找不到do ...

  8. java,NIO,UDP协议网络通信DEMO

    @Testpublic void send() throws IOException {DatagramChannel dc = DatagramChannel.open();//设置非阻塞dc.co ...

  9. 微信二维码API支付实现demo

    目录 1.前置条件 1.1官方文档 1.2申请微信商户号 1.2.1申请步骤 2.后端API实现 3.前端实现 1.前置条件 1.1官方文档 新版微信:支付开发者文档 旧版文档:https://pay ...

最新文章

  1. Java图形化:布局方式
  2. 容器必须设置宽度吗_消防泵必须设置自动巡检柜吗
  3. tensorflow 训练权重不更新_TensorFlow模型剪枝原理
  4. 鸿蒙os首批适配机型,鸿蒙OS正式版首批名单曝光,适配速度让人意外,8款机型恭喜了...
  5. 前端学习(3229):React中的事件处理
  6. 2017年最新的全国省市sql数据
  7. 由汉诺塔引起的对递归的思考
  8. 每周进步要点(第50周12.4-12.11)
  9. linux 软raid配置-系统安装
  10. json,pickle,shelve序列化和反序列化
  11. php下载大文件不稳定,window_Apache2+PHP在Windows2000下不稳定解决方案,1  制作一个bat文件在计划 - phpStudy...
  12. 最小错误率贝叶斯决策的基本思想_基于最小错误率的贝叶斯决策
  13. 湖南大学ACM——10015.self-numbers
  14. 从程序员到项目经理(8):程序员加油站 -- 再牛也要合群
  15. 在IDEA中写Python
  16. EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的
  17. latex 输入上极限和下极限
  18. 百度AI加速器第七期火热招募
  19. TEM一维正演matlab,瞬变电磁法矩形线框一维正演及电磁信号去噪的研究
  20. 计算机网页设计论文加成品,计算机网页设计教学研究论文

热门文章

  1. android Jetpack StateFlow使用
  2. HFSS保姆级学习笔记实践篇(一)矩形微带贴片天线初步设计
  3. 确保web地址正确解决方案
  4. 读书百客:《感遇·兰叶春葳蕤》赏析
  5. 无法定位程序输入点于动态链接库***.dll 网上其他方法无效
  6. 【第五人格设计思路】 猩红新娘·时装设计思路
  7. 驱动技巧:如何在Win7下安装SATA驱动开启AHCI模式
  8. 挖掘一份行业长尾关键字词库步骤
  9. 炒股的智慧:股票投资93条秘籍
  10. 【网络仿真】ns-3基础(上)