引言: 哪里有信息,哪里就有信息安全问题,那么在网络安全系统中我们经常听到的加解密、哈希、数字签名、证书、CA等是怎么发展而来的呢,本篇就是从所以然的角度介绍一下现代密码系统各个部分是怎么来的(并非历史发展顺序)。

1、加解密

从古到今,军队历来是使用密码最频繁的地方,因为保护己方秘密并洞悉敌方秘密是克敌制胜的重要条件。
需要对信息进行加密,所有就有了各种加解密算法,这也正是所有密码的初衷。大名鼎鼎的凯撒密码就是公元前一世纪在高卢战争时被使用的,而最初的凯撒密码就是通过移位替换实现字母加密的。如下:

A B C D E F G H I J K L M
0 1 2 3 4 5 6 7 8 9 10 11 12
N O P Q R S T U V W X Y Z
13 14 15 16 17 18 19 20 21 22 23 24 25

现规定上述字母位置,若给定的移位密码的密钥K=11,明文为

wewillmeetatmidnight

则将每个字母对应的位置数字取出,加上11,再模26(即到Z之后循环回到A开始),可以得到相应的密文字符串为:

HPHTWWXPPELEXTOYTRSE

这就是最初凯撒密码的原型,事实上,古典密码中除了凯撒密码的移位密码,还有诸如代换密码、仿射密码、维吉尼亚密码、希尔密码、置换密码等,这些密码几乎均采用代替和置换的方式。均为直接考虑加密未考虑到其它方面的密码。

尽管后续也发明出许多更加复杂的密码,但这些密码都有一个致命的缺陷,那就是他们几乎均属于对称密码(即加解密均需要保留一个秘密密钥)的范畴,那仅使用这种密码会出现什么问题呢?上述凯撒密码中,注意到有个密钥,这个密钥一定是通信双方知道,而第三方不知道的,那怎么样保密这个密钥呢,古代战争中当然是人来奔走告知,弊端就显现出来了,万一被人截获或者没有传达密钥的条件,加密岂不是无稽之谈。

后来,发展到电气时代,计算机应用到通信之中时,我们发现可以直接用计算机来传输这个密钥,但同样也面临被截获的问题,即便可以通过加大密钥长度来增加破解难度,但理论上被破解的风险是比较大的。

2、公钥密码学(非对称)

上面说到,对称密码最大的弊端就是开始通信之前需要确保通信密钥以安全传达,但显然这是不可能直接做到的,因为如果可以直接安全传输密钥,那也就不需要其他安全信道来传输消息了,直接使用当前信道进行通信即可。

这也正是公钥密码学发展的由来,公钥或非对称密码学的发展是整个密码学发展史上最伟大的一次革命,与此前的密码学完全不同,简单介绍一下公钥密码学:
一个重要概念:

公钥和私钥

公钥和私钥:不同于对称密码的加密密钥,公钥密码学中有两个不同的密钥,称为公钥和私钥,顾名思义,私钥也是要保密保存的,而公钥确是可以公开的,也就是说所有人都可以知道。

刚开始接触的时候可能不太理解,我们了解一下这对密钥的特点你就明白了,公钥密码学中这对密钥有一个基本的特点就是:公钥进行加密的数据使用私钥可以解密(还有一部分也可以使用私钥加密,公钥解密)。另外一个特点就是,仅知道公钥是不能在计算上得到私钥的。

还有一个问题,就是公私钥是怎么生成的,事实上,这就转化为了数学问题,需要相当多的数论知识来填充,这里就先不解释了。

那怎么用呢?
刚才提到,公钥可以公开,则需要通信的双方把各自生成的这一对密钥中的公钥公开,让所有人都知道,自己保管好私钥,这样,如果有人要与你进行通信,只需要找到你的公钥,加密完数据发送给你即可。
这个过程中,公钥加密的数据是不能用公钥解密的,所以即使数据被第三方拦截,也不能直接知道信息内容。(事实上,使用公钥加密私钥解密的方式对现代信息爆炸的应用来说效率比较低,所以一般使用公钥加密方式传递对称密钥,后续就可以安全使用对称密钥加解密,效率较高。这部分是密钥管理与分发的内容,暂时了解即可)

