一、前言
1. 多表古典密码分析
我们以Vigenere密码为例来说明多表古典密码的分析方法。确定密钥字长度的方法有Kasiski测试法(Kasiski Test)和重合指数法(index of coincidence).
2. Vigenere密码
- Vigenere(维吉尼亚)密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
- 凯撒密码:一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
二、Vigenere密码分析
1. Kasiski测试法
寻找密文中相同的片段对(一般长度大于三),计算每对相同密文片段对之间的距离,不妨记为 d 1 , d 2 , … , d i d_1,d_2,…,d_i d1,d2,…,di,若令密钥字的长度为 m m m,则 m = g c d ( d 1 , d 2 , … , d i ) m=gcd(d_1,d_2,…,d_i) m=gcd(d1,d2,…,di)
2. 重合指数法
设
X
=
x
1
x
2
…
x
n
X=x_1x_2…x_n
X=x1x2…xn是一个长度为n的英文字母串,则x中任意选取两个字母相同的概率定义为重合指数,用
I
c
(
x
)
I_c(x)
Ic(x) 表示。
设英文字母
A
,
B
,
…
,
Z
A,B,…,Z
A,B,…,Z在
X
X
X中出现的次数分别为:
f
0
,
f
1
,
…
,
f
25
f_0,f_1,…,f_{25}
f0,f1,…,f25则从
X
X
X中任意选取两个字母相同的概率为
I
c
(
X
)
=
∑
i
=
0
25
f
i
(
f
i
−
1
)
n
(
n
−
1
)
I_{c}(X)=\frac{\sum_{i=0}^{25} f_{i}\left(f_{i}-1\right)}{n(n-1)}
Ic(X)=n(n−1)∑i=025fi(fi−1)
下表为26个英文字母的出现频率:
已知每个英文字母出现的期望概率,分别记为
p
0
,
p
1
,
…
,
p
25
p_0,p_1,…,p_{25}
p0,p1,…,p25,那么X中两个元素相同的概率计算为
I
c
(
X
)
≈
∑
i
=
0
25
p
i
2
I_{c}(X) \approx \sum_{i=0}^{25} p_{i}^{2}
Ic(X)≈i=0∑25pi2
结果约等于 0.065,若是均匀分布,则值约等于0.038。
三、实际密码分析
1. 问题描述
设某一段明文经过
V
i
g
e
n
e
r
e
Vigenere
Vigenere密码加密后密文为
C
H
R
E
E
V
O
A
H
M
A
E
R
A
T
B
I
A
X
X
W
T
N
X
B
E
E
O
P
H
B
S
B
Q
M
Q
E
Q
E
R
B
W
CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
CHREEVOAHMAERATBIAXXWTNXBEEOPHBSBQMQEQERBW
R
V
X
U
O
A
K
X
A
O
S
X
X
W
E
A
H
B
W
G
J
M
M
Q
M
N
K
G
R
F
V
G
X
W
T
R
Z
X
W
I
A
K
RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
RVXUOAKXAOSXXWEAHBWGJMMQMNKGRFVGXWTRZXWIAK
L
X
F
P
S
K
A
U
T
E
M
N
D
C
M
G
T
S
X
M
X
B
T
U
I
A
D
N
G
M
G
P
S
R
E
L
X
N
J
E
L
X
LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
LXFPSKAUTEMNDCMGTSXMXBTUIADNGMGPSRELXNJELX
V
R
V
P
R
T
U
L
H
D
N
Q
W
T
W
D
T
Y
G
B
P
H
X
T
F
A
L
J
H
A
S
V
B
F
X
N
G
L
L
C
H
R
VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
VRVPRTULHDNQWTWDTYGBPHXTFALJHASVBFXNGLLCHR
Z
B
W
E
L
E
K
M
S
J
I
K
N
B
H
W
R
J
G
N
M
G
J
S
G
L
X
F
E
Y
P
H
A
G
N
R
B
I
E
Q
J
T
ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
ZBWELEKMSJIKNBHWRJGNMGJSGLXFEYPHAGNRBIEQJT
A
M
R
V
L
C
R
R
E
M
N
D
G
L
X
R
R
I
M
G
N
S
N
R
W
C
H
R
Q
H
A
E
Y
E
V
T
A
Q
E
B
B
I
AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
AMRVLCRREMNDGLXRRIMGNSNRWCHRQHAEYEVTAQEBBI
P
E
E
W
E
V
K
A
K
O
E
W
A
D
R
E
M
X
M
T
B
J
J
C
H
R
T
K
D
N
V
R
Z
C
H
R
C
L
Q
O
H
P
PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
PEEWEVKAKOEWADREMXMTBJJCHRTKDNVRZCHRCLQOHP
W
Q
A
I
I
W
X
N
R
M
G
W
O
I
I
F
K
E
E
WQAIIWXNRMGWOIIFKEE
WQAIIWXNRMGWOIIFKEE
通过两种分析方法计算出此密码的密钥。
2. 问题解决
1. 密文片段CHR一共出现了5次,每次开始位置分别为1,166,236,276,286,第一次出现到各次出现的距离
d
i
d_i
di分别为165,235,275,285,所以
m
=
g
c
d
(
165
,
235
,
275
,
285
)
=
5
m=gcd(165,235,275,285) = 5
m=gcd(165,235,275,285)=5
2. 根据Kasiski测试法得到的
m
v
mv
mv,可以将密文
Y
v
Yv
Yv按照下列形式排列:
将
Y
Y
Y排列成
m
m
m行
n
/
m
n/m
n/m列的形式,形如:
k
1
y
1
y
m
+
1
⋯
y
n
−
m
+
1
k
2
y
2
y
m
+
2
⋯
y
n
−
m
+
2
k
3
y
3
y
m
+
3
⋯
y
n
−
m
+
3
⋮
⋮
⋮
⋮
⋮
k
m
y
m
y
2
m
⋯
y
n
\begin{array}{ccccc} k_{1} & y_{1} & y_{m+1} & \cdots & y_{n-m+1} \\ k_{2} & y_{2} & y_{m+2} & \cdots & y_{n-m+2} \\ k_{3} & y_{3} & y_{m+3} & \cdots & y_{n-m+3} \\ \vdots & \vdots & \vdots & \vdots & \vdots \\ k_{m} & y_{m} & y_{2 m} & \cdots & y_{n} \end{array}
k1k2k3⋮kmy1y2y3⋮ymym+1ym+2ym+3⋮y2m⋯⋯⋯⋮⋯yn−m+1yn−m+2yn−m+3⋮yn
设f0,f1,…,f25分别表示串yi中英文字母A,B,…,Z出现的次数,令n’=n/m表示串yi的长度,则26个英文字母在yi的概率分布为:
f
0
n
,
f
1
n
,
f
2
n
,
…
…
.
.
f
25
n
\frac{f_{0}}{n}, \frac{f_{1}}{n}, \frac{f_{2}}{n}, \ldots \ldots . . \frac{f_{25}}{n}
nf0,nf1,nf2,……..nf25
考虑到
V
i
g
e
n
e
r
e
Vigenere
Vigenere密码子串
y
i
y_i
yi是有对应的明文子集中的字母移动
K
i
K_i
Ki个位置所得,因此,移动后的概率分布为:
f
k
i
n
′
,
f
1
+
k
i
n
′
,
f
2
+
k
i
n
′
,
…
…
…
,
f
25
+
k
i
n
′
\frac{f_{k i}}{n^{\prime}}, \frac{f_{1+k i}}{n^{\prime}}, \frac{f_{2+k i}}{n^{\prime}}, \ldots \ldots \ldots, \frac{f_{25+k i}}{n^{\prime}}
n′fki,n′f1+ki,n′f2+ki,………,n′f25+ki
M g = ∑ i = 0 25 p i f i + g n ′ M_{g}=\sum_{i=0}^{25} \frac{p_{i} f_{i+g}}{n^{\prime}} Mg=i=0∑25n′pifi+g
每一行计算每一种字母的 M g M_g Mg值( g g g代表0-25即 a − z a-z a−z),若 g g g对应的 M g M_g Mg 值与0.065接近,那么 g g g则为密钥
四、编程
1. 代码
2. 运行结果
程序比较简单,但是代码比较长,我只把结果贴出来比对一下: