C#实现数字签名

转载 2013年12月06日 08:24:10

C#实现数字签名

 

[csharp] view plaincopy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Windows.Forms;  
  4. using System.Security.Cryptography;  
  5.   
  6. namespace DSAExample  
  7. {  
  8. public partial class MainForm : Form  
  9. {  
  10.     byte[] hashValue;  
  11.     byte[] signedHashValue;  
  12.     DSAParameters dsaKeyInfo;  
  13.     public MainForm()  
  14.     {  
  15.         InitializeComponent();  
  16.     }  
  17.     private void buttonOK_Click(object sender, EventArgs e)  
  18.     {  
  19.         try  
  20.         {  
  21.             DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();  
  22.             //随机生成20个Hash值(这里并没有具体实现hash运算功能)  
  23.             List<byte> list = new List<byte>();  
  24.             Random r = new Random();  
  25.             for (int i = 0; i < 20; i++)  
  26.             {  
  27.                 list.Add((byte)r.Next(255));  
  28.             }  
  29.             hashValue = list.ToArray();//将List对象转换成数组  
  30.             //导出公钥和私钥  
  31.             dsaKeyInfo = dsa.ExportParameters(true);  
  32.             //得到签名的Hash值  
  33.             signedHashValue = DSASignHash(hashValue, dsaKeyInfo, "SHA1");  
  34.             //此处应该将hashValue、signedHashValue以及公钥发  
  35.             //送给接收方。为简化起见,这里仅将Hash和签名的Hash显示出来  
  36.             textBoxHashValue.Text = GetHashString(hashValue);  
  37.             textBoxVerifyHashValue.Text = GetHashString(signedHashValue);  
  38.         }  
  39.         catch (ArgumentNullException err)  
  40.         {  
  41.             MessageBox.Show(err.Message);  
  42.         }  
  43.     }  
  44.     /// <summary>  
  45.     /// 根据哈希值拼接字符串  
  46.     /// </summary>  
  47.     /// <param name="bytes">哈希值</param>  
  48.     /// <returns>拼接的字符串</returns>  
  49.     private string GetHashString(byte[] bytes)  
  50.     {  
  51.         string s = "";  
  52.         for (int i = 0; i < bytes.Length; i++)  
  53.         {  
  54.             s += bytes[i].ToString() + ",";  
  55.         }  
  56.         s = s.TrimEnd(',');//删除最后的“,”  
  57.         return s;  
  58.     }  
  59.     /// <summary>  
  60.     /// 使用DSA算法签名哈希值  
  61.     /// </summary>  
  62.     /// <param name="HashToSign">要被签名的哈希值</param>  
  63.     /// <param name="dsaKeyInfo">DSA密钥信息</param>  
  64.     /// <param name="HashAlg">指定哈希算法</param>  
  65.     /// <returns>签名后的结果</returns>  
  66.     private byte[] DSASignHash(byte[] HashToSign, DSAParameters dsaKeyInfo, string HashAlg)  
  67.     {  
  68.         try  
  69.         {  
  70.             DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();  
  71.             dsa.ImportParameters(dsaKeyInfo);  
  72.             DSASignatureFormatter DSAFormatter = new DSASignatureFormatter(dsa);//创建格式化数字签名对象  
  73.             DSAFormatter.SetHashAlgorithm(HashAlg);//设置hash算法  
  74.             return DSAFormatter.CreateSignature(HashToSign);//创建数字签名(即加密后且经过了hash运算的字符串)  
  75.         }  
  76.             //注意:数据进行hash运算成为了哈希值(简称哈希值一),哈希值再经过密钥加密则变成了数字签名  
  77.             //数字签名经过公钥解密后又变回成了哈希值(简称哈希值二)  
  78.             //如果哈希值一和哈希值二相等,说明数据签名是完整的,而且可以确定该消息是由持有该数字签名的私钥的人发送的。  
  79.         catch (CryptographicException err)  
  80.         {  
  81.             MessageBox.Show(err.Message);  
  82.             return null;  
  83.         }  
  84.     }  
  85.     private void buttonVerify_Click(object sender, EventArgs e)  
  86.     {  
  87.         //为简化起见,此处假定接收方已经接收到发  
  88.         //送方发送的hashValue、signedHashValue以及公钥  
  89.         //同时保证接收方和签名方使用相同的哈希算法(均为“SHA1”)  
  90.         try  
  91.         {  
  92.             DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();  
  93.             dsa.ImportParameters(dsaKeyInfo);  
  94.             DSASignatureDeformatter DSADeformatter = new DSASignatureDeformatter(dsa);//生成反格式化(Deformatter)数字签名对象  
  95.             DSADeformatter.SetHashAlgorithm("SHA1");  
  96.             if (DSADeformatter.VerifySignature(hashValue, signedHashValue))  
  97.             {  
  98.                 textBoxVerifyResult.Text = "验证成功";  
  99.             }  
  100.             else  
  101.             {  
  102.                 textBoxVerifyResult.Text = "验证失败";  
  103.             }  
  104.         }  
  105.         catch (CryptographicException err)  
  106.         {  
  107.             MessageBox.Show(err.Message);  
  108.         }  
  109.     }  
  110. }  
  111. }  


界面设置:

相关文章推荐

c# 生成数字签名

通过查阅msdn数字证书相关信息,个人觉得程序的证书要最终发挥作用,应当是将我们自己的证书最终要导入到控制台的受信任的根证书颁发机构,不论可执行程序是在何时注册的数字证书(可能是已经注册好放入安装包,...

C#实现RSA加密与解密、签名与认证

一、RSA简介 RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

CA证书应用二:制作带数字签名的PDF文档

使用CA证书,制作带数字签名(电子签章)的PDF文档
  • yyfzy
  • yyfzy
  • 2015年07月13日 16:07
  • 3154

去除PDF文件的数字签名、密码

平时工作忙,没时间看纸质的书,gong

PDF文件中的数字签名之(在一个PDF文件的签名代表)

原文地址:https://www.adobe.com/devnet-docs/acrobatetk/tools/DigSig/Acrobat_DigitalSignatures_in_PDF.pdf ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

对PDF进行数字签名,生成可信的文档

电子账单、回单、通知、合同等越来越流行了,电子文档的可信性变得非常重要。 PDF是理想的电子文档格式,有下面这些优势: 1、具有良好的版式,可以非常精美 2、适应于各种平台:windows、l...
  • xdocs
  • xdocs
  • 2015年12月05日 23:29
  • 1075

PDF时间戳数字签名

可信时间戳是由联合信任时间戳服务中心(TSA:Time Stamp Authority)颁发的具有法律效力的电子凭证, 时间戳与电子数据唯一对应,其中包含电子数据 “指纹”、产生时间、时间戳服务中心信...

百度ak验证sn生成算法

参考地址:http://developer.baidu.com/map/index.php?title=lbscloud/api/appendix 假设ak=yourak(yourak为一个字符串)...
  • boonya
  • boonya
  • 2014年12月03日 13:26
  • 9082
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#实现数字签名
举报原因:
原因补充:

(最多只允许输入30个字)