C#编程总结(八)数字签名
C#编程总结(八)数字签名
在日常工作中,有很多文件需要领导审阅、签名和盖章,由于公司业务开展,跨地域、跨国业务也日益普遍,领导签名盖章变得很麻烦,开始的时候人们通过邮寄、传真等方式来解决,但是耗费时间、人力、物力。在网络化日益深入的今天,需要领导审批、签字盖章的东西越来越多,时间也越来越紧迫,数字签名的出现,很好了解决了这一问题。推动了互联网及跨国集团的发展。
数字签名
1、概念
数字签名基于哈希算法和公钥加密算法,对明文报文先用哈希算法计算摘要,然后用私钥对摘要进行加密,得到的值就是原文的数字签名。
数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。
一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
可以由下图表示电子签名的用处:

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#编程总结(八)数字签名的更多相关文章
- cesium编程入门(八)设置材质
cesium编程入门(八)设置材质 Cesium中为几何形状设置材质有多种方法 第一种方法 Material 直接构建Cesium.Material对象,通过设置Material的属性来进行控制,官方 ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- Java编程思想—八皇后问题(数组法、堆栈法)
Java编程思想-八皇后问题(数组法.堆栈法) 实验题目:回溯法实验(八皇后问题) 实验目的: 实验要求: 实验内容: (1)问题描述 (2)实验步骤: 数组法: 堆栈法: 算法伪代码: 实验结果: ...
- 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...
- OpenGL基础图形编程(八)变换
八.OpenGL变换 OpenGL变换是本篇的重点内容,它包含计算机图形学中最主要的三维变换,即几何变换.投影变换.裁剪变换.视口变换,以及针对OpenGL的特殊变换概念理解和使用方法,如相机模拟.矩 ...
- 学习ASP.NET Core Blazor编程系列八——数据校验
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 南京邮电大学java程序设计作业在线编程第八次作业
程序设计类课程作业平台 王利国 主页 教学资源 我的作业列表 程序设计课 账户 王利国的"Java语言程序设计第8次作业(2018)"详细 主页 我的作业列表 作业结果详细 总分: ...
- C#编程(八十三)---------- 程序集的含义
程序集的含义 一.程序集是包含一个或多个类型定义文件和资源文件的集合.它允许我们分析可重用类型的逻辑表示和物理表示. 相当于你定义了一个项目XXProject,项目存在很多文件(类,窗体,接口,资源等 ...
- c++ 网络编程(八) LINUX-epoll/windows-IOCP下 socket opoll函数用法 优于select方法的epoll 以及windows下IOCP 解决多进程服务端创建进程资源浪费问题
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9622548.html 锲子:关于并发服务器中的I/O复用实现方式,前面在网络编程系列四还是五来 ...
随机推荐
- java中基本类型和包装类型实践经验
至今,小菜用java快两年了,有些事,也该有个总结. 基本类型和包装类型的概念在本文不作赘述. 如果这两种类型直接使用,倒没什么值得讨论的,无非就是自动装箱拆箱,java可以让你感觉不到他们的存在,但 ...
- CSS3 动画一瞥
伴随HTML5而来的CSS3让前端大湿们可以用简单的CSS样式即可写出动画效果来,而在这之前,一提到动画我们可能会想到JavaScript,Flash,Java插件等.如果是用JavaScript那倒 ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Bootstrap~多级导航(级联导航)的实现
回到目录 在bootstrap官方来说,导航最多就是两级,两级以上是无法实现的,大叔找了一些第三方的资料,终于找到一个不错的插件,使用上和效果上都还不错,现在和大家分享一下 插件地址:http://v ...
- EF架构~充血模型设置不被持久化的属性
回到目录 在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方 ...
- python学习 操作mysql 环境搭建
MySqlDB官网只支持Python3.4,这里Python3.5使用第三方库PyMysql连接Mysql数据库. 环境: window7.python3.5 下载PyMysql库:https://p ...
- html5 浏览器端数据库
为什么使用浏览器端数据库:随着浏览器的处理能力不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少用户等待从服务器获取数据的时间. 一.localStorage — 本地存储 可 ...
- Lock VS Monitor
Lock Monitor 多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换 首先,看代码: private static o ...
- javascript_core_06之正则、Math、Date
1.RegExp:Regular Expression,创建封装正则表达式: ①正则直接量:var reg=/reg/ig:②var reg=new RegExp(“reg”,“ig”): 2.Reg ...
- ajax获取json对象
ajax获取json对象 ajax获取json数据,都是一个原理,设置response 的Content-Type:application/json,这样浏览器自动会解析为json对象 $result ...