c# 生成数字签名

通过查阅msdn数字证书相关信息,个人觉得程序的证书要最终发挥作用,应当是将我们自己的证书最终要导入到控制台的受信任的根证书颁发机构,不论可执行程序是在何时注册的数字证书(可能是已经注册好放入安装包,也可能是在安装时注册),这时以管理员运行时就会显示出证书的信息,若没有在受信任的根证书颁发机构,将显示发布者未知。

  那现在我们要做的也很明确了:

  1:首先我们需要生成一个自己的证书

  2:我们要将证书导入到 受信任的根证书颁发机构

  那如何生成自己的证书呢?微软提供有Makecert.exe(证书创建工具),也可以使用代码的方式生成,下面介绍如何使用Makecert.exe创建我们的证书

  Makecert.exe这个工具只要我们安装了visual studio,使用命令提示符就可以了

  在命令提示符内输入

  makecert -r -pe -n "CN=你的证书名字" -a sha1 -b 01/01/2012 -e 01/01/2040 -sky exchange -ss my

  -ss my:证书生成到个人证书位置,这时我们可以在控制台个人证书位置找到生成的证书了,参数的具体含义查看Makecert.exe

  因后续我们需要将证书在安装时导入到客户机器上,所以我们将生成好的证书导出,右键证书->所有任务->导出,如图

  我们选择默认的格式导出(.CER)。

  现在我们已经有了自己的证书文件,还需要将其导入到 受信任的根证书颁发机构。我们这块使用代码实现将其导入,操作类(X509Certificate2)。

  + View Code?

  X509Certificate2 cert = new X509Certificate2("逗豆豆.cer");

  bool my_import = false;

  bool root_import = false;

  if (cert != null)

  {

  var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);

  store2.Open(OpenFlags.ReadWrite);

  if (!store2.Certificates.Contains(cert))

  {

  my_import = true;

  store2.Add(cert);

  }

  var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

  store.Open(OpenFlags.ReadWrite);

  if (!store.Certificates.Contains(cert))

  {

  root_import = true;

  store.Add(cert);

  }

  }

  StringBuilder sb = new StringBuilder();

  if (my_import)

  {

  sb.Append("成功导入到个人证书目录\r\n");

  }

  if (root_import)

  {

  sb.Append("成功导入到受信任的根证书颁发机构证书目录\r\n");

  }

  if (sb.Length == 0)

  MessageBox.Show("已经导入过证书");

  else

  MessageBox.Show(sb.ToString());

  上面代码将证书导入到了个人证书以及受信任的根证书颁发机构,接下来我们需要对我们的可执行程序进行签名,那签名与生成证书类似,微软也有提供一个SignTool.exe(签名工具),同样打开命令提示符输入:signtool sign /a F:\SignatureDemo.exe,参数的具体含义查看SignTool.exe

  这个时候右键管理员身份运行就可以看到我们要的效果便达到了。但是实际项目中可能需要在安装程序的时候将证书导入,所以我们可以添加一个安装类,在重写安装的方法内将证书导入:

  + View Code?

  using System;

  using System.Collections;

  using System.Collections.Generic;

  using System.ComponentModel;

  using System.Configuration.Install;

  using System.Linq;

  using System.Security.Cryptography.X509Certificates;

  namespace SignatureDemoInstaller

  {

  [RunInstaller(true)]

  public partial class DemoInstaller : System.Configuration.Install.Installer

  {

  public DemoInstaller()

  {

  InitializeComponent();

  }

  //-------------重写安装方法------------------------------------------------

  public override void Install(IDictionary stateSaver)

  {

  base.Install(stateSaver);

  ImportCert();

  }

  //-------------导入证书----------------------------------------------------

  private void ImportCert()

  {

  X509Certificate2 cert = new X509Certificate2(Context.Parameters["targetdir"] + "\\Bin\\SityTech.cer");

  if (cert != null)

  {

  var store2 = new X509Store(StoreName.My, StoreLocation.CurrentUser);

  store2.Open(OpenFlags.ReadWrite);

  if (!store2.Certificates.Contains(cert))

  {

  store2.Add(cert);

  }

  var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

  store.Open(OpenFlags.ReadWrite);

  if (!store.Certificates.Contains(cert))

  {

  store.Add(cert);

  }

  }

  }

  }

  }

  五、源代码什么的

  关于如何打包以及部署问题,可以参考文章的最顶端有介绍,这里就不再赘述,实际步骤很简单,大家完全可以使用代码生成证书的方式,做到动态生成证书并导入,文章可能看起来排版不这么好,也是给想要深入研究的人一点点小建议,另外使用vs2011之前版本的部署项目,生成的msi文件安装完毕之后,桌面的快捷方式右键指向不到程序目录并且右键也没有管理员身份运行的选项,需要使用Orca工具编辑一下,安装完毕Orca之后右键Msi程序->用Orca编辑,在左边的Tables列表中找到Shortcut表,在右边记录中找到Directory为DesktopFolder的记录,修改该记录的Target属性为 [TARGETDIR]应用程序名称.exe即可。

  再另外一下..此文章生成证书仅限于学习交流,正式生产环境下,大家应该去证书颁发机构购买,其实很便宜的...,最后demo和msi编辑工具奉上,算是有点用的话,点下推荐吧

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字签名过程: (1) 发方A用自己的私钥PVA,采用非对称RSA算法,将原文信息进行哈希(hash)运算,并对hash值进行密,即得数字签名DS;(RSACryptoServiceProvider.SignData()) (3) 发方A用对称算法AES的对称密钥SK对原文信息、数字签名SD及发方A证书的公钥PBA采用对称算法密,得密信息E;(Rijndael.CreateEncryptor()) (4) 发方用收方B的公钥PBB,采用RSA算法对对称密钥SK密,形成数字信封DE,就好像将对称密钥SK装到了一个用收方公钥密的信封里;(RSACryptoServiceProvider.Encrypt()) (5) 发方A将密信息E和数字信封DE一起发送给收方B; (6) 收方B接受到数字信封DE后,首先用自己的私钥PVB解密数字信封,取出对称密钥SK;(RSACryptoServiceProvider.Decrypt()) (7) 收方B用对称密钥SK通过AES算法解密密信息E,还原出原文信息、数字签名SD及发方A证书的公钥PBA;(Rijndael.CreateDecryptor()) (8) 收方B验证数字签名,先用发方A的公钥解密数字签名得数字摘要MD; (9) 收方B同时将原文信息用同样的哈希运算,求得一个新的数字摘要MD`;(RSACryptoServiceProvider.VerifyData()) (10)将两个数字摘要MD和MD`进行比较,验证原文是否被修改。如果二者相等,说明数据没有被篡改,是保密传输的,签名是真实的;否则拒绝该签名。 程序用法: “生成证书”按钮,生成发送方、接收方对应的公钥证书和私钥证书。 “签名”按钮,使用发送方私钥、发送方公钥、接收方公钥对文本框中的文本进行数字签名。得到签名后的文本。 “还原验证”按钮,使用接收方私钥将签名后的文本还原,并进行验证。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值