好了,安全了,散场吧,不对,好像哪里还有什么问题,细心的人已经发现,公钥是公开的没错,但是公开在哪里呢,我又应该从哪里去获取到它呢?这样就又出现一个问题,如果通信双方Alice和Bob将自己的公钥公开(记为XA和XB),但是均被第三方Darth获取到,Darth自己又生成两对密钥,公开其中的两个公钥(X1和X2),自己保留了X1和X2所对应的私钥,并向外界告知X1是Alice的公钥,X2是Bob的公钥,这样Alice在想要与Bob通信时找到的所谓的Bob的公钥其实是Darth已经替换过的,同理Bob拿到也是Darth的公钥,我们模拟一下通信过程:

① Alice拿到“Bob”的公钥(实际为X2),加密数据发送出去。
② Darth拦截到数据,使用X2对应的私钥解密,可以进行任意操作,再将篡改的数据使用Bob的公钥进行加密发送给Bob。
③Bob拿到数据,以为是安全的,于是使用“Alice”的公钥(实际是X1)加密返回的消息。
④同样被Darth截获,Darth将数据篡改后使用Alice的公钥进行加密发送出去。

整个通信过程被偷窥到一览无遗,拿这个过程存在的问题是什么呢,
有两个问题:
第一:没有防止数据被篡改的措施。
第二:公钥所公开的场所缺乏可信度,任何人都可以伪造,没有公认的机构来保证。

首先,先看防止数据被篡改我们发明了哪些方法:

3、密码学哈希函数

密码学哈希函数或许是用途最广泛的密码算法,已被广泛应用于不同的安全应用和网络协议中。
有必要解释一下哈希函数的操作过程:简单来说就是哈希函数H使用变长数据分组M作为输入,输出定长的结果h = H(M),这一结果h也被称为哈希值或哈希码(以后你会听到的散列值,摘要,其实都是基于这一理论)。

其实就是说不管你的输入是什么,是多长,我都能输出一段固定长度(固定长度不是固定输出值)的分组,作为哈希值。

先说一下哈希函数的特点:好的哈希函数应该输出的是均匀分布且明显随机的定长值,另外,如果输入M的任何一位或几位发生改变,哈希码的改变应该毫无规律。哈希码的这些特点造就了它的目标就是保护数据的完整性,怎么保护呢?

暂时不考虑其他情况,仅讨论哈希函数的使用
①Alice将明文M使用哈希函数输出一段哈希码H(M),将哈希码附加在明文M的后面,发送给Bob
②Bob在收到Alice发过来的明文和哈希值时,取出其中的明文部分,同样再做一遍哈希,并与接收到的哈希值进行比对,如果不一致,则明文已经被篡改。

但其实,这个逻辑上有很明显的漏洞,既然我已经有能力篡改数据,我一定会想办法把哈希值重新生成一遍附在明文之后,再转发出去。

所以哈希值必须以安全的方式传送,所以需要确保发送方生成的身份是真实有效的,也称消息认证,下面简要介绍两种方式。

第一种:我们在公钥密码的基础上已经有一个安全的加密密钥了,可以对明文和哈希值整个进行加密并发送,接收方接收到后现使用私钥解密,取出明文和哈希值,再进行完整性验证。
第二种:如果明文的机密性没有那么重要,但是要确保不被篡改,如本身就是要发布与众的消息,仅需保证信息完整性即可,可以使用密钥加密哈希值再附在明文之后发送,这样做相对第一种的好处就是提升效率,减少计算量。

消息认证码MAC

这是消息认证更常使用的方法,消息认证码(MAC,Message Authentication Code)也称带密钥的哈希函数,一般来说,通信双方基于已经共享的密钥要认证信息时就会用到。
怎么做呢,其实很简单,就是在生成哈希值的时候,输入加上共享密钥即可,即使用受保护的明文和共享密钥做输入,而输出的值称为消息认证码。
这样一来,攻击者不知道共享密钥的内容,也就不能随意篡改明文了,很容易被发现。

数字签名

数字签名也是哈希函数的重要应用,类似于消息认证。用来验证发送方身份的一种应用。
前面我们说到,公钥密码中的公私钥成对存在,公钥加密的信息可以用私钥进行解密,而一部分的公私钥还可以做到私钥加密公钥解密

试想,如果使用保密的私钥进行加密数据,只有使用这个私钥所对应的公钥才能解密数据,是不是就说明这个消息的发送方确实来自对方所声称的身份。

实际中会怎么用呢?
在数字签名的情形中,使用用户的私钥加密消息的哈希值,这样一来,知道该用户公钥的所有人都能进行消息发送方身份的验证和数据的完整性。因为即使这个数据被截获,攻击者使用公钥解密出哈希值,篡改信息并重新生成哈希值,也还缺了一步私钥加密哈希值的过程,这样接收方使用公钥再次使用公钥解密的时候就会是一团乱麻了,说明消息已经被篡改,下面简要介绍两种常用的使用哈希码提供数字签名的方式:

① Alice将明文的哈希值使用私钥进行加密,附在明文之后,Bob在收到消息后,公钥解密出哈希值,并重新对明文做哈希,与解密出的哈希值做比对。
② 与第一种类似,只不过对明文和私钥加密的哈希值统一再使用共享对称密钥进行加密,接收方只多了一步对称密钥解密的过程,既提供了保密性,也提供了数字签名和消息完整性的验证,这种方式比较常用。

4、证书、用户认证

第二小节说了两个问题,第三小节解决掉了一个,但还有一个认证的问题,即没有一个公开的可信的机构来保证公钥信息的准确性和真实性。

公证机构

我们脑海中最先浮现的就是找个官方机构维护一个可访问的动态访问目录不就行了,没错,但需要管理好这样一个至关重要的目录是需要主意很方面的安全问题的。如,一旦攻击获得或计算出目录管理员的私钥,就可以假冒任何通信方肆意窃取通信消息,这就需要更加严格地控制目录中的公钥分发

首先介绍一种最基础的公钥授权方案:

① 一个公证方建立一个公钥授权中心,所有人通信之前在这里注册自己的公私钥对,留下公钥。
② 所有人通信之前在公证方找到要通信对象的公钥,然后给其发送消息。
③ 接收到消息后,接收到去公证方找到发送方的公钥,给其发送加密消息。

看上去比较合理了,但是通信无处不在,随时随地,此时公证处也会成为众矢之的,通信的瓶颈。

证书

证书的提法应运而生,怎么做呢?

证书包含了公钥和公钥拥有者的标识,整个证书文件由可信第三方进行数字签名(如证书管理员、政府机构或金融机构等),任何需要该用户公钥的人都可以获得证书,值得一提的是,通信的一方可以通过传递证书的方式将其密钥信息发送给另一方(这无疑也是对CA工作的一种减轻),因为证书上有可信方的签名,其他通信方可以验证其证书的有效性,这种方法需要满足一下几点要求:

1、任何通信方都可以读取证书并确定证书拥有者的名称和公钥。
2、任何通信方都可以验证该证书出自证书管理员,而不是伪造的。
3、只有证书管理员可以生成并更新证书。
4、任何通信方否可以验证证书的时效性

目前,X.509标准是一个用来规范公钥横竖格式的广为人们接受的方案。X.509定义了基于公钥证书的一个认证协议,每个证书包含用户的公钥并由一个可信的证书颁发机构(CA)使用私钥签名。


以上所述其实已经大概梳理完了整个目前密码系统的由来和所解决的问题,因为本篇着重于讲解密码系统各个部分所以然的问题,一部分内容并未进行深入说明,仅作为入门了解。

真实在用的密码系统比上述结构要复杂得多,很多问题都简化了,最后在说一个PKI的概念。

公钥基础设施PKI

PKI是一组用于管理整数和公私钥对的策略、流程、服务器平台、软件和工作,功能包括颁发、维护和撤销公钥证书。PKI的目的主要是确保安全,方便和有效地获取公钥。

PKI架构定义了CA和PKI用户之间的组织和相互关系,满足以下要求:

1、任何参与者都可以阅读证书以确定证书所有者的名称和公钥。
2、任何参与者都可以验证证书源自证书颁发机构,并且不是伪造的。
3、只有证书颁发机构可以创建和更新证书。
4、任何参与者都可以验证证书的时效性。

另外,PKI的典型架构基本组件中包括:终端实体、证书颁发机构CA、注册机构RA、证书存储库信赖方五大部分,具体各个部分的作用和相互之间的联系可以参考相关书籍刊物等。

推荐书籍:密码编码学与网络安全 --原理与实践(第八版)

