《图解密码技术》读后总结

Rustacean_42
• 阅读 2085

前言

最近工作中用到了加密相关的技术点,非常头疼,常被公钥加密、签名等一系列概念搞的头大,所以买来《图解密码技术》这本书,想大概的梳理一下密码技术的入门知识。

读完之后对基本的密码技术概念有了大概的了解,所以写下这篇博客来做一下读后的总结,希望可以帮到大家。

密码技术的发展

这里咱们不谈密码学的具体发展轨迹,我们来回忆一下日常遇到的跟加密相关的技术,从最开始的对称加密,到公钥加密,再到混合加密系统,认证签名等,其实密码技术一步步的发展都是为了解决一个个信息安全面临的问题,也就是弥补上代(用上代这个词可能不合适)加密方式的缺陷。

咱们先对几种加密方式做一个总的梳理。看一下下面这个图吧。

《图解密码技术》读后总结

密码学家一直在和信息交换过程中存在的中间人作斗争,从最开始的单纯的为了防止窃听使用对称机密,但是为了解决对称加密存在的秘钥配送问题而出现的公钥加密,解决了防窃听,还有存在的信息被篡改的问题,中间者伪装发送者的问题,甚至消息否认的问题,每个问题都产生了对应的解决方式,我们下面一一来说。

机密性

对称加密和公钥加密(非对称加密)

基本概念大家都是知道的,对称加密是双方使用相同的秘钥进行加密解密,我们常提到的DES,三重DES,AES都是对称密码算法。我们应该注意这三者都根据明文和秘钥生成密文的算法。

但是对称加密存在秘钥配送问题。就是我怎么样把秘钥给到跟我通信的人,当然了两个人直接见面通过U盘拷贝可以,但是现实场景不允许我见到每一个跟我通信的人来配送秘钥,同时因为双方都是用同一个密码,如果我们在网络上交换秘钥,被中间人获取到秘钥,那他就完全可以窃听我们的通信了。所以就产生了公钥加密。

公钥加密就是我生成一个秘钥对,一公钥一私钥,公钥和私钥之间存在强烈的数学对应关系,书中有说到,但是毕竟我们数学功力薄弱,不太能很深的理解里面的数学关系,有兴趣的大家可以自己查一下。只要大家记住一个秘钥对,公钥加密的只有对应的私钥能解密,同时私钥加密的也只有对应的公钥能解密。(这句话很重要)

我们在使用公钥加密时,私钥自己保留,公钥公布出去,任何人都可以获得到。这样有人给我发消息,就可以使用我提供给他的公钥进行加密,然后密文只有我的私钥可以解密,这样就可以一定程度解决窃听问题。因为中间人劫持到密文之后没有私钥来解密。

RSA就是我们使用的公钥密码算法。

混合密码系统

公钥密码的处理速度远远的低于对称密码。为了解决这个问题产生了混合密码系统。

《图解密码技术》读后总结

这个图大家应该能很容易看懂,伪随机数生成器生成了会话密钥,其实也就是混合系统中的对称加密密钥,我们的明文直接用这个密钥进行加密,得到消息的密文,因为是对称加密所以说速度很快。

同时使用接受者的公钥对这个会话密码进行加密,得到会话密码的密文。同时组合这两种密文,发给接受者。

解密的图我就不用上了,大家可以反推一下,接受者先使用自己的秘钥解密会话密码密码,得到会话密码的明文,然后在使用这个密码解密消息。也许有小伙伴会说,这不是也使用到了公钥加密嘛,怎么速度不也慢?公钥加密来加密一个会话密码肯定比加密通信的消息的工作量小啊 ~

这里要注意的是,在每次通信中,会话密码对会变的,所以我们的主要任务还是要保证私钥的安全,因为这个会话密码如果泄露只是影响到了一次通信,但是私钥如果泄露,所有的通信就会被破译了。

公钥加密问题

公钥加密也存在中间人攻击问题,比如你的朋友在向你索要你的公钥的时候被人监听,在你给朋友发送公钥时,中间人截获到你的公钥,同时把自己的公钥发给了你的朋友,这时你的朋友收到的公钥就是中间人的了。然后你的朋友给你发了一个“我喜欢你”,然后用中间人的公钥进行了加密,在发送消息给你的时候,中间人依然可以劫持到,然后他用自己的私钥解密出来了明文“我喜欢你”,再用他劫持到的你的公钥给你发了一条“我讨厌你”,然后收到消息并解密的你........ 大家应该明白我的意思了,这类问题的解决方式下面会说到。

