概述
文章目录
- 前言
- 摘要
- 正文
- 名词定义
- 对称密码
- 分组密码
- 流密码(序列密码)
- 小结
- 公钥密码
- RSA算法
- 小结
- 单向散列函数
- SHA-3
- 小结
- 消息认证码
- HMAC
- 小结
- 数字签名
- 小结
- 证书
- 伪随机数生成器
- 用单向散列函数实现伪随机数生成器
- 用密码实现的伪随机数生成器
- 应用示例
- PGP的加密与解密
- 推荐资料
前言
刚看完《图解密码技术》。“书以图配文的形式,详细讲解了6种最重要的密码技术:对称密码、公钥密码、单向散列函数、消息认证码、数字签名和伪随机数生成器。“
通常一本书籍面向的一个或几个群体。根据面向的群体不同,我个人将技术书籍等级划分为:科普,导论,教材,适于1-3年经验的工作人员,适于3-5年经验的工作人员。
我个人将这本书划分在科普这一档。“全书讲解通俗易懂凡是对密码技术感兴趣的人,均可阅读此书 。”
书看完了,需要简单做个总结笔记。做笔记总结,需要阅读网上同类的文章。一般而言,现有的论文的综述是最好的总结。奈何,我的英文水平是个渣渣。所以舍弃不看最重要的IEEE-Cryptography-Overview
下面内容,绝大部分摘录自《图解密码技术》。
摘要
无论是对称密码还是公钥密码,密码的作用都是确保机密性 。 由于确保较长的明文整体的机密性很困难,因此我们用密码将明文转换成密文 。 这样一来,我们就不必保护明文本身了 。相对地,我们则需要保护加密时所使用的密钥 。 通过保护较短的密钥来保护较长的明文,这样的做法可以称为机密性的压缩 。
单向散列函数是用于确认完整性的 。 我们不必检查较长的明文的完整性,只要检查散列值就能够确认完整性了 。 通过检查较短的散列值来确认较长的明文的完整性,这样的做法可以称为完整性的压缩 。
消息认证码和数字签名都是用于认证的技术,但我们并不是直接对较长的消息本身进行认证,而是通过将较长的消息与密钥结合起来,生成较短的比特序列(认证符号),再通过认证符号进行认证。 在消息认证码中, MAC 值就是认证符号 ;而在数字签名中 , 签名就是认证符号 。通过较短的认证符号来对较长的消息进行认证,这样的做法可以称为认证的压缩 。
那么伪随机数生成器又是怎样的呢?在伪随机数生成器中,所生成数列的不可预测性是非常重要的 。 要大量生成具备不可预测性的随机数列非常困难,于是我们通过将种子输入伪随机数生成器,生成具备不可预测性的伪随机数列 。 也就是说,为了对伪随机数列赋予不可预测性,我们使用了随机数种子,这可以称为不可预测性的压缩 。 反过来说,伪随机数生成器是将种子所具备的不可预测性进行了扩张 。
正文
名词定义
-
cipher:在密码-wiki中,cipher是一种用于执行加密或解密的算法。在下文中,我们使用“密码”作为“cipher”的翻译。
在Dan Boneh的密码学中,我看到一个更准确的定义。
cipher
是一个定义在 ( k , m , e ) (mathcal{k,m,e}) (k,m,e)三元组上的一对有效算法 ( E , D ) (E,D) (E,D)。其中, ( k , m , e ) (mathcal{k,m,e}) (k,m,e)分别是秘钥空间(所有可能的秘钥的集合),明文空间(所有可能的明文的集合),密文空间(所有可能的密文的集合); ( E , D ) (E,D) (E,D)分别是加密算法和解密算法。对于加密算法:输入秘钥和明文,得到密文。表示形式为: E : k × m → e E: k times m rightarrow e E:k×m→e。
对于解密算法:输入秘钥和密文,得到明文。表示形式为: D : k × e → m D: k times e rightarrow m D:k×e→m。
对于加密和解密需要满足一致性:明文加密再解密之后,和原来明文先相同。表示形式为: D ( k , E ( k , m ) ) = m D(k,E(k,m)) = m D(k,E(k,m))=m
下面是示意图。
对称密码
对称密码的特点:相同的密钥进行加密和解密。
对称密码按照其对明文的处理,可以分为分组密码和流密码。
分组密码
分组密码 ( block cipher) 是每次只能处理特定长度的一块数据 的一类密码算法,这里的“一块”就称为分组 ( block )。 此外 ,一个分组的比特数就称为分组长度 ( block length )。
分组密码算法只能加密固定长度的分组,但是我们需要加密的明文长度可能会超过分组密码的分组长度,这时就需要对分组密码算法进行迭代,以便将一段很长的明文全部加密 。 而迭代的方法就称为分组密码的模式 ( mode )。
DES算法不推荐使用,所以可以不用了解。推荐使用AES算法。
AES算法阅读资料推荐:什么是AES算法?、《图解密码技术》第四章 分组密码模式。
AES 的分组长度为 128 比特 ,因 此 AES 一 次可加密 128 比特的明文,并生成 128 比特的密文 。下面是AES不同模式的示意图(示意图省略了秘钥的描述)。
- ECB 模式是所有模式中最简单的一种 。 ECB 模式中,明文分组与密文分组是一一对应的关系,因此,如果明文中存在多个相同的明文分组,则这些明文分组最终都将被转换为相同的密文分组 。 这样一来,只要观察一下密文,就可以知道明文中存在怎样的重复组合,并可以以此为线索来破译密码,因此 ECB 模式是存在一定风险的 。
-
CBC 模式的全称是 C ipher Block Chaining 模式 ( 密文分组链接模式 ),之所以叫这个名字,是因为密文分组是像链条一样相互连接在一起的 。在 CBC 模式中,首先将明文分组与前一个密文分组进行 XOR 运算,然后再进行加密。
CBC 模式加密的密文分组中有一个分组损坏了(例如由于硬盘故障导致密文分组的值发生了改变等)。 在这种情况下,只要密文分组的长度没有发生变化,则解密时最多只会有 2 个分组受到数据损坏的影响。
CBC 模式的密文分组中有一些比特缺失了(例如由 于通信错误导致没有收到某些比特等),那么此时即便只缺失了 l 比特 ,也会导致密文分组的长度发生变化,此后的分组发生错位,这样一来,缺失比特的位置之后的密文分组也就全部无法解密了。
-
CFB 模式的全称是 C ipher FeedBack 模式( 密文反馈模式 )。 在 CFB 模式中,前一个密文分组会被送回到密码算法的输入端 。 所谓反馈,这里指的就是返回输入端的意思 。
其实 CFB 模式的结构与我们在 3 .4 节介绍的一次性密码本是非常相似的 。在 CFB 模式中 , 密码算法的输出相当于一次性密码本中的随机比特序列 。 由于密码算法的输出 是通过计算得到的 , 并不是真正的随机数,因此 CFB 模式不可能像一次性密码本那样具备理论上不可破译的性质 。
-
OFB 模式并不是通过 密码符法对明 文直接进行加密的,而是通过将“明 文分组”和 “ 密码符法的输 出 “进行 XOR 来产生 “密文分组” 的。
-
CTR 模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流 。 也就是说,最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行 XOR 而得到 的 。
能够以任意顺序处理分组,就意味着能够实现并行计算 。 在支持并行计算的系统中, CTR模式的速度是非常快的 。
-
AES不同模式小结。分组密码算法的选择固然很重要 , 但模式的选择也很重要 。 对模式完全不了解的用户在使用分组密码算法时,最常见的做法就是将明文分组按顺序分别加密,而这样做的结果就相当于使用了安全性最差的 ECB 模式 。同样一个分组密码箕法,根据用途的不同可以以多种模式来工作 。 各种模式都有自己的长处和短处,因此需要大家在理解这些特点的基础上进行运用 。
流密码(序列密码)
流密码 (stream cipher ) 是对数据流进行连续处理的一类密码算法 。 流密码中一般以 1 比特、8 比特或 32 比特等为单位进行加密和解密 。
流密码通过种子秘钥生成一个伪随机序列,模仿一次一密系统。伪随机密钥流(keystream)由一个随机的种子(seed)通过算法 PRG(Pseudo-Random Generator, 伪随机产生器, 也称 Pseudoramdom Key Generator, 密钥序列产生器, 也称 Keystream Generator, KG, 密钥序列产生器)得到。k
作为种子,则 G(k)
作为实际使用的密钥进行加密解密工作。为了保证流加密的安全性,PRG 必须是不可预测的。
流密码的推荐资料:Dan Boneh的密码学-流密码
小结
对称密码,必须保证秘钥空间巨大,才能抵御暴力破解。
另外,用对称密码进行通信时,还会出现密钥的配送问题,即如何将密钥安全地发送给接收者。为了解决密钥配送问题,我们需要公钥密码技术 。
公钥密码
公钥密码 (public-key cryptography ) 中,密钥分为加密密钥和解密密钥两种 。 发送者用加密密钥对消息进行加密,接收者用解密密钥对密文进行解密 。
公钥使用流程如下图所示。
RSA算法
RSA 是一种公钥密码算法,它的名字是由它的三位开发者,即 Ron Rivest 、 A di Shamir 和Leonard Adleman 的姓氏的首字母组成的 ( Rivest-Shamir-Adleman)。
下图为RSA的加密和解密示意图。E 和 N 的组合就是公钥;D 和 N 的组合就是私钥;
至于RSA的原理,没细看,没看懂,似乎影响不大。
小结
公钥密码解决了密钥配送问题,但这并不意味着它能够解决所有的问题,因为我们需要判断所得到的公钥是否正确合法,这个问题被称为公钥认证问题。
此外,公钥密码还有一个问题就是,它 的处理速度只有对称密码的几百分之一。(混合密码系统解决)
无论对称加密还是非对称加密,都是能保证消息不被外人知道。但无法保证消息的完整性。
单向散列函数
单向散列函数 ( one-way hash function ) 有一个输入和一个输出,其中输入称为消息 (message ) ,输出称为散列值 ( hash value) 。 单向散列函数可以根据消息的内容计算出散列值,而散列值就可以被用来检查消息的完整性 。(单向散列函数也称为消息摘要函数 ( message digest function) 、 哈希函数或者杂凑函数。单向散列函数输出的散列值也称为消息摘要 ( message digest) 或者指纹 ( fingerprint))
- 无论消息的长度有多少,使用同一算法计算出的散列值长度总是固定的。
- 了能够确认完整性,消息中哪怕只有 1 比特的改变,也必须有很高的概率产生不同的散列值。
- 两个不同的消息产生同一个散列值的情况称为碰撞 (collision )。当给定某条消息的散列值时,单向散列函数必须确保要找到和该条消息具有相同散列值的另外一条消息是非常困难的 。 这一性质称为弱抗碰撞性 。 单向散列函数都必须具备弱抗碰撞性 ;和弱抗碰撞性相对的,还有强抗碰撞性 。 所谓强抗碰撞性,是指要找到散列值相同的两条不同的消息是非常困难的这一性质 。
SHA-3
Keccak 是一种被选定为 SHA-3 标准的单向散列函数算法。 Keccak 采用了与 SHA-1 、 SHA-2 完全不同的海绵结构(sponge construction ) 。
Keccak 的海绵结构中 , 输入的数据在进行填充之后,要经过 吸收阶段 (absorbing phase) 和挤出阶段 (squeezing phase), 最终生成输出的散列值 。
通过反复将输入分组的内容搅拌进来,整个消息就会被一点一点地”吸收”到海绵结构的内部状态中,就好像水分被一点一点地吸进海绵内部一样 。无论是吸收阶段还是挤出阶段,函数J的逻辑本身是完全相同的,每执行一次函数f, 海绵结构的内部状态都会被搅拌一次。
小结
使用单向散列函数,我们可以辨别出篡改,但无法辨别出伪装 。 要解决这个问题,我们需要消息验证码和数字签名 。
消息认证码
消息认证码 (Message Authentication Code) 是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为 MAC。
消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为 MAC 值 。
HMAC
HMAC 是一种使用单向散列函数来构造消息认证码的方法。其中 HMAC 的 H就是 Hash 的意思 。HMAC 中所使用的单向散列函数并不仅限千一种,任何高强度的单向散列函数都可以被用于HMAC, 如果将来设计出新的单向散列函数,也同样可以使用 。
小结
消息认证码是对消息进行认证并确认其完整性的技术 :通过使用发送者和接收者之间共享的密钥,就可以识别出是否存在伪装和篡改行为 。
消息认证码可以使用单向散列函数和对称密码等技术来实现 。
消息认证码中,由于发送者和接收者共享相同的密钥,因此会产生无法对第三方证明以及无法防止否认等问题 。
数字签名
在数字签名技术中,出现了下面两种行为 :生成消息签名的行为;验证消息签名的行为;
生成消息签名这一行为是由消息的发送者 A lice 来完成的,也称为“对消息签名” 。 生成签名就是根据消息内容计算数字签名的值,这个行为意味着“我认可该消息的内容” 。
验证数字签名这一行为一般是由消息的接收者 Bob 来完成的,但也可以由需要验证消息的第三方来完成,这里的第三方在本书中被命名为验证者 Victor。 验证签名就是检查该消息的签名是否真的属千 Alice , 验证的结果可以是成功或者失败,成功就意味着这个签名是属千 Alice的,失败则意味着这个签名不是属于 Alice 的。
在数字签名中,生成签名和验证签名这两个行为需要使用各自专用的密钥来完成 。
Alice 使用“签名密钥”来生成消息的签名,而 Bob 和 Victor 则使用“验证密钥”来验证消息的签名 。 数字签名对签名密钥和验证密钥进行了区分,使用验证密钥是无法生成签名的。这一点非常重要 。 此外,签名密钥只能由签名的人持有,而验证密钥则是任何需要验证签名的人都可以持有 。
小结
用数字签名既可以识别出篡改和伪装,还可以防止否认 。 也就是说,我们同时实现了确认消息的完整性、进行认证以及否认防止 。
然而,要正确使用数字签名,有一个大前提,那就是用于验证签名的公钥必须属于真正的发送者 。
为了能够确认自已得到的公钥是否合法,我们需要使用证书 。 所谓证书,就是将公钥当作一条消息,由一个可信的第三方对其签名后所得到的公钥 。
我们需要让公钥以及数字签名技术成为一种社会性的基础设施,即公钥基础设施 ( Public Key Infrastructure), 简称 PKI
证书
公钥证书 (Public-Key Certificate, PKC) 其实和驾照很相似,里面记有姓名、组织 、邮箱地址等个人信息,以及属于此人的公钥,并由 认证机构 (Certification Authority 、 CertifyingAuthority, CA) 施加数字签名 。 只要看到公钥证书,我们就可以知道认证机构认定该公钥的确屈千此人 。 公钥证书也简称为证书 (certificate )。
伪随机数生成器
在密码技术中,随机数被用来生成密钥 。 由于密钥不能被攻击者预测,因此用千密码技术的随机数也必须具备不可预测性。
用千密砃技术的伪随机数生成器,需要使用单向散列函数和密码等技术来确保不可预测性 。
用单向散列函数实现伪随机数生成器
要想知道计数器的值,就需要破解单向散列函数的单向性,这是非常困难的,因此攻击者无法预测下一个伪随机数 。 总而言之,在这种伪随机数生成器中, 单向散列函数的单向性是支撑伪随机数生成器不可预测性的基础 。
用密码实现的伪随机数生成器
攻击者要预测下一个伪随机数,需要知道计数器的当前值 。 然而,由于之前所输出的伪随机数列相当于密文,因此要知道计数器的值,就需要破译密码,这是非常困难的,因此攻击者无法预测出下一个伪随机数 。 总而言之,在这种伪随机数生成器中,密码的机密性是支撑伪随机数生成器不可预测性的基础 。
应用示例
PGP的加密与解密
推荐资料
- 《图解密码技术》-- 结城浩
- Dan Boneh的密码学。(非常好的课程,是有字幕的英文课程,我只看了前两集)
最后
以上就是生动小白菜为你收集整理的密码学简述前言摘要正文应用示例推荐资料的全部内容,希望文章能够帮你解决密码学简述前言摘要正文应用示例推荐资料所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复