一文了解加解密、哈希函数、MAC、数字签名、证书、CA等相关推荐

  1. 用Python写DES加解密的常用函数

    文章目录 生成pkcs(填充明文) 去掉填充 DES加密(ECB模式) DES解密(ECB模式) 请求包加密 请求包解密 响应包解密 响应包加密 class Burpy 备注 生成pkcs(填充明文) ...

  2. sha256加密_python中使用加盐哈希函数加密密码

    开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种 - 明文存储:肉眼就可以识别,没有任何安全性. 谁用谁傻缺 - 加密存储:通过一定的变换形式,使 ...

  3. 密码键盘常用(加解密,链接,MAC,PINBLOCK)算法介绍-资料整理

    常用算法介绍 一.DES,TDES算法 1,DES(Data Encryption Standard,标准加密算法) DES采用了64位的分组长度和56位的密钥长度,它将64位的输入经过一系列变换得到 ...

  4. Python加解密库——pycrypto(pycryptodome)

    文章目录 简介 安装 方法一:Visual Studio 方法二:pycryptodome(推荐) 初试 公钥 加解密 对称加密 非对称加密 数字签名 哈希函数 安全通信 加密IO 封装 遇到的坑 参 ...

  5. 【开发教程15】AI语音人脸识别(会议记录仪/人脸打卡机)-加解密及数据协议

    CC3200AI实验教程 --疯壳·开发板系列 加解密及数据协议 在<AI人脸系统架构>一节中,我们提到AI设备与服务器之间的通信协议及TEA加密.这一节主要来讲解一下TEA加密另附上&l ...

  6. 区块链之加解密算法数字证书

    目录 一.加解密算法 数字签名 对称加密 DES(Data EncryptionStandard) 3DES(Triple DES) AES(Advanced EncryptionStandard) ...

  7. java ios rsa解密乱码_java与IOS之间的RSA加解密

    很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...

  8. 《ASP.NET Core 6框架揭秘》实例演示[19]:数据加解密与哈希

    数据保护(Data Protection)框架旨在解决数据在传输与持久化存储过程中的一致性(Integrity)和机密性(confidentiality)问题,前者用于检验接收到的数据是否经过篡改,后 ...

  9. 云小课|使用SQL加密函数实现数据列的加解密

    摘要:数据加密作为有效防止未授权访问和防护数据泄露的技术,在各种信息系统中广泛使用.作为信息系统的核心,GaussDB(DWS)数仓也提供数据加密功能,包括透明加密和使用SQL函数加密. 本文分享自华 ...

最新文章

  1. 金融python培训班_2019年做金融,一定要学Python!:附Python视频教程
  2. 如何设计订单系统?不妨看看这篇文章
  3. JAVA实现Excel的读写--poi
  4. 【BZOJ3036】绿豆蛙的归宿 概率DP
  5. linux 虚函数调用性能,C++对象布局及多态实现探索之虚函数调用
  6. 桶式排序 php,PHP实现桶排序算法
  7. 华为鸿蒙二代支持的手机,关于华为鸿蒙,国产厂商中只有2家表示支持
  8. poj 1733 ParityGame 并查集 离散化
  9. wget 下载百度云jdk
  10. SQL查询分析器SQL语句导入TXT文件
  11. java画图板_java画图板工具下载
  12. c语言编译器提示隐式声明,在C中使用“隐式声明功能”警告有什么含义?
  13. GDB attach 调试
  14. 【Github资源大汇总】 - 王朋
  15. 照片放大工具Topaz Gigapixel AI for Mac
  16. 论文速递 EMNLP2022 | 接受论文抢先看!!!(内含下载列表)
  17. 基于SPRINGBOOT果多多水果电商平台
  18. vim php tab 补全提示
  19. 【LeetCode】1184. 公交站间的距离(C++)
  20. 二进制转化成ascll_用java将二进制转换ascii码

热门文章

  1. html a标签字体间距,html之a标签
  2. nodejs form post 到java 服务器端一直收不到数据,通过更改 headers 的 content-type; post 只能接收 application/x-www-form-url
  3. c语言helloworld代码(c语言helloworld代码编写)
  4. 一文掌握运维绩效考核指标及实例参考
  5. JavaScript学习笔记——函数 Part4:向函数传递函数、从函数返回函数(函数是一等公民)
  6. 知到计算机专业英语翻译,计算机专业英语翻译_new重点.doc
  7. 毕设存档——APAP with moving dlt实现流程
  8. xcode编译工程时遇到 Permission denied的解决办法
  9. python 模拟浏览器播放视频_selenium+Python(处理html5的视频播放)
  10. 倾向性得分(psm)在数据分析中的应用。