C#实现数字签名

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

界面设置:

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: