C#实现数字签名

C#实现数字签名

 

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Security.Cryptography;

namespace DSAExample
{
public partial class MainForm : Form
{
    byte[] hashValue;
    byte[] signedHashValue;
    DSAParameters dsaKeyInfo;
    public MainForm()
    {
        InitializeComponent();
    }
    private void buttonOK_Click(object sender, EventArgs e)
    {
        try
        {
            DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
            //随机生成20个Hash值(这里并没有具体实现hash运算功能)
            List<byte> list = new List<byte>();
            Random r = new Random();
            for (int i = 0; i < 20; i++)
            {
                list.Add((byte)r.Next(255));
            }
            hashValue = list.ToArray();//将List对象转换成数组
            //导出公钥和私钥
            dsaKeyInfo = dsa.ExportParameters(true);
            //得到签名的Hash值
            signedHashValue = DSASignHash(hashValue, dsaKeyInfo, "SHA1");
            //此处应该将hashValue、signedHashValue以及公钥发
            //送给接收方。为简化起见,这里仅将Hash和签名的Hash显示出来
            textBoxHashValue.Text = GetHashString(hashValue);
            textBoxVerifyHashValue.Text = GetHashString(signedHashValue);
        }
        catch (ArgumentNullException err)
        {
            MessageBox.Show(err.Message);
        }
    }
    /// <summary>
    /// 根据哈希值拼接字符串
    /// </summary>
    /// <param name="bytes">哈希值</param>
    /// <returns>拼接的字符串</returns>
    private string GetHashString(byte[] bytes)
    {
        string s = "";
        for (int i = 0; i < bytes.Length; i++)
        {
            s += bytes[i].ToString() + ",";
        }
        s = s.TrimEnd(',');//删除最后的“,”
        return s;
    }
    /// <summary>
    /// 使用DSA算法签名哈希值
    /// </summary>
    /// <param name="HashToSign">要被签名的哈希值</param>
    /// <param name="dsaKeyInfo">DSA密钥信息</param>
    /// <param name="HashAlg">指定哈希算法</param>
    /// <returns>签名后的结果</returns>
    private byte[] DSASignHash(byte[] HashToSign, DSAParameters dsaKeyInfo, string HashAlg)
    {
        try
        {
            DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
            dsa.ImportParameters(dsaKeyInfo);
            DSASignatureFormatter DSAFormatter = new DSASignatureFormatter(dsa);//创建格式化数字签名对象
            DSAFormatter.SetHashAlgorithm(HashAlg);//设置hash算法
            return DSAFormatter.CreateSignature(HashToSign);//创建数字签名(即加密后且经过了hash运算的字符串)
        }
            //注意:数据进行hash运算成为了哈希值(简称哈希值一),哈希值再经过密钥加密则变成了数字签名
            //数字签名经过公钥解密后又变回成了哈希值(简称哈希值二)
            //如果哈希值一和哈希值二相等,说明数据签名是完整的,而且可以确定该消息是由持有该数字签名的私钥的人发送的。
        catch (CryptographicException err)
        {
            MessageBox.Show(err.Message);
            return null;
        }
    }
    private void buttonVerify_Click(object sender, EventArgs e)
    {
        //为简化起见,此处假定接收方已经接收到发
        //送方发送的hashValue、signedHashValue以及公钥
        //同时保证接收方和签名方使用相同的哈希算法(均为“SHA1”)
        try
        {
            DSACryptoServiceProvider dsa = new DSACryptoServiceProvider();
            dsa.ImportParameters(dsaKeyInfo);
            DSASignatureDeformatter DSADeformatter = new DSASignatureDeformatter(dsa);//生成反格式化(Deformatter)数字签名对象
            DSADeformatter.SetHashAlgorithm("SHA1");
            if (DSADeformatter.VerifySignature(hashValue, signedHashValue))
            {
                textBoxVerifyResult.Text = "验证成功";
            }
            else
            {
                textBoxVerifyResult.Text = "验证失败";
            }
        }
        catch (CryptographicException err)
        {
            MessageBox.Show(err.Message);
        }
    }
}
}


界面设置:

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值