传统加密技术
在1978年以前,公钥密码学的概念还没有提出,此前的加密体制只有对称加密,因此对称加密也被称为传统加密,不过至今对称加密都是十分广泛的。对称加密在加密和解密过程中使用了相同的密钥,并且在加解密过程中使用了两种传统加密技术:代替和置换。文章首先对于对称密码作一些概述,然后通过生动的古典密码来阐述这两种加密技术,在这一过程中将展示密码设计的思想,并对密码系统进行分析。
更新历史:
- 2021年07月25日完成初稿
1. 对称密码概述
1.1 对称密码模型
回顾一下在密码学基本概念一节中所介绍的保密通信模型,事实上如果在图中加密密钥和解密密钥是相同的,那么它就是对称加密的经典模型:
而且由上图还归结了由五元组 < M , C , E , K , D > <M, C, E, K, D> <M,C,E,K,D>表示的密码系统:
- 明文:plaintext,通常用 M M M表示明文空间, m ∈ M m\in M m∈M表示明文空间中的一条明文
- 加密函数:encryption function,通常用 E E E表示,明文和加密密钥是加密函数的输入,而密文是加密函数的输出
- 密钥:key,通常用 K K K表示密钥空间, k ∈ K k\in K k∈K表示密钥空间的一个密钥
- 密文:ciphertext,通常用 C C C表示密文空间,用 c ∈ C c\in C c∈C表示由明文 m m m经加密函数产生的密文
- 解密函数:decryption function,通常用 D D D表示,密文和解密密钥是解密函数的输入,而明文是加密函数的输出
明文的符号表示
尽管明文的英文单词为plaintext,但在之后的叙述中文章习惯于用 m m m表示明文,而非 p p p,原因之一是在文章的叙述中会使用到概率符号 P P P。
面对上面的模型,有两类人从不同的角度思考问题,一类人思考如何加密信息,如何保证密钥的安全性,他们致力于密码的编码与设计,另一类人则在思考由已知的信息(通常已知密码算法和密文)如何破译这个系统,无论是获得明文还是获得密钥,他们则致力于对密码的分析,由此也衍生出密码编码学和密码分析学。或许讲述这些有些偏离主题,但清楚密码学的目标和威胁或许对于下面讲述经典对称密码有所帮助,因为在分析这些密码时,可能需要从这两个角度去思考整个密码系统的安全性,此时你将既是密码编码学家又是密码分析学家。
1.2 密码编码学
尽管根据Kerckhoffs’s principle,密码系统的安全性取决于密钥的安全,但其他部分也不能成为短板,密码编码学家致力于设计一类安全的密码系统,以至于攻击者除了对密钥进行穷举之外毫无办法,因此传统密码的安全使用需要满足以下几种基本的要求:
- 加密算法足够强:攻击者在拥有一个或多个密文时都无法破译密文或者密钥,甚至敌手拥有一定数量的密文和产生这些密文的明文也不能破译密文或发现密钥
- 密钥能安全分发: 发送方和接收方必须在某种安全的形式下获得密钥并且必须保证密钥安全。
Kerckhoffs’s principle
1883年,在那一年,荷兰语言学家、密码学家Auguste Kerckhoffs提出Kerckhoffs’s principle,其核心理念是:A cryptosystem should be secure even if everything about the system, except the key, is public knowledge.
在此之前,密码界的主流理念是Security through obscurity(隐晦式安全),该理念主张对密码系统的细节进行保密,如今只有一些军事领域的密码算法会对所有细节进行保密以确保安全。但该理念的缺点是保密的东西很多,随着系统的复杂程度提高、技术的发展,对每个环节都加密或保密越来越难实现,正如「系统内保密的东西越多,系统越不安全」。
密码编码学总是关注着这些要求,并按照这些基本要求设计和发展密码系统,也形成了不同类型的密码体系,下面就是最重要的几种分类,在这里:
- 加密算法的原理
- 代替密码:简单地说,代替密码就是将明文的一个元素映射成另一个元素
- 置换密码:置换密码则是重新排列明文中的元素
- 乘积密码:同时使用代替和置换的密码体制
- 密钥数
- 单钥密码:即对称加密,也称为传统加密,加密密钥和解密密钥相同
- 多钥密码:即公钥加密,也称为非对称加密,使用公钥和私钥
- 处理明文的方法
- 分组密码:对明文进行加密时,每次处理明文的一组元素(通常64bits、128bits等)
- 流密码:对明文进行加密时,每次处理明文的一个元素(通常1bit或者1Bytes)
密码分类
上述密码分类是独立的,即一个密码系统可以是代替密码,也可以是单钥密码,同时也可以是分组密码,因为它们从不同的角度看待密码系统。比如之后讲述的数据加密标准(DES)就是一种对称密码,但DES每次处理64bits的明文,在加密时对明文和密钥进行多次使用了置换和代替技术。不过,为了使得加密算法变得更复杂但又能高效运行,因此现代密码几乎全部使用代替和置换技术,并以分组形式进行加密,密码技术仅由对称加密和公钥加密进行区分,值得注意的是,之前讲述的无密钥算法由于安全性不再使用,这几乎是必然的。
1.3 密码分析学
密码分析的目标是恢复使用的密钥以攻击密码系统,尽管穷举攻击可以恢复密钥,但仅仅是理论可行的,而不是计算上可行的。
无条件安全和计算安全
- 无条件安全:无论有多少可用的密文,如果都不足以唯一地确定密文对应的明文
- 计算安全:破译密码的代价超过密文信息的价值,或者破译密码的时间超过密文信息的有效生命期
在密码学中,只有一次一密是无条件安全的,其他所有密码都期望做到计算上安全。
密码分析是基于攻击者所拥有的信息多少,一般而言密码分析者知道加密算法和密文,但如果还知道其他信息,显然会增加破译密码的可能,下面就列举了拥有不同信息的攻击类型:
- 唯密文攻击:加密算法、密文
- 已知明文攻击:加密算法、密文和用(与待解密文的)同一密钥加密的一个或多个明密文对
- 选择明文攻击:加密算法、密文和分析者选择的明文,及对应的密文(与待解密文使用同一密钥加密)
- 选择密文攻击:加密算法、密文和分析者选择的一些密文,及对应的明文(与待解密文使用同一密钥解密)
- 选择文本攻击:加密算法、密文、分析者选择的明文,及对应的密文(与待解密文使用同一密钥加密)和分析者选择的一些密文,及对应的明文(与待解密文使用同一密钥解密)
一般而言,密码系统设计者都希望仅仅受到唯密文攻击,此时密码分析者的信息最少,但往往攻击者可以进行已知明文攻击和选择明文攻击,此时密码系统会受到一定的威胁,而选择密文攻击和选择文本攻击较少采用。
下面开始介绍一些简单的代替密码和置换密码,他们大多是古典密码而且很容易破译,不过这些密码所体现的思想,已经破译这些密码的手段是值得学习的。为了简便讨论,下面假设明文、密钥和密文都是ASCII字符,并用小写英文字母来表示明文,大写英文字母表示加密后的密文。
2. 传统加密技术
古典密码学中有许多构思巧妙的加密算法,如Caesar密码等。根据使用的加密技术,这些加密算法主要可以分为代替密码、置换密码和同时使用两种技术的乘积密码。下面主要阐述两种加密技术:代替技术和置换技术,以及对应的经典加密方案。
2.1 代替技术
代替技术主要采用映射的思想,将一个字符映射成另一个字符,也就相当于用密文字符代替明文字符,为了能够解密,往往要求映射是可逆的。
映射
映射是数学上的术语,常用于描述集合的对应关系。对于集合 X X X和集合 Y Y Y,从 X X X到 Y Y Y的映射表示了集合 X X X的元素与集合 Y Y Y中的元素之间的对应关系,比如在中文字典中,一个汉字的索引就对应了该汉字的位置。
可逆映射指集合 X X X中的所有元素和集合Y中的所有元素一个对一个,没有重复,没有遗漏,因此可逆映射也称为一一对应。下面就是集合 X = { 1 , 2 , 3 } , Y = { A , B , C } X=\{1,2,3\}, Y=\{A,B,C\} X={ 1,2,3},Y={ A,B,C}一一对应的关系,显然可逆映射要求两个集合元素一样多。
X X X 1 1 1 2 2 2 3 3 3 Y Y Y C C C B B B A A A
2.1.1 Caesar密码
已知的最早的代替密码是Caesar密码(凯撒密码),它非常简单,就是对字母表中的每个字母,用它之后的第3个字母来代替,即:
明文 | a | b | c | d | e | f | g | h | i | … | s | t | u | v | w | x | y | z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
密文 | D | E | F | G | H | I | J | K | L | … | V | W | X | Y | Z | A | B | C |
例如对于明文:attack on may,其对于的明文应为:DWWDFN RQ PDB。当然对于该方法而言,可以用数学符号来表示,首先给 26 26 26个字母表编号,用 0 ∼ 25 0\sim 25 0∼25表示 a ∼ z a\sim z a∼z,那么就可以用下面的算法进行表达:对于每个明文字符 m m m,其对应的密文字符 C C C而言,加密算法为
C = E 3 ( m ) ⇒ C = ( m + 3 ) m o d 26 C = E_3(m)\Rightarrow C = (m+3)\;mod\;26 C=E3(m)⇒C=(m+3)mod26
其中明文和密文是十分明确的,而密钥就是数字 3 3 3,加密算法就是上面的模 26 26 26运算,相应的解密算法是:
m = D 3 ( C ) ⇒ m = ( C − 3 ) m o d 26 m = D_3(C)\Rightarrow m = (C-3)\;mod\;26 m=D3(C)⇒m=(C−3)mod26
由上面的讨论,可以将其推广到一般意义下的Caesar密码,即密钥不再是常数 3 3 3,而是任意值。显然在模 26 26 26运算下,密钥空间实际为 K = { 1 , 2 , 3 , . . . , 25 } K=\{1,2,3,...,25\} K={
1,2,3,...,25},不过在这个条件下攻击者是可以在有限时间内尝试所有密钥以攻击Caesar密码,因此Caesar密码不是计算安全的。尽管Caesar密码是不安全的,但在当时那个年代还是十分安全的,因为攻击者很有可能都不知道Caesar密码的存在,所以Caesar密码得益于密码算法的保密。
模运算
模运算定义为 a + b ( m o d n ) a+b\;(mod\;n) a+b(modn),其值是 a + b a+b a+b除以 n n n的余数,而且余数是小于 n n n的非负整数,因此对于模 26 26 26运算,余数的取值范围为 { 0 , 1 , 2 , 3 , . . . , 25 } \{0,1,2,3,...,25\} { 0,1,2,3,...,25},不过对于Caesar密码而言,密钥取值为 0 0 0是可以的但明显没有实际意义。
在破解Caesar密码这一类代替密码时,有以下三个条件是有利于攻击者的:
- 加密和解密算法已知
- 密钥空间有限,Caesar密码的密钥空间大小仅为 25 25 25
- 所使用的的明文和密文是便于识别的
前面两点很好理解,对于最后一点,如果明文是不可识别的(甚至是经过压缩的),那么在穷举攻击者是难以判断恢复出的明文是否是正确的。
2.1.2 单表代替密码
从简单的Caesar密码就可以看到一些关于代替的思想,不过这种代替十分简单,因为对每个字母,仅用它之后的第3个字母来代替。如果对于每个字母而言,可以用任意字母来代替,那么密钥空间就会急剧增加。
在叙述单表代替密码之前,先介绍一下置换的概念。之前通俗地介绍了映射和可逆映射(一一对应),事实上置换是一种特殊的可逆映射:
- 置换:设有集合 S S S,从 S S S到 S S S的可逆映射称为置换。简单地说,置换就是集合 S S S中每个元素的重新排列。
例如, S = { a , b , c } S=\{a,b,c\} S={
a,b,c},那么在集合 S S S上的置换就有 6 6 6个:
( a b c a b c ) , ( a b c a c b ) , ( a b c b a c ) , ( a b c b c a ) , ( a b c c a b ) , ( a b c c b a ) \left( \begin{array}{c} a\,\,b\,\,c\\ a\,\,b\,\,c\\ \end{array} \right) ,\left( \begin{array}{c} a\,\,b\,\,c\\ a\,\,c\,\,b\\ \end{array} \right) ,\left( \begin{array}{c} a\,\,b\,\,c\\ b\,\,a\,\,c\\ \end{array} \right) ,\left( \begin{array}{c} a\,\,b\,\,c\\ b\,\,c\,\,a\\ \end{array} \right) ,\left( \begin{array}{c} a\,\,b\,\,c\\ c\,\,a\,\,b\\ \end{array} \right) ,\left( \begin{array}{c} a\,\,b\,\,c\\ c\,\,b\,\,a\\ \end{array} \right) (abcabc),(abcacb),(abcbac),(abcbca),(abccab),(abccba)
简记为 ( a , b , c ) , ( a , c , b ) , ( b , a , c ) , ( b , c , a ) , ( c , a , b ) , ( c , b , a ) (a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a) (a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a),可以证明若 S S S中有 n n n个元素,那么在集合 S S S上的置换有 n ! n! n!个。因此对于 26 26 26个字母表上的置换则有 26 ! ≈ 4 × 1 0 26 26!\approx 4\times10^{26} 26!≈4×1026个,将该置换作为密钥,那么密钥空间是十分庞大的(比后面要讲述的DES算法的密钥空间大 10 10 10个数量级),这就是单表代替密码的基本思想。
- 单表代替密码:考虑一个大小为 n n n的密码字母置换表,按照该密码字母表进行的一次代替的密码算法称为单表代替密码,该密码的密钥空间大小为 n ! n! n!
由于密钥空间比较庞大,因此密码攻击者不得不另辟蹊径,在已知密文和密码算法的情况下,攻击者发现如果明文和密文之间有一定的关联,即相同明文总是置换为相同的密文,那么在明文消息中某个字符出现的频率在密文消息中对应字符出现的频率是相同的,来看看下面的例子:假如攻击者获得一段密文,并且知道其明文由英文字符组成:
53 ‡ ‡ † 305 ) ) 6 ∗ ; 4826 ) 4 ‡ . ) 4 ‡ ) ; 806 ∗ ; 48 † 8 ¶ 60 ) ) 85 ; ; ] 8 ∗ ; : ‡ ∗ 8 † 83 ( 88 ) 5 ∗ † ; 46 ( ; 88 ∗ 96 ∗ ? ; 8 ) ∗ ‡ ( ; 485 ) ; 5 ∗ † 2 : ∗ ‡ ( ; 4956 ∗ 2 ( 5 ∗ — ) 8 ¶ 8 ∗ ; 4069285 ) ; ) 6 † 8 ) 4 ‡ ‡ ; 1 ( ‡ 9 ; 48081 ; 8 : 8 ‡ 1 ; 48 † 85 ; 4 ) 485 † 528806 ∗ 81 ( ‡ 9 ; 48 ; ( 88 ; 4 ( ‡ ? 34 ; 48 ) 4 ‡ ; 161 ; : 188 ; ‡ ? ; 53‡‡†305))6*;4826)4‡.)4‡);806*;48†8¶60))85;;]8*;:‡*8†83\\ (88)5*†;46(;88*96*?;8)*‡(;485);5*†2:*‡(;4956*2(5*—)8¶8*\\ ;4069285);)6†8)4‡‡;1(‡9;48081;8:8‡1;48†85;4)485†528806*81\\ (‡9;48;(88;4(‡?34;48)4‡;161;:188;‡?;\\ 53‡‡†305))6∗;4826)4‡.)4‡);806∗;48†8¶60))85;;]8∗;:‡∗8†83(88)5∗†;46(;88∗96∗?;8)∗‡(;485);5∗†2:∗‡(;4956∗2(5∗—)8¶8∗;4069285);)6†8)4‡‡;1(‡9;48081;8:8‡1;48†85;4)485†528806∗81(‡9;48;(88;4(‡?34;48)4‡;161;:188;‡?;
那么攻击者首先想到由英文字符组成的明文是否有一定的规律,根据数据统计,英文字母的使用频率分布大概如下表所示:
字母 | e | t | a | o | i | n | s | h | r | d | l | c | u |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
频率(%) | 12.702 | 9.056 | 8.167 | 7.507 | 6.996 | 6.749 | 6.327 | 6.904 | 5.987 | 4.253 | 4.025 | 2.782 | 2.758 |
字母 | m | w | f | g | y | p | b | v | k | j | x | q | z |
频率(%) | 2.406 | 2.360 | 2.228 | 2.015 | 1.974 | 1.929 | 1.492 | 0.978 | 0.772 | 0.153 | 0.150 | 0.095 | 0.074 |
本数据参考自:[1] Lewand R . Cryptological mathematics[M]. Mathematical Society of America, 2000.
因此攻击者也统计一下密文中的字符频率:
密文 | 8 8 8 | ; ; ; | 4 4 4 | ) ) ) | ‡ ‡ ‡ | ∗ * ∗ | 5 5 5 | 6 6 6 | ( ( ( | † † † | 1 1 1 |
---|---|---|---|---|---|---|---|---|---|---|---|
频率(%) | 16.667 | 13.235 | 9.314 | 7.843 | 7.353 | 6.863 | 5.882 | 5.392 | 4.412 | 3.921 | 3.431 |
密文 | 0 0 0 | 2 2 2 | 9 9 9 | 3 3 3 | : : : | ? ? ? | ¶ ¶ ¶ | . . . | ] ] ] | — — — | |
频率(%) | 2.941 | 2.451 | 2.451 | 1.961 | 1.961 | 1.471 | 0.980 | 0.490 | 0.490 | 0.490 |
尽管频率不是完全一致,但其趋势是可以利用的,因此可以尝试 8 → e , ; → t 8\rightarrow e, ;\rightarrow t 8→e,;→t,并且尝试一些十分常见的字母组合,如 t h e the the、 o f of of、 o n on on等。可以发现在密文中出现了多次 ; 48 ;48 ;48,即 t _ e t\_e t_e,考虑英文中最常见的组合 t h e the the,可以猜测 4 → h 4\rightarrow h 4→h,故可以尝试令 ; 48 → t h e ;48\rightarrow the ;48→the,然后填入明文观察是否能够得到有意义的信息,之后根据类似的分析退出其他字符对应的明文,从而破解该密码。
通过这样的分析来获得对于字母的猜测以破译密码,这种方法被称为频率分析攻击:
- 频率分析攻击:利用明文字符和密文字符之间的频率特性,从而从密文中恢复出明文的攻击方法
单字母表密码之所以会遭受频率分析攻击,是因为单字母表密码没有掩盖明文字符和密文字符之间的频率特性,即密文中还保留着一定的明文字符的统计特性,减少代替密码内明文结构在密文中的残留度的方法主要有两种:
- 对明文中的多个字母一起加密,如Playfair密码、Hill密码
- 采用多表代替密码
第一种方法很好理解,下面介绍多表代替密码。
2.1.3 多表代替密码
多表代替密码是对单表代替密码的改进,其在明文加密时采用了不同的单表进行代替,比如著名的Vigenere密码就是多表代替密码,下面以Vigenere密码阐述多表代替密码的基本思想。
设有明文序列 M = m 1 m 2 . . . m s − 1 M=m_1m_2...m_{s-1} M=m1m2...ms−1,密钥序列 K = k 0 k 1 . . . k t − 1 K=k_0k_1...k_{t-1} K=k0k1...kt−1,通常 t < s t<s t<s,其会产生密文序列 C = E K ( M ) = c 0 c 1 . . . c n − 1 C=E_K(M)=c_0c_1...c_{n-1} C=EK(M)=c0c1...cn−1,具体的加密算法如下:
c i = ( m i + k i m o d t ) m o d 26 c_i = (m_i+k_{i\;mod\;t})\;mod\;26 ci=(mi+kimodt)mod26
加密时需要明文和密钥序列长度一致,而密钥通常是一个密钥词的重复,比如明文为we are discovered save yourself,而密钥词为deceptive,因此在加密时将明文中的空格去掉,然后重复deceptive以获得与明文一样长度的密钥:
- 明文:wearediscoveredsaveyourself
- 密钥:deceptivedeceptivedeceptive
- 密文:ZICVTWQNGRZGVTWAVZHCQYGLMGJ
Vigenere密码的好处在于一个字符可以对应于多个字符,因为同一个明文字符通过不同的密钥词进行加密,比如明文中第 2 2 2个单词 e e e是用密钥 e e e加密,而第 5 5 5个单词 e e e是用 p p p加密。在这种情况下,字母出现的频率信息被隐蔽,但并非所有的明文结构信息都被隐蔽,下面概述一下其原因:
以上面的例子为例,假如攻击者获得了密文ZICVTWQNGRZGVTWAVZHCQYGLMGJ,并认为该密码可能是通过单表代替密码或者Vigenere密码来加密的,那么攻击者可以开始下面的工作。首先,通过频率分析后发现其展现的频率和2.1.2节中的英文字符频率分布不是很一致,那么认为可能不是单表代替密码,因此考虑是Vigenere密码。攻击者面对Vigenere密码时,最关注的就是密钥词的长度,因为密钥词的长度往往小于明文的长度,那么很可能出现明文中的相同字符会由相同密钥来加密,比如:
- 明文:wearediscoveredsaveyourself
- 密钥:deceptivedeceptivedeceptive
那么密文中的字符也会一样,那么攻击者要查找密文中的相同字符(通常长度不小于 3 3 3),很快就发现密文中ZICVTWQNGRZGVTWAVZHCQYGLMGJ有相同的字符,其相隔距离为 9 9 9,如果攻击者认为这是相同明文由相同密钥加密而成的密文,那么可以推测密钥词的长度是 9 9 9的因子( 1 , 3 , 9 1,3,9 1,3,9),此后就可以从这里出发猜测明文。假设猜测密钥词长度为 9 9 9,那么需要注意另外一个事实:第 1 1 1、 10 10 10、 19 19 19、 28 28 28、…个字符都由同一个字符(即同一密钥)加密,这就变成了单字母表密码了,之后就可以利用2.1.2小节中的频率分析攻击进行破解了。
密码破解
读者可能会质疑上面的分析,因为存在很多基于一些理想但看似不实际的猜测和推理。事实上,如果得到上面例子中一样长度的字符( 27 27 27个字符),那么确实难以分析,不过现实中可以获得的密文数量是很庞大的,那么上面的分析总是会有效,况且攻击者还不只是进行唯密文攻击,如果攻击者可以进行已知明文攻击和选择明文攻击,那么攻击者能够获得的信息更多。
在上述中,攻击者所做的一切都是因为Vigenere密码并没有掩盖密文中所显现出的明文字符的某些特性,其唯一的解决办法是:选择一个和明文毫无统计关系且和明文一样长的密钥。1918 年,AT&T 公司的工程师 Gilbert Vernam 首先引入了这种体制,并构造了Vernam密码,不过Vernam密码的难题在于难以产生完全随机的密钥,只要密钥不是完全随机的,那么对于Vernam密码就有办法利用上面的攻击手段加以破解。
2.1.3 一次一密
一次一密(One-Time Pad)基于上面所谈及的一个思想:选择一个和明文毫无统计关系且和明文一样长的密钥,也就是每一次加密就用一个完全不同的密钥,关注一次一密的两个特性:
- 密钥和明文一样长
- 每次加密的密钥都不同
第一点很容易理解,而第二点十分重要,它说明了一个事实:密钥空间的大小不小于明文空间的大小。Shannon基于这个事实证明了一次一密是无条件安全的,但也证明了一次一密是并不实际的,并总结出任何无条件安全的密码都是不实际的。下面首先阐述一下无条件安全的数学定义并证明一次一密是无条件安全的,之后给出不实际密码系统的数学定义,并证明任何无条件安全的密码系统都是不实际的。
无条件安全要求密文和明文是完全独立的,也就是说对于任何一段密文都无法得到明文的任何信息,假设有密文 c c c,其由明文 m m m和密钥 k k k加密而来 c = E k ( m ) c=E_k(m) c=Ek(m),攻击者根据密文 c c c推测出对应的明文为 m ∗ m^* m∗,因此无条件安全的数学表示为:
P ( m ∗ = m ∣ c = E k ( m ) ) = P ( m ∗ = m ) (2.1) P(m^*=m|c=E_k(m))=P(m^*=m)\tag{2.1} P(m∗=m∣c=Ek(m))=P(m∗=m)(2.1)
其中 P ( ) P() P()表示概率, P ( A ∣ B ) P(A|B) P(A∣B)表示在已知事件 B B B发生的情况下,事件 A A A发生的概率,称为条件概率。上式表达的就是在已知密文的情况下推测明文与在没有任何信息的情况下推测明文的可能性是一样大的,也就是说有密文和没有密文是一样的,因此明文和密文是完全独立的。
条件概率
条件概率描述了在已知一定信息下的事件发生的概率,如 P ( A ∣ B ) P(A|B) P(A∣B)表示在已知事件 B B B发生的情况下,事件 A A A发生的概率,其计算公式为 P ( A ∣ B ) = P ( A B ) / P ( B ) P(A|B)=P(AB)/P(B) P(A∣B)=P(AB)/P(B),其中 P ( A B ) P(AB) P(AB)表示事件 A A A和事件 B B B同时发生的概率。
对于 ( 2.1 ) (2.1) (2.1)式的证明是必要的,证明的思路会给之后的讨论提供很多的启发。假设明文空间为 M M M,密钥空间为 K K K,密文空间为 C C C,则有:
P ( m ∗ = m ) = 1 M (2.2) P(m^*=m) = \frac{1}{M}\tag{2.2} P(m∗=m)=M1(2.2)
即穷举明文空间中所有明文后找到实际明文的概率。故证明一次一密是无条件安全的只需证明:
P ( m ∗ = m ∣ c = E k ( m ) ) = 1 M (2.3) P(m^*=m|c=E_k(m))=\frac{1}{M}\tag{2.3} P(m∗=m∣c=Ek(m))=M1(2.3)
令事件 A = ( m ∗ = m ) , B = ( c = E k ( m ) ) A=(m^*=m),B=(c=E_k(m)) A=(m∗=m),B=(c=Ek(m)),则有
P ( B ) = P ( c = E k ( m ) ) = ∑ m i ∈ M ∑ k i ∈ K P ( E k i ( m i ) = c ) ∣ M ∣ × ∣ K ∣ (2.4) P(B)=P(c=E_k(m))=\sum_{m_i\in M}\sum_{k_i\in K}\frac{P(E_{k_i}(m_i)=c)}{|M|\times |K|}\tag{2.4} P(B)=P(c=Ek(m))=mi∈M∑ki∈K∑∣M∣×∣K∣P(Eki(mi)=c)(2.4)
∑ m i ∈ M ∑ k i ∈ K P ( E k i ( m i ) = c ) \sum_{m_i\in M}\sum_{k_i\in K}P(E_{k_i}(m_i)=c) ∑mi∈M∑ki∈KP(Eki(mi)=c)表示了所有可能生成密文 c c c的明文-密钥对(注意不仅仅只有一个明文-密钥对),而 ∣ M ∣ × ∣ K ∣ |M|\times |K| ∣M∣×∣K∣表示明文-密钥对总空间大小。注意到对于特定的明文 m m m和密文 c c c,进行加密时有且仅有一个密钥可以使得 E k ( m ) = c E_k(m)=c Ek(m)=c,因此有:
∑ k i ∈ K P ( E k i ( m ) = c ) = 1 (2.5) \sum_{k_i\in K}P(E_{k_i}(m)=c)=1\tag{2.5} ki∈K∑P(Eki(m)=c)=1(2.5)
这个式子说明用所有密钥对特定明文 m m m进行加密得到 c c c的概率之和,由于有且仅有一个密钥使之成立,故这是一个必然事件。那么就有
∑ m i ∈ M ∑ k i ∈ K P ( E k i ( m i ) = c ) = ∣ M ∣ (2.6) \sum_{m_i\in M}\sum_{k_i\in K}P(E_{k_i}(m_i)=c)=|M|\tag{2.6} mi∈M∑ki∈K∑P(Eki(mi)=c)=∣M∣(2.6)
用一个例子来说明 ( 2.6 ) (2.6) (2.6)式,回忆一下 26 26 26个字母的单字母表密码,明文 a ∼ z a\sim z a∼z被密钥加密为 z z z的情况有哪些呢?
- 当 k = 25 k=25 k=25时,明文 a a a被加密成密文 z z z
- 当 k = 24 k=24 k=24时,明文 b b b被加密成密文 z z z
- …
- 当 k = 0 k=0 k=0时,明文 z z z被加密成密文 z z z( k = 0 k=0 k=0时虽然没有实际意义,但理论上可能)
因此共有 26 26 26种可能,即为明文空间的大小,也就是说对于任何明文 m i m_i mi,只要密钥合适,那么就可以加密为 c c c。
因此结合 ( 2.4 ) (2.4) (2.4)和 ( 2.6 ) (2.6) (2.6)式有:
P ( B ) = P ( c = E k ( m ) ) = 1 K (2.7) P(B)=P(c=E_k(m))=\frac{1}{K}\tag{2.7} P(B)=P(c=Ek(m))=K1(2.7)
而对于事件 A A A和事件 B B B同时发生的概率有:
P ( A B ) = P ( m ∗ = m ∩ c = E k ( m ) ) = P ( m ∗ = m ) × P ( k ∗ = k ) = 1 ∣ M ∣ × ∣ K ∣ (2.8) P(AB)=P(m^*=m\cap c=E_k(m))=P(m^*=m)\times P(k^*=k)=\frac{1}{|M|\times |K|}\tag{2.8} P(AB)=P(m∗=m∩c=Ek(m))=P(m∗=m)×P(k∗=k)=∣M∣×∣K∣1(2.8)
( 2.8 ) (2.8) (2.8)式说明既猜对明文 m m m,又保证该明文可以加密成密文 c c c的概率等于同时猜对明文和密钥的概率,这是显然的。因此综合 ( 2.7 ) (2.7) (2.7)和 ( 2.8 ) (2.8) (2.8)式有:
P ( A ∣ B ) = P ( m ∗ = m , c = E k ( m ) ) P ( c = E k ( m ) ) = 1 ∣ K ∣ ÷ 1 ∣ M ∣ × ∣ K ∣ = 1 M (2.9) P(A|B)=\frac{P(m^*=m,c=E_k(m))}{P(c=E_k(m))}=\frac{1}{|K|}\div \frac{1}{|M|\times |K|}=\frac{1}{M}\tag{2.9} P(A∣B)=P(c=Ek(m))P(m∗=m,c=Ek(m))=∣K∣1÷∣M∣×∣K∣1=M1(2.9)
综上所述,一次一密是无条件安全的。不幸的是,Shannon很快证明了无条件安全的密码一定是不实际的,下面先用数学语言描述这个特性,之后再说明一次一密为什么不实际。
- 密码系统的不实际性:任何明文空间为 M M M,密钥空间为 K K K的密码系统,若 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣,那么该密码系统是不实际的
不实际的密码系统
可能读者对于 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣时,密码系统是不实际的这一观点存在疑问。下面作出通俗的解释,可能不太准确,但可以理清这一疑问。如果有一个密码系统要求每次加密解密都用不同的密钥,那么每次都需要传输一个密钥过去,而密钥传输必须要求有安全信道,暂且不论密钥长度,就光每次通信前都要交换密钥这一点就并不实际,毕竟如果需要这样的话,倒不如压缩一下明文的长度,然后用安全信道传输该明文。
尽管一次一密要求 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣,但需要证明任何无条件安全的密码系统都要求 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣,下面用反证法证明:假设有一个无条件安全的密码系统,该密码系统有 ∣ K ∣ < ∣ M ∣ |K|<|M| ∣K∣<∣M∣。
从该密码系统中的密文空间 C C C中取出一个密文 c 0 c_0 c0,而且令 P ( c 0 = E k ( m ) ) > 0 P(c_0=E_k(m))>0 P(c0=Ek(m))>0,也即有明文-密钥对对应该密文。对于对称密码而言,一定满足 D k ( E k ( m ) ) = m D_k(E_k(m))=m Dk(Ek(m))=m,这是显然的,由此令 M 0 = ⋃ k ∈ K D k ( c 0 ) M_0=\bigcup_{k\in K}{D_k(c_0)} M0=⋃k∈KDk(c0),那么可以推出 ∣ M 0 ∣ ≤ ∣ K ∣ < ∣ M ∣ |M_0|\le|K|<|M| ∣M0∣≤∣K∣<∣M∣,故至少存在一个明文 m ∗ ∈ M m^*\in M m∗∈M使得 m ∗ ∉ M 0 m^*\notin M_0 m∗∈/M0,由此推出一个矛盾:
- m ∗ ∈ M m^*\in M m∗∈M,由于无条件安全的密码系统都满足明文和密文是独立的,故 P ( m = m ∗ ∣ c = E k ( m ) ) = P ( m = m ∗ ) ≠ 0 P(m=m^*|c=E_k(m))=P(m=m^*)\ne 0 P(m=m∗∣c=Ek(m))=P(m=m∗)=0,即明文空间的所有明文都能被加密,并存在对应于该明文的密文
- m ∗ ∉ M 0 m^*\notin M_0 m∗∈/M0,故没有任何密文与明文 m ∗ m^* m∗对应,故 P ( m = m ∗ ) = 0 P(m=m^*)=0 P(m=m∗)=0
通俗地说就是明文空间 M M M中的任一个明文加密后形成密文,然后所有的这些密文解密后形成的明文空间 M 0 M_0 M0应满足 M = M 0 M=M_0 M=M0,否则就会出现矛盾。因此可以得到下面的结论:
- 当一个密码系统中的明文和密文是相互独立的,那么该密码系统是无条件安全的
- 当一个密码系统的明文空间和密文空间满足 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣,则该密码系统是不实际的
- 任何无条件密码都是不实际的,因为无条件密码系统中都蕴含着 ∣ K ∣ ≥ ∣ M ∣ |K|\ge|M| ∣K∣≥∣M∣
2.2 置换技术
与代替技术不同,置换技术是对密文字符进行置换,即打乱排列关系,比如明文是password,那么将其置换后为SWRODAPS,该加密过程的密钥就是置换本身。
置换技术的密钥表示
正如上例所示,明文是password,置换后产生的密文是SWRODAPS,那么如何用置换运算表示该情况呢?可以进行下面的操作:
- 将明文按位置顺序编号为 1 ∼ 8 1\sim 8 1∼8,那么 1 1 1代表 p p p…
- 密钥即为置换后的密文编号 ( 3 , 5 , 7 , 6 , 8 , 2 , 1 , 4 ) (3,5,7,6,8,2,1,4) (3,5,7,6,8,2,1,4)(或者 ( 4 , 5 , 7 , 6 , 8 , 2 , 1 , 3 ) (4,5,7,6,8,2,1,3) (4,5,7,6,8,2,1,3)),第一个 3 3 3表示用明文中的第3位放在第一个位子,依次类推最后形成密文
置换技术中置换得到的密文始终保持了与明文字符完全相同的频率分布,因此单纯的置换技术是很容易破解的。不过可以使用多重置换技术和乘积密码技术在一定程度上减轻攻击:
- 多重置换技术:对明文进行多次的置换运算进行加密
- 乘积密码技术:交替地使用代替技术和置换技术进行加密
乘积密码技术非常好理解,但可能对于多重置换带来的效果有些疑问,毕竟它并没有改变频率分布,在这里需要阐述一下频率攻击为什么有效:
- 对于代替密码,显然通过频率分析可以推测出用以代替明文的密文字符是什么
- 对于置换密码,频率分析会发现明文和密文的频率分布是完全相同的,这一点并不能解决问题,但是在英文中某些多字母音节词(比如叠词ee、前缀im、后缀tion等)的使用显然是频繁的,对于上面的密文SWRODAPS,经过频率分析可以推测两个S在明文中是相邻的(尽管可能不正确,但对于大量的密文这样的分析是有效的),然后依据这种特性可以破解密码
通过多重置换技术,可以进一步打乱密文的排列结构,比如明文经过密钥 ( 3 , 5 , 7 , 6 , 8 , 2 , 1 , 4 ) (3,5,7,6,8,2,1,4) (3,5,7,6,8,2,1,4)加密得到密文1:SWRODAPS,然后用相同的密钥 ( 3 , 5 , 7 , 6 , 8 , 2 , 1 , 4 ) (3,5,7,6,8,2,1,4) (3,5,7,6,8,2,1,4)加密密文1:SWRODAPS可以得到密文2:RDPASWSO。不过聪明的读者很快就会发现这样的多重置换实际上是没有意义的,因为执行两次置换 ( 3 , 5 , 7 , 6 , 8 , 2 , 1 , 4 ) (3,5,7,6,8,2,1,4) (3,5,7,6,8,2,1,4)相当于执行一次置换 ( 7 , 8 , 1 , 2 , 4 , 5 , 3 , 6 ) (7,8,1,2,4,5,3,6) (7,8,1,2,4,5,3,6),因此多重置换并不能解决问题,最主要的原因是该变换是线性的,即输出值是输入值的线性函数。
2.3 小结
看起来,代替技术和置换技术十分相似,不过两者还是具有很大的区别:代替技术不保证明文空间和密文空间的组成相一致,而置换技术不会改变明文空间的组成。也就是说,代替技术可以用任一个字符代替明文字符,而置换技术只能用明文字符的另一个字符代替该明文字符。
经过上面的讨论,对于单纯的代替技术和置换技术而言,通过穷举密钥空间、频率分析、选择明文攻击等手段都是可以破解的,而被证明是无条件安全的一次一密又被证明为是不实际的,因此在之后的密码系统中并不会单一地使用代替技术和置换技术,而是结合两者的优点进行密码设计。