简书—密码学专题–基础知识
发送者发送消息,接收者接受消息。
假设发送者 (sender) 想发送消息给接收者 (receiver),并且想安全地发送消息:她想确信窃听者不能阅读发送的消息。
消息(massage)
也称明文(plaintext)
。 用某种方法伪装消息以掩藏它的内容,这个过程称作加密(encryption)
,被加密之后的消息称为密文(ciphertext)
,而把密文转换为明文的过程称作解密(decryption)
。
-)明文用M或P表示
它可能是位序列、文本文件、位图、数字化的语音序列或数字化的视频图像等。对于计算机,*M* 指简单的二进制数据。明文可被传送或存储,无论哪种情况,*M* 指待加密的消息。
-)密文用C表示
它也是二进制数据,有时和 *M* 一样大,有时比 *M* 大 (通过压缩和加密的结合, *C* 有可能比 *P* 小。仅通过加密通常做不到这点)。
-)加密函数E
加密函数 *E* 作用于 *M* 得到密文 *C*,可用数学公式表示:
E ( M ) = C E(M)=C E(M)=C
-)解密函数D
解密函数 *D* 作用于 *C* 产生 *M*:
D ( C ) = M D(C)=M D(C)=M
-)先加密后再解密,原始的明文将恢复,故下面的等式必须成立:
D ( E ( M ) ) = M D(E(M))=M D(E(M))=M
密码算法cryptographic algorithm
也叫做密码cipher
,是用于加密和解密的数学函数 (通常情况下,有两个相关的函数;一个用作加密,另一个用作解密)。
密码算法就是函数
-)算法的保密性受限
比如某个组织中的算法,当这个组织中有人离开,就需要重新设置算法,不然容易泄露。
-)安全性质疑
如果不是密码学专家设计的算法,那么这个算法的安全性是不能保证的。即便是密码学专家设计的算法也有可能是不安全的。
现代密码学用**密钥 (key)** 解决了这个问题,密钥用 *K* 表示。 *K* 可以是很多数值里的任意值。密钥 *K* 的可能取值范围叫做密钥空间 (keyspace)。加密和解密运算都使用这个密钥 (即运算都依赖于密钥,并用 *K* 作为下标表示),这样,加/解密函数现在变成:
E k ( M ) = C D k ( C ) = M E_k(M)=C \\ D_k(C)=M Ek(M)=CDk(C)=M
这些函数具有下面的特性 (见图 1-2):
D k ( E k ( M ) ) = M D_k(E_k(M))=M Dk(Ek(M))=M
也就是说,加密密钥 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VILJdbQt-1591776543592)(https://math.jianshu.com/math?formula=K_1)] 与相应的解密密钥 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sSseI4V5-1591776543594)(https://math.jianshu.com/math?formula=K_2)] 不同,在这种情况下:
$$
E_{K_{1}}(M)=C\
D_{k_{2}}©=M\
D_{K_{2}}(E_{k_{1}}(M))=M
$$
所有这些算法的安全性都基于密钥的安全性,而不是基于算法细节的安全性。这就意味着算法可以公开,可以被分析。可以大量生产使用算法的产品。即使偷听者知道你的算法也没有关系。如果他不知道你使用的具体密钥,他就不可能阅读你的消息。
密码系统 (cryptosystem) 由算法以及所有可能的明文、密文和密钥组成。
-)对称算法的加密/解密密钥是相同的
-)也叫做单密钥算法
-)它要求发送者和接收者在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄露密钥就意味着任何人都能对消息进行加/解密。只要通信需要保密,密钥就必须保密。
对称算法的加密和解密表示为:
E k ( M ) = C D k ( C ) = M E_k(M)=C \\D_k(C)=M Ek(M)=CDk(C)=M
对称算法分为两类,一类是序列算法,一类是分组算法
-)序列算法也称序列密码
一次只对明文中的单个位(有时是字节)运算的算法称作序列算法
-)分组算法也叫分组密码
1)对明文的一组位进行运算
2)现代计算机密码算法的典型的分组长度为64位
公开密钥算法`public-key algorithm`,也称作非对称算法。
1)用作加密的密钥不同于用作解密的密钥,而且解密密钥不能根据加密密钥计算出来 (至少在合理假定的长时间内)。之所以叫做 “公开密钥” 算法,是因为加密密钥能够公开,即陌生者能用加密密钥加密信息,但只有用相应的解密密钥才能解密信息。
2)在这些系统中,加密密钥叫做公开密钥 (public-key,简称公钥),解密密钥叫做私人密钥 (private-key,简称私钥)。
用公开密钥 *K_pub*加密可表示为:
E k p u b ( M ) = C E_{{k}_{pub}}(M)=C Ekpub(M)=C
相应的私人密钥解密可表示为:
D k p r i ( C ) = M D_{{k}_{pri}}(C)=M Dkpri(C)=M
3)有时消息用私人密钥加密而用公开密钥解密,这用于数字签名。尽管可能产生混淆,但这些运算可分别表示为:
E k p r i ( M ) = C D k p u b ( C ) = M E_{{k}_{pri}}(M)=C\\ D_{{k}_{pub}}(C)=M Ekpri(M)=CDkpub(C)=M
加密方案的安全性必须仅仅依赖于对密钥 K 的保密,而不依赖于对算法的保密。
密码编码学的主要目的是保持明文 (或密钥,或明文和密钥) 的秘密以防止偷听者 (也叫对手、攻击者、截取者、入侵者、敌手或干脆称为敌人) 知晓。这里假设偷听者完全能够截取发送者和接收者之间的通信。
密码分析学是在不知道密钥的情况下,恢复明文的科学。成功的密码分析能恢复消息的明文或密钥。密码分析也可以发现密码体制的弱点,最终得到上述结果 (密钥通过非密码分析方式的丢失叫做泄露 (compromise))。
常用的密码分析攻击有四类,当然,每一类都假设密码分析者知道所用的加密算法的全部知识。
-)密码分析者有一些消息的密文,这些消息都用相同加密算法加密。
-)密码分析者的任务是恢复尽可能多的明文,或者最好能推算出加密消息的密钥,以便可采用相同的密钥破解其他被加密的消息。
已知:
C 1 = E k ( M 1 ) , C 2 = E k ( M 2 ) , … C i = E k ( M i ) C_1=E_k(M_1), C_2=E_k(M_2),\ldots C_i=E_k(M_i) C1=Ek(M1),C2=Ek(M2),…Ci=Ek(Mi)
推导出: M 1 , M 2 , … , M i M_1,M_2, \dots , M_i M1,M2,…,Mi;或者k;
-)Alice 和 Bob 对他们的数据进行了加密,攻击者得到的只有密文。在只知道密文的情况下试图解密一个消息就称为唯密文攻击,这是最困难的一种攻击方式,因为已知的信息量最少。
-)难度等级* * * * *
-)密码分析者不仅可得到一些消息的密文,而且也知道这些消息的明文。
-)分析者的任务就是用加密信息推出用来加密的密钥或导出一个算法,此算法可以对用相同密钥加密的任何新消息进行解密。
已知:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTndw1p5-1591776543595)(https://math.jianshu.com/math?formula=P_1%2C%20C_1%20%3D%20E_K(P_1)]%2C%20P_2%2C%20C_2%20%3D%20E_K(P_2)%2C%20…%2C%20P_i%2C%20C_i%20%3D%20E_K(P_i))
推导出:密钥 K,或从 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYUiXY9U-1591776543596)(https://math.jianshu.com/math?formula=C_%7Bi%2B1%7D%20%3D%20E_K(P_%7Bi%2B1%7D)]) 推导出 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMpvCGJs-1591776543596)(https://math.jianshu.com/math?formula=P_%7Bi%2B1%7D)] 的算法。
已知明文攻击是一种同时知道明文和密文的攻击。
显然,这种攻击的目标是获得解密密钥。
乍一看这好像令人难以置信,如何知道明文呢?实际上,在很多情况下都可以获得通信的明文。有时候一些消息是容易预测的,
-)如果Bob和Alice之间有约定的密钥,而与其他人没有
1)比如 Alice 在外度假,她的电子邮件自动回复设置为能够给每一封收到的电子邮件回复 “我在度假”,攻击者要以给 Alice 发送一封电子邮件,然后读取答复得到自动回复的具体内容。 2)当 Bob 发送一个电子邮件给 Alice 时,也会有同样的自动回复,不过这一次是加密的,现在攻击者就得到了一条消息的密文和明文。 3)如果能够得到密钥,就可以解密 Alice 和 Bob 使用这个密钥交互的其他所有消息。 **后一部分非常重要,值得重述一遍:通过一些明文-密文对获得密钥,然后使用密钥来解密其他密文。**
已知明文攻击比唯密文攻击更强大。攻击者可以得到比唯密文攻击中更多的信息,这些额外的信息当然会有帮助。
-)难度等级* * * * #
-)分析者不仅可得到一些消息的密文和相应的明文,而且他们也可选择被加密的明文。
>这比已知明文攻击更有效,因为密码分析者能选择特定的明文块进行加密,那些块可能产生更多关于密钥的信息。
-)分析者的任务是推出用来加密消息的密钥或导出一个算法,此算法可以对用相同密钥加密的任何新消息进行解密。
已知:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79R26OTD-1591776543597)(https://math.jianshu.com/math?formula=P_1%2C%20C_1%20%3D%20E_K(P_1)]%2C%20P_2%2C%20C_2%20%3D%20E_K(P_2)%2C%20…%2C%20P_i%2C%20C_i%20%3D%20E_K(P_i)),其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgmTvDMX-1591776543597)(https://math.jianshu.com/math?formula=P_1%2C%20P_2%2C%20…%2C%20P_i)] 可由密码分析者选择。
推导出:密钥 K,或从 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzCbcfjb-1591776543598)(https://math.jianshu.com/math?formula=C_%7Bi%2B1%7D%20%3D%20E_K(P_%7Bi%2B1%7D)]) 推导出 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzFhUcbZ-1591776543598)(https://math.jianshu.com/math?formula=P_%7Bi%2B1%7D)] 的算法。
-)这种攻击在现实中并不是不切实际的,在很多情况下攻击者可以选择被加密的数据。Alice 经常从外界的信息源 (比如,可能受到攻击者影响的信息源) 得到信息,然后以加密形式转发给 Bob。例如,攻击者可以发送一封电子邮件给 Alice,而且他知道 Alice 肯定会转发给 Bob。
-)难度等级* * * # #
-)密码分析者能选择不同的被加密的密文,并可得到对应的解密的明文。
例如,密码分析者访问一个防窜改的自动解密盒,密码分析者的任务是推出密钥。
已知:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jpr7GsRM-1591776543727)(https://math.jianshu.com/math?formula=C_1%2C%20P_1%20%3D%20D_K(C_1)]%2C%20C_2%2C%20P_2%20%3D%20E_K(C_2)%2C%20…%2C%20C_i%2C%20P_i%20%3D%20E_K(C_i))
推导出:K。
-)这种攻击主要用于公开密钥算法
-)“选择密文” 这个术语其实不太恰当,实际上应该称为 “选择密文和明文攻击”。
显而易见,选择密文攻击比选择明文攻击更强大,因为攻击者有更多的自由,但是目标仍然是获得密钥,得到密钥之后就可以解密其他密文。再次强调一下,任何合理的加密方案都应该能够抵抗选择密文攻击。
生日攻击得名于生日悖论。如果一个房间里有 23 个人,那么其中两个人生日相同的概率超过 50%,这个概率大得令人不可思议,因为一共有 365 个可能的生日。如果一个房间里有 41 个人,那么其中两个人生日相同的概率超过 90%。
那什么是生日攻击呢?这种攻击依赖于一个事实:相同的值 (也称为碰撞) 出现得比我们预料的要快得多。在一个保护金融交易的系统中,假设每一笔交易都使用新的 64 位的认证密钥 (为了简单起见,我们假设没有使用加密),那么一共有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VzDdXUM-1591776543599)(https://math.jianshu.com/math?formula=2%5E%7B64%7D(%3D18%20%5Ctimes%2010%5E%7B18%7D)])个可能的密钥值,所以这样应该是很难攻破的,对吗?不!在大约 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-896Cy5An-1591776543599)(https://math.jianshu.com/math?formula=2%5E%7B32%7D(%3D4%20%5Ctimes%2010%5E%7B9%7D)]) 次交易之后,攻击者就可以预料到有两次交易使用了相同的密钥。假设认证的第一条消息总是相同的:“Are you ready to receive a transaction?” 那么如果两次交易使用了相同的认证密钥,它们第一条消息的 MAC 值就是相同的,攻击者很容易就可以发现这一点,知道了两次密钥是相同的,攻击者就可以把以前交易中的消息插入正在进行的新交易中,而这些伪造的消息是被正确的密钥认证的,所以会被接受,显然这破坏了金融交易系统。
一般来说,如果一个元素可以取 N 种不同的值,那么随机选择了大约 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SDqyv25S-1591776543599)(https://math.jianshu.com/math?formula=%5Csqrt%20N)] 个元素之后,就可以预期出现第一次碰撞 (这里我们不考虑计算的细节,但 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jj67ROzL-1591776543600)(https://math.jianshu.com/math?formula=%5Csqrt%20N)] 是非常接近的)。对于生日悖论来说,N=365,从而 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGYYxQlW-1591776543600)(https://math.jianshu.com/math?formula=%5Csqrt%20N%20%5Capprox%2019)],实际上出现相同生日的概率超过 50% 所需要的人数是 23,但是对于我们来说 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NZ1Ps4iK-1591776543601)(https://math.jianshu.com/math?formula=%5Csqrt%20N)] 已经十分接近了,而且这也是密码学中常用的近似值。可以这样理解,如果选择 k 个元素,那么有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlGsMTtF-1591776543601)(https://math.jianshu.com/math?formula=k(k-1)]%2F2N) 对元素,每一对元素有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NgIvD7st-1591776543602)(https://math.jianshu.com/math?formula=1%2FN)] 的机会是相等的,所以出现碰撞的概率接近 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7hAJZww-1591776543602)(https://math.jianshu.com/math?formula=k(k-1)]%2F2N),当 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uIxLkAv2-1591776543603)(https://math.jianshu.com/math?formula=k%20%5Capprox%20%5Csqrt%20N)] 时,这个值就接近 50% 了。
大多数时候我们讨论 n 位的值,因为有 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEilxugU-1591776543603)(https://math.jianshu.com/math?formula=2%5En)] 个可能的值,所以集合中需要 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqBKvaa1-1591776543604)(https://math.jianshu.com/math?formula=%5Csqrt%20%7B2%5En%7D%20%3D%202%5E%7Bn%2F2%7D)] 个元素才能预期出现一次碰撞。我们将经常谈到 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IqxPl7Z3-1591776543604)(https://math.jianshu.com/math?formula=2%5E%7Bn%2F2%7D)] 这个界,或称为生日界。
.(img-uIxLkAv2-1591776543603)] 时,这个值就接近 50% 了。
大多数时候我们讨论 n 位的值,因为有 [外链图片转存中…(img-XEilxugU-1591776543603)] 个可能的值,所以集合中需要 [外链图片转存中…(img-tqBKvaa1-1591776543604)] 个元素才能预期出现一次碰撞。我们将经常谈到 [外链图片转存中…(img-IqxPl7Z3-1591776543604)] 这个界,或称为生日界。