前言
最近工作中用到了加密相关的技术点,非常头疼,常被公钥加密、签名等一系列概念搞的头大,所以买来《图解密码技术》这本书,想大概的梳理一下密码技术的入门知识。
读完之后对基本的密码技术概念有了大概的了解,所以写下这篇博客来做一下读后的总结,希望可以帮到大家。
密码技术的发展
这里咱们不谈密码学的具体发展轨迹,我们来回忆一下日常遇到的跟加密相关的技术,从最开始的对称加密,到公钥加密,再到混合加密系统,认证签名等,其实密码技术一步步的发展都是为了解决一个个信息安全面临的问题,也就是弥补上代(用上代这个词可能不合适)加密方式的缺陷。
咱们先对几种加密方式做一个总的梳理。看一下下面这个图吧。
密码学家一直在和信息交换过程中存在的中间人作斗争,从最开始的单纯的为了防止窃听使用对称机密,但是为了解决对称加密存在的秘钥配送问题而出现的公钥加密,解决了防窃听,还有存在的信息被篡改的问题,中间者伪装发送者的问题,甚至消息否认的问题,每个问题都产生了对应的解决方式,我们下面一一来说。
机密性
对称加密和公钥加密(非对称加密)
基本概念大家都是知道的,对称加密是双方使用相同的秘钥进行加密解密,我们常提到的DES,三重DES,AES都是对称密码算法。我们应该注意这三者都根据明文和秘钥生成密文的算法。
但是对称加密存在秘钥配送问题。就是我怎么样把秘钥给到跟我通信的人,当然了两个人直接见面通过U盘拷贝可以,但是现实场景不允许我见到每一个跟我通信的人来配送秘钥,同时因为双方都是用同一个密码,如果我们在网络上交换秘钥,被中间人获取到秘钥,那他就完全可以窃听我们的通信了。所以就产生了公钥加密。
公钥加密就是我生成一个秘钥对,一公钥一私钥,公钥和私钥之间存在强烈的数学对应关系,书中有说到,但是毕竟我们数学功力薄弱,不太能很深的理解里面的数学关系,有兴趣的大家可以自己查一下。只要大家记住一个秘钥对,公钥加密的只有对应的私钥能解密,同时私钥加密的也只有对应的公钥能解密。(这句话很重要)
我们在使用公钥加密时,私钥自己保留,公钥公布出去,任何人都可以获得到。这样有人给我发消息,就可以使用我提供给他的公钥进行加密,然后密文只有我的私钥可以解密,这样就可以一定程度解决窃听问题。因为中间人劫持到密文之后没有私钥来解密。
RSA就是我们使用的公钥密码算法。
混合密码系统
公钥密码的处理速度远远的低于对称密码。为了解决这个问题产生了混合密码系统。
这个图大家应该能很容易看懂,伪随机数生成器生成了会话密钥,其实也就是混合系统中的对称加密密钥,我们的明文直接用这个密钥进行加密,得到消息的密文,因为是对称加密所以说速度很快。
同时使用接受者的公钥对这个会话密码进行加密,得到会话密码的密文。同时组合这两种密文,发给接受者。
解密的图我就不用上了,大家可以反推一下,接受者先使用自己的秘钥解密会话密码密码,得到会话密码的明文,然后在使用这个密码解密消息。也许有小伙伴会说,这不是也使用到了公钥加密嘛,怎么速度不也慢?公钥加密来加密一个会话密码肯定比加密通信的消息的工作量小啊 ~
这里要注意的是,在每次通信中,会话密码对会变的,所以我们的主要任务还是要保证私钥的安全,因为这个会话密码如果泄露只是影响到了一次通信,但是私钥如果泄露,所有的通信就会被破译了。
公钥加密问题
公钥加密也存在中间人攻击问题,比如你的朋友在向你索要你的公钥的时候被人监听,在你给朋友发送公钥时,中间人截获到你的公钥,同时把自己的公钥发给了你的朋友,这时你的朋友收到的公钥就是中间人的了。然后你的朋友给你发了一个“我喜欢你”,然后用中间人的公钥进行了加密,在发送消息给你的时候,中间人依然可以劫持到,然后他用自己的私钥解密出来了明文“我喜欢你”,再用他劫持到的你的公钥给你发了一条“我讨厌你”,然后收到消息并解密的你........ 大家应该明白我的意思了,这类问题的解决方式下面会说到。
完整性和认证
单向散列函数
我们有一个文件需要保存,但是一顿时间之后在用的时候,我们怎么样验证这个文件是否被人篡改过?
有一个方法就是我把文件拷贝到U盘里面,随身携带,但是如果文件很大呢,每次这样是不是很不方便。这样就用到了单向散列函数。
单向散列函数有一个输入一个输出,输入称为消息,输出称为散列值。单向散列函数也称为信息摘要函数,哈希函数或者杂凑函数。比如我们熟悉的SHA-1、SHA-256等SHA开头的那一些。当然了这里的消息不一定是非要是文字,也可以是图像音视频文件,毕竟所有文件最终都是二进制。
这样我们就不需要保存文件了,只要保存了散列值,然后对比散列值就可以了。
消息认证码 (MAC)
完整性解决消息是否被篡改的问题,消息认证指的是“消息来自正确的发送者”这一性质。
其实很容易理解,就是双方使用共享密钥,然后利用HMAC此类使用单向散列函数构建消息验证码的方法,对通信的消息计算出MAC值,然后把消息和MAC值一起传递,再接收放使用共享密钥也计算出MAC值,然后对比来认证。
消息认证码也有问题,例如“第三方证明”和“防止否认”,这些大家可以自己去上网查一下解释的列子,这种东西举例子来说更容易懂,占用篇幅太大,本文省略。
数字签名
数字签名大家可以当做是现实中的盖章,使用数字签名可以识别篡改和伪装,还可以防止否认。
签名和验签
其实签名和验签还是用到我们的公钥加密。上面我们提到过公钥和私钥之间的关系,公钥加密私钥解密,同时私钥加密也只能用它对应的公钥解密。私钥加密其实就是签名,对应公钥解密也就是验签。因为私钥只有一个人持有,所以使用该私钥加密的消息相当于被该使用者签名,同时我们使用它对应的公钥如果能正确的解密,那就肯定消息是这个人发送的,这样也就实现了防否认。
下面是数字签名方法
不多做解释了,消息明文和签名完之后的密文一起发送,这样既可以防篡改又可以防否认了。
上面这种方法是对消息直接进行签名,如果消息过大会非常的耗时,这样我们可以使用对散列值进行签名的方法来代替对消息直接签名。
好的,到这时我们说到数字签名基本解决了很多问题,识别篡改和伪装,还可以防否认,但是我们使用数字签名要有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者!
这样是不是感觉进入到了死循环呢,解决了一堆的问题之后,回到了公钥的合法性这个问题上。这就要使用证书了。
证书
公钥证书和我们的现实中的证件类似的,都包含姓名、组织、邮箱、地址等个人信息,以后属于此人的公钥,并由认证机构施加数字签名。只要看到公钥证书,我们就可以知道认证机构认定此公钥属于此人。
下面给一个简单的例子吧
也许会有人问,那怎么确认这个认证机构是不是权威的呢?
确实会有这种问题,认证也不简单的发一个证书而已,有一套完整的公钥基础设施(PKI)。
简单的提一下PKI包括三个要素,用户、认证机构和仓库,也涉及到注册证书和作废证书一些逻辑,大家自己查阅吧,我就不继续说了。
写在最后
本片文章简单的梳理了一些密码技术的基础,从对称加密到数字签名、证书,希望笔者讲的还算清晰,也希望本文能给大家带来一些帮助。
密码技术在我们的工作中有很多的应用,比如众所周知的SSL/TLS(在此之上承载http就是我们的https)。我们之后再找时间专门的来说一下https吧。
感谢大家读完我的文章。
文章使用图片来自《图解密码技术》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。