c# 电子协议签名demo
/*
* 由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相关推荐
- 小程序 uniapp 实现pdf 电子合同签名 并导出功能
小程序 uniapp 实现pdf 电子合同签名 并导出功能 需求流程: 用户只允许上传pdf 后端将上传后的pdf以base64图片的形式返回 用户设置签名的位置 位置设置完成,将电子签名放到设定的位 ...
- 加热不燃烧电子烟方案Demo MG82F6D17
概况 近两年,电子烟越来越受到资本的关注,很多关注消费领域的投资机构,都在扎堆看电子烟,促使越来越多的人才涌入进电子烟行业,也进一步促进了电子烟行业的发展. 伴随着电子烟行业的火热发展,各大方案企业对 ...
- winform 打印快递电子面单_隐私电子面单demo
[c#]代码库using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sys ...
- java版本微信jssdk、微信验证签名demo(Servlet)
开发背景 最近在学习java,所以从网上看了一些别人的代码,再加入了自己的一些理解,主要是担心之后会忘记,所以写下一篇东西记录一下思路. 一. 获取acess_token以及jsapiTicket 新 ...
- 发布《iBoard 电子学堂》DEMO代码
---------------------------------------- 版本信息:0.0.1.build590 功能:包含任意波发生器.示波器.电压表以及时钟等功能,基于 X-GUI. ht ...
- (IOS)签名Demo
思路是将每一次按下屏幕的touch move时的点存到一个数组里,即一个数组相当于一个笔画:再将该代表笔画的数组保存到一个大数组中,每组每次touch的移动都历遍大数组和笔画数组,将点于点之间连接起来 ...
- java 生成电子合同_java实现电子合同签名
1.引入docx4j 使用maven仓库引入jar包 ```java org.docx4j docx4j 6.1.2 ``` 2.docx4j配置 可以不添加配置文件,但debug日志会提示找不到do ...
- java,NIO,UDP协议网络通信DEMO
@Testpublic void send() throws IOException {DatagramChannel dc = DatagramChannel.open();//设置非阻塞dc.co ...
- 微信二维码API支付实现demo
目录 1.前置条件 1.1官方文档 1.2申请微信商户号 1.2.1申请步骤 2.后端API实现 3.前端实现 1.前置条件 1.1官方文档 新版微信:支付开发者文档 旧版文档:https://pay ...
最新文章
- Java图形化:布局方式
- 容器必须设置宽度吗_消防泵必须设置自动巡检柜吗
- tensorflow 训练权重不更新_TensorFlow模型剪枝原理
- 鸿蒙os首批适配机型,鸿蒙OS正式版首批名单曝光,适配速度让人意外,8款机型恭喜了...
- 前端学习(3229):React中的事件处理
- 2017年最新的全国省市sql数据
- 由汉诺塔引起的对递归的思考
- 每周进步要点(第50周12.4-12.11)
- linux 软raid配置-系统安装
- json,pickle,shelve序列化和反序列化
- php下载大文件不稳定,window_Apache2+PHP在Windows2000下不稳定解决方案,1 制作一个bat文件在计划 - phpStudy...
- 最小错误率贝叶斯决策的基本思想_基于最小错误率的贝叶斯决策
- 湖南大学ACM——10015.self-numbers
- 从程序员到项目经理(8):程序员加油站 -- 再牛也要合群
- 在IDEA中写Python
- EasyNVR是怎么做到Web浏览器播放RTSP摄像机直播视频延时控制在一秒内的
- latex 输入上极限和下极限
- 百度AI加速器第七期火热招募
- TEM一维正演matlab,瞬变电磁法矩形线框一维正演及电磁信号去噪的研究
- 计算机网页设计论文加成品,计算机网页设计教学研究论文