完整性和认证

单向散列函数

我们有一个文件需要保存,但是一顿时间之后在用的时候,我们怎么样验证这个文件是否被人篡改过?

有一个方法就是我把文件拷贝到U盘里面,随身携带,但是如果文件很大呢,每次这样是不是很不方便。这样就用到了单向散列函数。

单向散列函数有一个输入一个输出,输入称为消息,输出称为散列值。单向散列函数也称为信息摘要函数,哈希函数或者杂凑函数。比如我们熟悉的SHA-1SHA-256等SHA开头的那一些。当然了这里的消息不一定是非要是文字,也可以是图像音视频文件,毕竟所有文件最终都是二进制。

《图解密码技术》读后总结

这样我们就不需要保存文件了,只要保存了散列值,然后对比散列值就可以了。

消息认证码 (MAC)

完整性解决消息是否被篡改的问题,消息认证指的是“消息来自正确的发送者”这一性质。

其实很容易理解,就是双方使用共享密钥,然后利用HMAC此类使用单向散列函数构建消息验证码的方法,对通信的消息计算出MAC值,然后把消息和MAC值一起传递,再接收放使用共享密钥也计算出MAC值,然后对比来认证。

《图解密码技术》读后总结

消息认证码也有问题,例如“第三方证明”和“防止否认”,这些大家可以自己去上网查一下解释的列子,这种东西举例子来说更容易懂,占用篇幅太大,本文省略。

数字签名

数字签名大家可以当做是现实中的盖章,使用数字签名可以识别篡改和伪装,还可以防止否认。

签名和验签

其实签名和验签还是用到我们的公钥加密。上面我们提到过公钥和私钥之间的关系,公钥加密私钥解密,同时私钥加密也只能用它对应的公钥解密。私钥加密其实就是签名,对应公钥解密也就是验签。因为私钥只有一个人持有,所以使用该私钥加密的消息相当于被该使用者签名,同时我们使用它对应的公钥如果能正确的解密,那就肯定消息是这个人发送的,这样也就实现了防否认。

《图解密码技术》读后总结

下面是数字签名方法

《图解密码技术》读后总结

不多做解释了,消息明文和签名完之后的密文一起发送,这样既可以防篡改又可以防否认了。

上面这种方法是对消息直接进行签名,如果消息过大会非常的耗时,这样我们可以使用对散列值进行签名的方法来代替对消息直接签名。

好的,到这时我们说到数字签名基本解决了很多问题,识别篡改和伪装,还可以防否认,但是我们使用数字签名要有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者!

这样是不是感觉进入到了死循环呢,解决了一堆的问题之后,回到了公钥的合法性这个问题上。这就要使用证书了。

证书

公钥证书和我们的现实中的证件类似的,都包含姓名、组织、邮箱、地址等个人信息,以后属于此人的公钥,并由认证机构施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定此公钥属于此人。

下面给一个简单的例子吧

《图解密码技术》读后总结

也许会有人问,那怎么确认这个认证机构是不是权威的呢?

确实会有这种问题,认证也不简单的发一个证书而已,有一套完整的公钥基础设施(PKI)。

简单的提一下PKI包括三个要素,用户、认证机构和仓库,也涉及到注册证书和作废证书一些逻辑,大家自己查阅吧,我就不继续说了。

写在最后

本片文章简单的梳理了一些密码技术的基础,从对称加密到数字签名、证书,希望笔者讲的还算清晰,也希望本文能给大家带来一些帮助。

密码技术在我们的工作中有很多的应用,比如众所周知的SSL/TLS(在此之上承载http就是我们的https)。我们之后再找时间专门的来说一下https吧。

感谢大家读完我的文章。

文章使用图片来自《图解密码技术》

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
4年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
4年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Rustacean_42
Rustacean_42
Lv1
六翮飘飖私自怜,一离京洛十馀年。
文章
4
粉丝
0
获赞
0