C#编程总结(八)数字签名

摘要:
C#编程总结(八)数字签名在日常工作中,有很多文件需要领导审阅、签名和盖章,由于公司业务开展,跨地域、跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄、传真等方式来解决,但是耗费时间、人力、物力。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
C#编程总结(八)数字签名

在日常工作中,有很多文件需要领导审阅、签名和盖章,由于公司业务开展,跨地域、跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄、传真等方式来解决,但是耗费时间、人力、物力。在网络化日益深入的今天,需要领导审批、签字盖章的东西越来越多,时间也越来越紧迫,数字签名的出现,很好了解决了这一问题。推动了互联网及跨国集团的发展。

数字签名

1、概念

数字签名基于哈希算法和公钥加密算法,对明文报文先用哈希算法计算摘要,然后用私钥对摘要进行加密,得到的值就是原文的数字签名。

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。

一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。

可以由下图表示电子签名的用处:

C#编程总结(八)数字签名第1张

2、工作原理

流程图如下:

C#编程总结(八)数字签名第2张

数字签名的使用一般涉及以下几个步骤,我们通过安全电子邮件为案例进行介绍

(1)发件人生成或取得独一无二的加密密码组,包括私钥和公钥。

(2)发件人书写电子邮件

(3)发件人用安全的摘要算法获取电子邮件的信息摘要

(4)发件人再使用私钥对信息摘要进行加密,即可得到数字签名。  

(5)发件人将数字签名附在信息之后.

(6)发件人将数字签名和信息(加密或未加密)发送给电子收件人.

(7)收件人使用发件人的公共密码(公钥)确认发件人的电子签名,即将发件人的数字签名通过公钥进行解密,得到信息摘要

(8)收件人使用同样安全的摘要算法,获取信息(加密或未加密)的"信息摘要".

(9)收件人比较两个信息摘要.假如两者相同,则收件人可以确信信息在签发后并未作任何改变

(10) 收件人从证明机构处获得认证证书(或者是通过信息发件人获得),这一证书用以确认发件人发出信息上的数字签名的真实性.证明机构在数字签名系统中是一个典型的受委托管理证明业务的第三方.该证书包含发件人的公共密码和姓名(以及其他可能的附加信息),由证明机构在其上进行数字签名.

其中,第(1)~(6)是数字签名的制作过程,(7)~(10)是数字签名的核实过程

3、主要作用

1、防冒充,因为私钥只有签名者自己知道,其他人不能伪造出正确的签名
2、可鉴别身份,接收方用发送方的公开公钥对报文签名进行解密运算后,和原文进行匹配
3、防篡改,明文和签名值一起发送,相互验证,防止数据被篡改
4、防抵赖,签名值可以鉴别身份,带签名的数据里包含的信息签名者是不能抵赖的

4、应用

现在典型的应用如:网上银行、电子商务、电子政务、网络通信等

其中一个最重要的应用场景为:数字的证书,后续有具体文章对其进行详细介绍。

5、通过RSA实现数字签名

数字签名

复制代码
        /// <summary>
        /// 数字签名
        /// </summary>
        /// <param name="plaintext">原文</param>
        /// <param name="privateKey">私钥</param>
        /// <returns>签名</returns>
        public static string HashAndSignString(string plaintext, string privateKey)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
            {
                RSAalg.FromXmlString(privateKey);
                //使用SHA1进行摘要算法,生成签名
                byte[] encryptedData = RSAalg.SignData(dataToEncrypt, new SHA1CryptoServiceProvider());
                return Convert.ToBase64String(encryptedData);
            }
        }
复制代码

签名认证:

复制代码
        /// <summary>
        /// 验证签名
        /// </summary>
        /// <param name="plaintext">原文</param>
        /// <param name="SignedData">签名</param>
        /// <param name="publicKey">公钥</param>
        /// <returns></returns>
        public static bool VerifySigned(string plaintext, string SignedData, string publicKey)
        {
            using (RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider())
            {
                RSAalg.FromXmlString(publicKey);
                UnicodeEncoding ByteConverter = new UnicodeEncoding();
                byte[] dataToVerifyBytes = ByteConverter.GetBytes(plaintext);
                byte[] signedDataBytes = Convert.FromBase64String(SignedData);
                return RSAalg.VerifyData(dataToVerifyBytes, new SHA1CryptoServiceProvider(), signedDataBytes);
            }
        }
复制代码

测试用例:

复制代码
        public static void TestSign()
        {
            string originalData = "文章不错,这是我的签名:奥巴马!";
            Console.WriteLine("签名数为:{0}",originalData);
            KeyValuePair<string,string> keyPair = Encrypter.CreateRSAKey();
            string privateKey = keyPair.Value;
            string publicKey = keyPair.Key;
            //1、生成签名,通过摘要算法
            string signedData = Encrypter.HashAndSignString(originalData, privateKey);
            Console.WriteLine("数字签名:{0}",signedData);
            //2、验证签名
            bool verify = Encrypter.VerifySigned(originalData, signedData,publicKey);
            Console.WriteLine("签名验证结果:{0}",verify);
        }
复制代码

源码地址:

http://files.cnblogs.com/yank/EncriptSample.zip

免责声明:文章转载自《C#编程总结(八)数字签名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转载]阿里云ECS服务器安装.Net Framework 3.5 失败的解决方法VBS基本知识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

将Flash的Sprite导入Unity(解释说明版)

usingUnityEngine; usingUnityEditor; usingSystem.IO; usingSystem.Xml; usingSystem.Reflection; public classAutoSliceSpriteSheetWithXML : AssetPostprocessor { private voidOnPr...

Word,Excel,pdf,txt等文件上传并提取内容

近期项目需求:1.要用到各种文件上传,下载。 2.并对文件进行搜索。 3.仅仅要文件里包括有搜索的内容,所有显示出来。 今天正好有时间整理一下,方便以后阅读,及对须要用到的朋友提供微薄之力。首先在实现文件上传时,使用的struts2自带的文件上传功能,通过流的方式将文件保存,在下载的时候通过流的方式写出就可以。这个实现起来不是非常难,主要是对各种文件...

php数据类型存储memcache探讨

一、标量类型:整型 浮动型 布尔 字符串 // 实例化一个memcache的类 $mem = new Memcache(); // 连接memcache的服务器 $mem->connect('localhost', 11211); // 设置数据 $mem->set('int',100,0,3600); $mem->set('float'...

使用 ASP.NET 一般处理程序或 WebService 返回 JSON

今天, 将为大家说明如何在 ASP.NET 中使用一般处理程序或者 WebService 向 javascript 返回 JSON. 本文更新: 2011-12-9: 增加 -:data 的说明. 由于精力有限, 不能在多个博客中保证文章的同步, 可在如下地址查看最新内容, 请谅解: http://code.google.com/p/zsharedcode...

加载配置文件

前言:如果我们需要调用某个方法,其中的参数为可更改,我们最好是采用配置文件的方式来写,这样便于管理 比如我在写一个通过SFTP连接服务器的环节 public class SFTPUtil { private static Logger log=Logger.getLogger(SFTPUtil.class.getName());...

springboot2.0 redis EnableCaching的配置和使用

一、前言   关于EnableCaching最简单使用,个人感觉只需提供一个CacheManager的一个实例就好了。springboot为我们提供了cache相关的自动配置。引入cache模块,如下。 二、maven依赖 <dependency> <groupId>org.springframework.boot&...