文章目录
- Symmetric Cipher Model
- Substitution Techniques
- Caesar Cipher
- Monoalphabetic Ciphers
- Playfair Cipher
- Hill Cipher
- Polyalphabetic Cipher
- Vigenere Cipher
- Vernam Cipher
- One-Time Pad
- References
对称加密,也被称为传统加密、单钥加密或私钥加密,是 20 世纪 70 年代公钥加密发展之前唯一使用的加密类型。到目前为止,它仍然是两种加密类型中使用最广泛的一种。
原始消息叫做明文(plaintext),加密过后的消息则为密文(ciphertext)。从明文到密文的过程就是加密(enciphering, encryption)过程,相应的,从密文到明文的过程就是解密(deciphering, decryption)过程。众多的加密算法就构成了所谓的密码术(cryptography),而在不知道加密信息的情况下尝试对密文进行解密的一系列算法则形成了所谓的密码分析(cryptanalysis)。密码术和密码分析都属于密码学(cryptology)的范畴。
Symmetric Cipher Model
一个简化的加密算法模型如下图所示:
它主要由 5 个部分组成:明文、加密算法、密钥(密钥也是加密算法的输入,它是一个独立于明文和算法的值。不同的密钥会使加密算法输出不同的密文)、密文以及解密算法。在对称加密的使用上,我们有两点要求:
- 我们需要一个强大的加密算法。至少,我们希望该算法是这样的:知道该算法并能接触到一个或多个密文的攻击者也无法破译密文或找出密钥。这一要求通常以更严格的形式表述:即使攻击者掌握了一些密文以及产生每个密文对应的的明文,也应该无法解密密文或发现钥匙。
- 发送方和接收方必须以安全的方式获得秘钥的副本,并且必须保证秘钥的安全。如果有人能发现密钥并知道加密算法,所有使用该密钥的通信都可以说是一览无余。
我们认为,在知道密文以及加密算法的情况下,也难以破译整个系统。这意味着加密算法可以向外界公开,且降低了大量成本,这也是为什么对称加密被大量使用的原因。
下面我们以数学形式再进一步了解一下对称加密的过程。
现在假设信息源产生了某个消息
X
=
[
X
1
,
X
2
,
…
,
X
M
]
X=[X_1, X_2, \dots, X_M]
X=[X1,X2,…,XM],其中的
M
M
M 个元素为字母表中的字母。传统上字母表包含的是 26 个大写字母,而现在我们则直接使用二进制的字母表,即 {0, 1}。在收端,或者某个第三方,会产生密钥
K
=
[
K
1
,
K
2
,
…
,
K
J
]
K=[K_1, K_2, \dots, K_J]
K=[K1,K2,…,KJ]。有了明文和密钥,加密算法就可以进行加密,输出密文
Y
=
[
Y
1
,
Y
2
,
…
,
Y
N
]
Y=[Y_1, Y_2, \dots, Y_N]
Y=[Y1,Y2,…,YN],这个过程可以写为
Y
=
E
(
K
,
X
)
Y=E(K, X)
Y=E(K,X)
而在收端,则会使用解密算法来还原出明文:
X
=
D
(
K
,
Y
)
X=D(K, Y)
X=D(K,Y)
密码术的三个独立设计领域:
- 用于将明文转换为密文的操作类型。所有的加密算法都基于两个一般原则:替换(substitution),即把明文中的每个元素(比特、字母、比特组或字符串)映射成另一个元素;以及换位(transposition),即把明文中的元素重新排列。基本要求是不丢失任何信息(即,所有操作都是可逆的)。通常我们可能会混合使用这两种策略。
- 密钥的数量。收端发端使用相同的密钥,则为对称加密;使用不同的密钥,则为非对称加密或者公钥加密。
- 明文的处理方式。分组密码(block cipher)将明文消息编码表示后的数字序列,划分成长度为 n 的组,每组分别在密钥的控制下变换成等长的输出数字序列。流密码(stream cipher)利用密钥产生一个密钥流 Z=Z1Z2Z3…,然后利用此密钥流依次对明文 X=X0X1X2… 进行加密。
通常情况下,攻击加密系统的目的是恢复出使用中的密钥,而不是简单地恢复单个密文的明文。攻击传统加密算法的一般方法有两种:
- 密码分析:密码分析攻击依靠的是算法的性质,也许还有一些关于明文的一般特征的知识,甚至是一些明文-密码对样本。这种类型的攻击利用了算法的特点,试图推断出特定的明文或推断出正在使用的密钥。
- 暴力破解:攻击者在一段密文上尝试各种可能的密钥,直到获得看起来可理解、合理的明文。平均而言,必须尝试所有可能的密钥的一半才能获得成功。
下图总结了一些基于某些已知信息来进行密码分析攻击的类型:
如果一个加密方案产生的密文不包含足够的信息来唯一地确定相应的明文,无论有多少密码文本,该方案都是无条件安全(unconditionally secure)的。也就是说,无论攻击者耗费多少时间,都不可能解出密文,因为所需的信息不包含在其中。除了一种被称为一次性密钥(one-time pad)的方案外,没有任何加密算法是无条件安全的。因此,加密算法的用户所能争取的是一种满足以下一个或两个标准的算法:
- 破解密码的成本超过了被加密信息的价值;
- 破解密码所需的时间超过了信息的有效时间。
如果满足这两个标准中的任何一个,就可以说一个加密算法是计算安全(computationally secure)的。所有的密码分析都基于一个假设,那就是密文中任然包含明文的一些蛛丝马迹(结构、模式),可以经过分析辨别出来。
Substitution Techniques
替换技术是指明文的字母被其他字母或数字或符号所替换。如果明文被看作是一个比特序列,那么替换就是用密文的比特模式来替换明文的比特模式。
Caesar Cipher
最早的,也是最简单的,使用替代密码的是凯撒。凯撒密码将每个字母替换为字母表中再往下三位的字母。举例来说
plain:meet me after the toga party
cipher:PHHW PH DIWHU WKH WRJD SDUWB
所有的对应关系为:
plain: a b c d e f g h i j k l m n o p q r s t u v w x y z
cipher:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
我们为每个字母分配一个对应的数字:
然后凯撒密码就可以如下表达:
对于每个明文中的字母
p
p
p,替换它的密文字母
C
C
C 为
C
=
E
(
3
,
p
)
=
(
p
+
3
)
m
o
d
26
C=E(3, p)=(p+3)\ {\rm mod}\ 26
C=E(3,p)=(p+3) mod 26
一个通用的扩展形式(延后 k 位)则为:
C
=
E
(
k
,
p
)
=
(
p
+
k
)
m
o
d
26
1
≤
k
≤
25
C=E(k, p)=(p+k)\ {\rm mod}\ 26 \quad 1\le k \leq 25
C=E(k,p)=(p+k) mod 261≤k≤25
对应的解密算法则为
p
=
D
(
k
,
C
)
=
(
C
−
k
)
m
o
d
26
1
≤
k
≤
25
p=D(k, C)=(C-k)\ {\rm mod}\ 26 \quad 1\le k \leq 25
p=D(k,C)=(C−k) mod 261≤k≤25
凯撒密码使用暴力法就十分容易破解,因为加密、解密算法都已知,且总共可能的密钥数量也只有 25 个。
Monoalphabetic Ciphers
由于只有 25 个可能的密钥,凯撒密码远远谈不上安全。通过允许任意的替换,可以实现密钥空间的大幅增加。即我们可以考虑排列(permutation)。如果一个集合为
S
=
{
a
,
b
,
c
}
S=\{a, b, c\}
S={a,b,c},那么所有可能的排列情况为
a
b
c
a
c
b
b
a
c
b
c
a
c
a
b
c
b
a
abc\ acb\ bac\ bca\ cab\ cba
abc acb bac bca cab cba
一般的,如果集合有 n n n 个元素,那么总共的排列数则为 n ! n! n!. 因此如果我们依旧考虑英语字母表,意味着我们会有 26 ! 26! 26! 个可能的密钥!这绝对是暴力法难以破解的。这种方法被称为单字母替换密码。但通过密码分析,该方案依旧有可能被破解。
例如,我们有如下密文:
UZQSOVUOHXMOPVGPOZPEVSGZWSZOPFPESXUDBMETSXAIZ
VUEPHZHMDZSHZOWSFPAPPDTSVPQUZWYMXUZUHSX
EPYEPOPDZSZUFPOMBZWPFUPZHMDJUDTMOHMQ
如果密文足够长,我们可以计算每个字母出现的频率,与已知的英文字母出现频率进行对照,从而得出对应关系。这个密文比较短,但我们还是试一试。
密文的字母出现频率(%):
经过大量统计得出的英文字母出现频率为
按照这个规则,密文中的 P, Z 可能对应明文中的 e, t,而出现频率较高的 S, U, O, M, H 则可能对应 {a, h, i, n, o, r, s}。而出现频率最低的 A, B, G, Y, I, J 则可能对应 {b, j, k, q, v, x, z}。接下来要做的就是试和猜了,看看上面的一些对应关系是否能帮助我们得出合理的明文。
一种更有效的映射规则为,我们检测字母两两组合的频率。通常出现最多的组合就应该是 th
了,而在我们的密文中,ZW
出现 3 次,所有很有可能就对应着 th
。如果我们再假设 P 就对应着 e,那么密文中出现的 ZWP
就正好对应着 the
!
在密文第一行中,我们还有 ZWSP
,按照我们现在的映射规则,它为 th_t
,所以根据上面的频率对应关系以及猜测,S 就应该对应着 a。
就目前为止,我们已经可以将密文翻译为
将这个分析过程进行下去,我们可能会得出完整的明文:
单字母密码也很容易被破解,因为它们反映了原始字母的频率数据。
在替换密码中,有两种主要的方法用来减少明文结构在密文中的存留程度。我们简要介绍一下这两种方法。
Playfair Cipher
波雷费密码(Playfair Cipher)采用双字母替换的方法,它基于一个 5×5 矩阵,选取一个英文字作密钥,除去重复出现的字母,将密钥的字母逐个逐个加入 5×5 的矩阵内,剩下的空间将未加入的英文字母依 a-z 的顺序加入(I 和 J 视作同一字母)。将要加密的讯息分成两个一组,波雷费密码会根据以下规则进行加密(假设使用 monarchy
作为 key,矩阵如下图):
- 若组内的字母相同,将某个填充字母(如 x)加到该组的第一个字母后,重新分组。若剩下一个字,也加入填充字。例如,
balloon
会变为ba lx lo on
- 在每组中,找出两个字母在矩阵中的地方:
- 若两个字母在矩阵同一行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。例如,
ar
会变为RM
- 若两个字母在矩阵同一列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)。例如,
mu
会变为CM
- 否则,每个字母都会被位于其自己的行和另一个字母所占的列中的字母所取代。例如,
hs
会变为BP
,ea
会变为IM
或者JM
- 若两个字母在矩阵同一行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)。例如,
Hill Cipher
每个字母当作 26 进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个 n×n 的矩阵(key)相乘,再将得出的结果 mod 26. 例如,如果我们每次替换三个字母:
写成向量形式则为
C
=
P
K
m
o
d
26
\boldsymbol{C}=\boldsymbol{P}\boldsymbol{K}\ {\rm mod}\ 26
C=PK mod 26
我们来看一个具体例子,对于明文 paymoremoney
以及密钥
我们每次取 3 个明文字母,pay
对应的 26 进制数字为 15, 0, 24
,即
P
=
(
15
0
24
)
\boldsymbol{P}=(15\ 0\ 24)
P=(15 0 24),结果为
C
=
(
15
0
24
)
K
=
(
303
303
531
)
m
o
d
26
=
(
17
17
11
)
=
R
R
L
\boldsymbol{C}=(15\ 0\ 24)\boldsymbol{K}=(303\ 303\ 531)\ {\rm mod}\ 26=(17\ 17\ 11)={\rm RRL}
C=(15 0 24)K=(303 303 531) mod 26=(17 17 11)=RRL
解码时,我们需要计算 K \boldsymbol{K} K 的逆矩阵 K − 1 \boldsymbol{K}^{-1} K−1:
然后通过
P
=
C
K
−
1
m
o
d
26
\boldsymbol{P}=\boldsymbol{C}\boldsymbol{K}^{-1}\ {\rm mod}\ 26
P=CK−1 mod 26 我们就可以解出对应的明文。
Polyalphabetic Cipher
提升单字母替换性能的另外一种方式则为,随着明文信息的推进使用不同的单字母密码。这一类方法都被称为 Polyalphabetic Cipher。它们都有如下的共同特征:
- 会使用一系列相关的单字母替换规则;
- key 来决定这次转换使用哪一个具体规则。
Vigenere Cipher
Vigenere Cipher 是最著名且最简单的 Polyalphabetic Cipher 之一。在该机制中,相关的单字母替换规则集由 26 个移位为 0 至 25 的凯撒密码组成。每个密码都由一个密钥字母表示,它是替代明文字母 a 的密文字母。因此,移位为 3 的凯撒密码由密钥值 3 (字母 d) 表示。我们可以用以下方式来表述 Vigenere Cipher:
假设我们有一串明文字母 P = p 0 , p 1 , … , p n − 1 P=p_0, p_1, \dots, p_{n-1} P=p0,p1,…,pn−1 以及一串密钥字母 K = k 0 , k 1 , … , k m − 1 K=k_0, k_1, \dots, k_{m-1} K=k0,k1,…,km−1,通常 m < n m<n m<n。
对应的密文字母
C
=
C
0
,
C
1
,
…
,
C
n
−
1
C=C_0, C_1, \dots, C_{n-1}
C=C0,C1,…,Cn−1 如下计算:
C
=
E
(
K
,
P
)
=
(
p
0
+
k
0
)
m
o
d
26
,
(
p
1
+
k
1
)
m
o
d
26
,
…
,
(
p
m
−
1
+
k
m
−
1
)
m
o
d
26
,
(
p
m
+
k
0
)
m
o
d
26
,
(
p
m
+
1
+
k
1
)
m
o
d
26
,
…
,
(
p
2
m
−
1
+
k
m
−
1
)
m
o
d
26
,
…
\begin{aligned} C=E(K, P)= & (p_0+k_0)\ {\rm mod}\ 26, (p_1+k_1)\ {\rm mod}\ 26,\dots, (p_{m-1}+k_{m-1})\ {\rm mod}\ 26, \\ &(p_m+k_0)\ {\rm mod}\ 26, (p_{m+1}+k_1)\ {\rm mod}\ 26,\dots, (p_{2m-1}+k_{m-1})\ {\rm mod}\ 26, \dots \end{aligned}
C=E(K,P)=(p0+k0) mod 26,(p1+k1) mod 26,…,(pm−1+km−1) mod 26,(pm+k0) mod 26,(pm+1+k1) mod 26,…,(p2m−1+km−1) mod 26,…
即,密钥的第一个字母与明文的第一个字母相加,模 26,第二个字母对应字母相加,模 26,以此类推,直到得出密文的前 m 个字母。对接下来的 m 个字母,密钥字母会从 k 0 k_0 k0 开始重新循环。这个过程一直重复下去,直到所有明文字母被转换。
简洁写法,每个密文字母的计算公式:
C
i
=
(
p
i
+
k
i
m
o
d
m
)
m
o
d
26
C_i=(p_i + k_{i\ {\rm mod}\ m})\ {\rm mod}\ 26
Ci=(pi+ki mod m) mod 26
看一个具体例子:
转换为数值形式就一目了然了:
这种密码的优势在于,每个明文字母都会对应着多个密文字母,因此,字母频率信息被掩盖了。然而,并非所有关于明文结构的知识都会丢失。例如在上图中,阴影部分的 3 个密文字母显然重复了,由此我们可以推断出密钥字母的长度可能为 9,也可能是 3(3 的倍数,但肯定小于 26~).
接下来我们介绍一些破解 Vigenere Cipher 的方法,它们之中涵盖了一些密码分析的常规操作。
首先,我们假设攻击者认为加密算法是单字母替换或者 Vigenere Cipher。单字母替换可以通过一个简单的测试来进行判断:密文字母的统计特性应该与明文字母的统计特性相同。
对于 Vigenere Cipher,我们首先可以判断出密钥的长度,就像上图中的示例一样,我们发现了重复的密文字母组合。这是由于两个相同的明文序列正好间隔密钥长度整数倍造成的。当然也有可能是偶然情况。但是如果观察的密文序列足够长,那么是可以捕捉到一些有用信息的。
假如现在我们已经推断出密钥长度为
m
m
m,即 Vigenere Cipher 总共有
m
m
m 种单字母替换规则。例如对于密钥 DECEPTIVE
,位置 1、10、19… 的明文字母都会被同样的密钥字母加密(某种单字母替换),所以我们可以根据之前讲的频率估算来破解每一种单字母替换方法。
为了密码密钥的周期性特征,我们可以使用非重复的密钥。Vigenere Cipher 提出了所谓的 autokey 系统,某个密钥后面会跟着明文串:
但这样也做不到绝对安全。统计手段还能搞!如 e 被 e 加密的概率为 0.12 7 2 ≈ 0.016 0.127^2 \approx 0.016 0.1272≈0.016 …
Vernam Cipher
直接使用一个和明文一样长且统计独立的密钥。但这个系统是在二进制数字层面允许的,而不是字母,因此,密文的产生是通过明文与密钥进行或运算:
c
i
=
p
i
⊕
k
i
c_i=p_i\oplus k_i
ci=pi⊕ki
Vernam Cipher 的核心是密钥的生成。本质上,Vernam Cipher 还是会使用一个重复的密钥,但该密钥的长度非常长。尽管 Vernam Cipher 给密码分析带来了很大麻烦,但只要有足够的密码文本,使用已知的或可能的明文序列,或两者兼而有之,还是可以破解它。
One-Time Pad
Vernam Cipher 的改进,使用和消息长度一样的随机密钥。且该密钥只会使用一次,每个新消息都会生成对应长度的随机密钥,这是不可破解的!因为最终的密文并不包含任何明文的统计特征。但世界不会这么美好,一次性密钥的实际应用有两大困难:
- 制作大量的随机密钥。任何大量使用的系统都可能经常需要数以百万计的随机字符。提供如此大量的真正随机字符是一项艰巨的任务;
- 更为艰巨的是密钥的分配和保护问题。对于每一个要发送的信息,发送方和接收方都需要一个相同长度的随机密钥。该怎么进行分配以及保护呢?
由于这些困难,一次性密钥的作用有限,主要用于需要非常高安全性的低带宽信道。
References
Cryptography and Network Security: Principles and Practice, 7th Edition, ISBN 978-0-13-444428-4, by William Stallings, published by Pearson Education.