03_《计算机安全原理与实践》密码编码工具(中)
前言
【前篇回顾】
在上一篇博客中,简要介绍了对称加密算法的工作机制、常见的对称加密算法、并讨论了分组密码和流密码的联系和区别。需要注意:关于分组密码和流密码,书中有一段描述,现将其概括如下:从工作机制上看,似乎流密码更适合数据流加密/解密的场景(数据流在信道中的传输,或者是网页请求),但是在实际应用中无论是流密码还是分组密码都可以用在任何形式的应用场景中。
【题外话】
本篇开始,由于原著实体书已经到手,为保证行文流畅性,所以不再加入原著PPT译读。
【本篇内容】
散列函数在消息认证中的应用机理,非对称加密技术相关理论已经非对称加密算法的简介(技术细节在原书的第21章);
1.消息认证&哈希函数
上篇提到,加密是为了预防被动攻击,那么我们又该如何在主动攻击下保护数据?我们熟知的一个方法就是采用消息认证技术。通过消息认证,通信的双方可以验证接受到的数据(或存储的数据)是具有真实信的,出于对于数据完整性的考虑,消息认证需要考虑以下几个方面:
1.消息的内容没有被篡改;
2.消息的来源是真实可靠的:消息M声称其来自信源A,如果认证通过那么接收方B就认为M真的来源于A;
3.检查时间戳,确保消息没有被人为的推迟或者重放;
4.检查序列号,确保消息的次序,防止攻击者重新排序;
1.1使用对称加密技术进行消息认证
考虑以下场景:
Alice和Bob共享密钥(密钥是绝对安全,且只有Alice和Bob两个人知道),通信状况良好接收方能够无误的接收消息,那么只有真正的Alice和真正的Bob才能对数据进行加密和解密。如果消息中含有检错码和序列号,那么接收方就能保证收到的数据没有被替换且次序正确的;如果消息中含有时间戳,那么接收者就能判断消息是否被人为的推迟或是重放。
【说明:虽然序列号会使用,但是通常不会每个明文都关联序列号】
事实上,仅依靠对称加密是不足以实现消息认证的,以DES算法的EBC模式为例,每个明文块即使被改变顺序也不影响其加密成密文块继续传输,因此攻击者可以通过重新排序的方式来破环数据的完整性。
1.2不依赖于加密进行消息认证
【这里的不依赖加密是指数据不进行加密不保证其机密性,并不表示整个流程脱离加密技术】
在许多要求低时延场景下,我们如果采用加密解密的方式进行消息验证,那么将大大降低通信效率,采用1.1中所讨论的方式显然不合适。试想我们只需要保证数据的真实性和可验证性而不考虑其机密性要求,那么在这样的情况下,我们可以采用不依赖于加密的消息认证。这种方式下我们采用如下策略进行:
1.根据一些规则生成认证标签(tag)。
2.将认证标签作为数据部分的附加一起发送。也就是说发送形式为:明文+标签
下面列举的是三种“不依赖于加密的消息认证”的适用场景
- 广播情况下,数据采用明文+认证标签的形式进行传输,如果有一个接收者发现认证不通过,就通过广播高速其他接收者广播数据有差错。
- 一方的链路压力大,来不及对加密的消息进行解密。
- 为了避免大量的解密计算对处理器资源的大量消耗,计算机程序采用这种方式进行认证。
消息认证码(Message Authentication Code)
【注意:为了方便描述这里简称为MAC,指的并不是MAC地址】
前文提到不依赖加密的消息验证中,首先我们会根据一些规则来生成一个认证标签,随后以“明文+标签”的形式进行发送。消息认证码MAC就是采用明文和密钥作为输入经过某个复杂函数运算所产生的认证标签。设A,B共享密钥K,需要发送的消息为M,则MAC=F(K,M)。这种情况下消息认证模型如下:
- A计算MAC=F(K,M)
- A将MAC+M一同发送给B
- B收到MAC+M后,取出M,进行计算MAC2=F(K,M)
- 对比MAC和MAC2,如果一致通过认证,否则认证不通过。
下图展示认证通过的大致流程
如果验证通过,那么接收方可以从至少两个方面信任数据:
1.消息是没有被更改的,因为MAC生成算法F足够复砸,且密钥K不被第三饭知晓,因此可以认为消息没被修改
2.消息来自真正的发送方,因为K不被第三方知晓,任何第三饭无法生成正确的MAC,因此消息来自真正的发送方
3.此外,如果消息中存在序列号,那么我们可以认为消息的顺序也是正确的,因为如果第三方修改序列号,MAC和MAC2就会不一致,从而无法通过认证。
整个过程和对称加密类似,但是注意双方MAC的生成算法是一样的,而对称加密中,解密算法是加密算法的逆运算。生成MAC的算法采用AES、DES等对称加密算法都可以。
单向哈希函数(One-Way Hash function)
另外一种产生认证标签的方法是采用单向哈希函数,常用的认证方式有三种:
假设Alice给Bob发送消息M
a)采用对称加密,密钥为K其步骤如下:
1.计算哈希值 h=H(M)
2.通过对称加密算法E()生成认证标签 :tag = E(K,h)
3.Alice 将 tag+M一同发送给Bob
4.Bob接收到消息,取出M,计算得到 h
5.Bob将tag进行解密运算 h1=E^-1(K,tag)
6.Bob对比h和h1,一致则通过。
如下图所示:
b)采用非对称加密方式 Alice的私钥为Pra,公钥为Pua,相关内容见2
1.计算哈希值 h=H(M)
2.通过加密算法E()和Alice的私钥生成认证标签 :tag = E(Pra,h)
3.Alice 将 tag+M一同发送给Bob
4.Bob接收到消息,取出M,计算得到 h
5.Bob将tag进行解密运算 h1=D(Pua,tag),Pua为Alice的公钥
6.Bob对比h和h1,一致则通过。
如下图所示:
c)利用秘密值K
最安全的策略是将秘密值作为消息M的前缀和后缀与M一同作为哈希函数的输入生成tag,过程类似于MAC,步骤不加赘述,模型如下
对于安全散列函数的要求如下:
1.输入可以是任何大小的数据块,输出长度固定;
2.计算容易,软件硬件都能实现;
3.抗原象性:不可逆,h=H(X),已知h逆推X是不可行的
4.第二抗原象性:对于x,找到一个y使得H(x)=H(y)是不可能的,x和y不相等
4.抗碰撞:假设H(x)=H(y),找到任何(x,y)是不可行的
【关于安全散列算法,SHA算法需要有了解】
关于安全散列函数应用:口令和入侵检测将在后续博文中更新。
2.公钥加密体制(非对称加密)
关于非对称加密需要知道两个方面:从算法角度,其依赖于函数而不是像对称加密一样基于位运算;从密钥角度,非对称加密采用两个密钥,一个由发送方自己保管(私钥),一个公开(公钥)。
公钥密码体制有六个部分组成(仅仅罗列,不做解释)
1.明文 2.私钥 3.加密算法 4.密文 5.公钥 6.解密算法
非对称加密模型有如下两种
a)如果侧重机密性采用公钥加密
b)如果侧重完整性和消息认证采用私钥加密
对非对称加密的要求:
1.产生公钥和私钥在计算上是简单的
2.加密解密算法在计算上是容易实现的
3.公钥加密私钥解,私钥加密公钥解。
4.公钥和私钥不可互相推导
最后部分简要罗列一些非对称加密算法和其应用领域(本章作为了解内容)
第一列:算法名称;第二列:数字签名;第三列:对称密钥的分发;第四列:密钥加密
比特币的加密采用的就是一种ECC椭圆曲线算法(表格最后一行)
【下一篇博文将结束密码编码工具,并对部分习题进行解答】