数字签名原理简述

本文结合下面两个问题来讲解数字签名的基本原理。结合图片希望能给大家一个清晰简单明了的分析和讲解。

1. 问题描述:

(1)用户A向远方的用户B发送一个消息,用户B如何确认所收到的消息在传输的过程中没被篡改过?

(2)用户B收到了消息之后,如何防止A随之否认这个消息是他发送的呢?

---------阅读本文的知识储备:了解非对称加密的基本原理。--------

2. 使用方法:数字签名

类比于现实生活,我可以在一个支票上面签名,表示这张支票确实是我本人签署的。收到这张支票的人到银行去兑现的时候,工作人员只需要核对支票上面的签名和其他信息,就可以确认它的真实性。那工作人员如何知道签名是我本人的呢?因为我之前在银行那边留下我自己的签名,工作人员只需要拿以前的签名和现在支票上面的签名对比,就可以确认两个签名的字迹是不是一样的了。

结合下面第一个图片,来讲解数字签名的具体步骤。

  • 消息发送:

(1)消息发送者A使用Hash算法生成原文的数字摘要。

(2) 使用A自己的私钥加密刚刚生成的数字摘要。

(3)将原文和加密之后的摘要发送给接收者B。

  • 消息接收:

(1)消息接收者B接收到消息之后,使用A的公钥对摘要解密。(A的公钥是公开的)

(2)B使用同样的Hash算法将所接收到的原文作为输入,生成数字摘要。

(3)将第2步所生成的摘要与第1步解密得到的摘要进行比较。如果相同,表示原文没有被篡改;如果不同,则被篡改了。

上面的方法所得到的结论“原文是否被篡改”是基于一个假设前提的:接收者B所拿到A的公钥确实是A的公钥。换一种表达方式是B所使用的A的公钥没有被黑客调包。

所以,新的问题是:如何确保B所使用的是真实的“A的公钥”呢?

我们使用的方法是引进第三方认证中心。认证中心的引入是基于大家都相信认证中心这个前提的。我们相信它不会造假,是可信的。认证中心所作的工作主要有两个,一个是提供用户公钥的认证服务,生成用户的数字证书;二是提供数字证书的查询的功能。所以,一般步骤为,发送者A事先在认证中心认证自己,消息接收者B会向认证中心查询:其所使用的公钥是不是属于A的。所以,说白了,认证中心的主要职责是:为接收者B确认他所使用的公钥确实是A的。具体怎么做到的呢?

  • 发送者A向认证中心C认证自己

(1)消息发送者A发送(个人身份信息+公钥)给认证中心。

(2)认证中心根据(认证中心的数字签名+A的个人信息+A的公钥)这三样数据生成A的数字证书。其中数字签名是认证中心使用自己的私钥加密两样数据(A的个人信息和A的公钥)得到。(后面具体讲解为什么需要这两样数据)

(3)认证中心将数字证书发给A。

现在A向B发送文件的时候,需要发送三样数据:自己的数字证书,加密的摘要和原文。

  • B接收消息

(1)B接收到A发送过来的三样数据过来之后,先向认证中心确认所接收到的数字证书是否是真的。确认没问题之后,B使用认证中心的公钥解锁数字证书,提取出A的公钥。

(2)(以下步骤3、4跟上面所述的没有认证中心的情况是一样的)使用A的公钥解锁加密的摘要。

(3)使用相同的Hash算法计算原文的摘要。

(4)对比第2和3步的摘要是否一样,如果一样,则消息没有被篡改;否则,被篡改了。

另外一个问题:消息接收者B如何向认证中心确认发送者的公钥是真实的呢?我们结合下面这张图来讲解

 

上面图片来自Wikipedia,https://en.wikipedia.org/wiki/Certificate_authority

上面图片表示了数字证书的生成以及其中所包含的数据,所包含的数据具体为:(1)消息发送者A的个人信息。(2)A的公钥。(3)认证中心使用私钥加密前面两个数据所得到的数字签名。

针对发送者A的数字签名,接收者B首先使用认证中心的公钥解密其中的签名,得到A的公钥和身份信息,然后跟原本就在数字证书中的公钥和身份信息做比较,如果一样,表示该数字证书确实是A的。认证中心的公钥是可以安全获取的。

讲到这里,便回答了文章开头提到的第一个问题:这个消息没有被篡改过。对于第二个问题,因为发送者A发送了三样数据给接收者B,里面包含了原文的加密之后的摘要数据,又因为根据hash算法(比如SHA256)的特点,不同的原文所生成的摘要“基本”是不一样的(此处所用到的词语“基本”,表示有非常非常低的概率存在反面情况,这样低的概率我们可以认为是不可能事件),所以,我们可以认为一个摘要和一个原文存在一对一的关系。我们拿到的加密摘要只有用户A的公钥能解开,并且“解密之后所得到的摘要”与“使用相同的hash函数计算原文得到的摘要”一样,所以我们就有理由相信这个消息就是A发送过来的,也即是消息的不可抵赖性。

怎么证明用来验证对实体证书进行签名的 CA 公钥自身是否合法呢? 毕竟在获取 CA 公钥的过程中, 它也可能被篡改掉。

实际上, 认证中心(Certification Authority,CA) 的公钥是否合法, 一方面可以通过更上层的 CA 颁发的证书来进行认证; 另一方面某些根 CA( Root CA) 可以通过预先分发证书来实现信任基础。 例如, 主流操作系统和浏览器里面, 往往会提前预置一些权威 CA 的证书( 通过自身的私钥签名, 系统承认这些是合法的证书) 。 之后所有基于这些 CA 认证过的中间层 CA( Intermediate CA) 和后继 CA 都会被验证合法。 这样就从预先信任的根证书, 经过中间层证书, 到最底下的实体证书, 构成一条完整的证书信任链。

某些时候用户在使用浏览器访问某些网站时, 可能会被提示是否信任对方的证书。 这说明该网站证书无法被当前系统中的证书信任链进行验证, 需要进行额外检查。 另外, 当信任链上任一证书不可靠时, 则依赖它的所有后继证书都将失去保障。可见, 证书作为公钥信任的基础, 对其生命周期进行安全管理十分关键。 后面章节将介绍的PKI 体系提供了一套完整的证书管理的框架, 包括生成、 颁发、 撤销过程等。

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法,在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较,从而确定目标数是在中间数的左边还是右边,将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令: 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体,就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛,这门课会介绍许多方法去利用离散点最大化地逼近这个函数,甚至它的导数、积分,甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下,坐标杭州,14届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目: 解题思路: 第一步: 第二步: 第三步: 总代码: 题目: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验,睡觉过程中突然意识清醒,身体却动弹不了。这时候感觉非常恐怖,希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况,一年有一百多次,那时候很害怕晚上到来,睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别(move-only type,只移型别还有std::mutex等)。 结合一下工厂模式,看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在,但代码中需要用到它,通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能,通常需要完成两步操作:一.是在Web页面中添加上传输入项;二是在Servlet中读取上传文件的数据,并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度(?) 不管两个高积木之间的的积木是怎样乱七八糟的高度,最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的,用的是MFC VS2019. 详见:http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936,然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一:区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N,表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源,一般分为两类: 系统内置资源:Android SDK中所提供的已经定义好的资源,用户可以直接拿来使用。 用户自定义资源:用户自己定义或引入的,只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。 如果一个算法有缺陷,或不适合于某个问题,执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python,NLP,知识图谱,机器学习,深度学习人工智能:知识图谱实战前言一、实体建模工具Protegepython,NLP,知识图谱,机器学习,深度学习 人工智能:知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…