古典密码
1.单表密码(仿射加密)
仿射加密变化是:y=ax+b
算法:
仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母。
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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
加密:
解码:
其中:
注:在公式中如果K=1 ,b=3则为凯撒密码
仿射加密要求gcd(k,26)=1,即k与26互素。故密钥空间为12X26=312
与26互素的k的12个取值:
K
K
−
1
1
1
3
9
5
21
7
15
9
3
11
19
15
7
17
23
19
11
21
5
23
17
25
25
\begin{array}{|c|c|} \hline K&K^-1\\ \hline 1&1\\ \hline 3&9\\ \hline 5&21\\ \hline 7&15\\ \hline 9&3\\ \hline 11&19\\ \hline 15&7\\ \hline 17&23\\ \hline 19&11\\ \hline 21&5\\ \hline 23&17\\ \hline 25&25\\ \hline \end{array}
K1357911151719212325K−11921153197231151725
例子:
设k=(7,3) 7的逆为15,加密函数是y=7x+3(mod26),相应的解密函数是x=15(y-3)(mod26)=15y-19(mod26)。
若要加密的明文:china,首先将字母c,h,i,n,a转化为数字2,7,8,13,0;然后加密;
7
×
∣
2
7
8
13
0
∣
+
∣
3
3
3
3
3
∣
=
∣
17
52
59
94
3
∣
m
o
d
26
=
∣
17
0
7
16
3
∣
=
∣
R
A
H
Q
D
∣
7\times \begin{vmatrix} 2 \\ 7\\ 8\\ 13\\ 0\\ \end{vmatrix}+ \begin{vmatrix} 3 \\ 3\\ 3\\ 3\\ 3\\ \end{vmatrix}=\begin{vmatrix} 17 \\ 52\\ 59\\ 94\\ 3\\ \end{vmatrix}mod26=\begin{vmatrix} 17 \\ 0\\ 7\\ 16\\ 3\\ \end{vmatrix}=\begin{vmatrix} R\\ A\\ H\\ Q\\ D\\ \end{vmatrix}
7×∣∣∣∣∣∣∣∣∣∣278130∣∣∣∣∣∣∣∣∣∣+∣∣∣∣∣∣∣∣∣∣33333∣∣∣∣∣∣∣∣∣∣=∣∣∣∣∣∣∣∣∣∣175259943∣∣∣∣∣∣∣∣∣∣mod26=∣∣∣∣∣∣∣∣∣∣1707163∣∣∣∣∣∣∣∣∣∣=∣∣∣∣∣∣∣∣∣∣RAHQD∣∣∣∣∣∣∣∣∣∣
即在当前密钥下,china经过仿射加密变化为RAHQD
解码:
15
×
∣
17
0
7
16
3
∣
−
∣
19
19
19
19
19
∣
=
∣
236
−
19
86
221
26
∣
m
o
d
26
=
∣
2
7
8
13
0
∣
=
∣
C
H
I
N
A
∣
15\times \begin{vmatrix} 17 \\ 0\\ 7\\ 16\\ 3\\ \end{vmatrix}- \begin{vmatrix} 19\\ 19\\ 19\\ 19\\ 19\\ \end{vmatrix}=\begin{vmatrix} 236 \\ -19\\ 86\\ 221\\ 26\\ \end{vmatrix}mod26=\begin{vmatrix} 2 \\ 7\\ 8\\ 13\\ 0\\ \end{vmatrix}=\begin{vmatrix} C\\ H\\ I\\ N\\ A\\ \end{vmatrix}
15×∣∣∣∣∣∣∣∣∣∣1707163∣∣∣∣∣∣∣∣∣∣−∣∣∣∣∣∣∣∣∣∣1919191919∣∣∣∣∣∣∣∣∣∣=∣∣∣∣∣∣∣∣∣∣236−198622126∣∣∣∣∣∣∣∣∣∣mod26=∣∣∣∣∣∣∣∣∣∣278130∣∣∣∣∣∣∣∣∣∣=∣∣∣∣∣∣∣∣∣∣CHINA∣∣∣∣∣∣∣∣∣∣
可见,原始消息china以及恢复
验证:
2.vigenere密码(维吉尼亚密码)
维吉尼亚密码是一种简单的多表代换密码。在这里,我们假设数字0-25代表按字母顺序排列的英语字母,即从a到z ,并且Key字符串的字母也以相同的方式考虑
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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
加密过程:
-
反复重复键串的字母(即密钥),直到其长度等于要加密的长度为止。
例如:
要 加 密 的 文 本 a b c d e f 密 钥 b c b c b c \begin{array}{|ccccccc|} \hline 要加密的文本&a&b&c&d&e&f\\ \hline 密钥&b&c&b&c&b&c\\ \hline \end{array} 要加密的文本密钥abbccbdcebfc -
因此加密算法为
解码过程:
- 算法为
例子:
要加密内容为 a b c d e f
密钥为b c
加密过程:
对应的加密文本与密钥
要
加
密
的
文
本
a
b
c
d
e
f
密
钥
b
c
b
c
b
c
\begin{array}{|ccccccc|} \hline 要加密的文本&a&b&c&d&e&f\\ \hline 密钥&b&c&b&c&b&c\\ \hline \end{array}
要加密的文本密钥abbccbdcebfc
c[a,b]=(a+b)mod26
=(0+1)mod26
=1
=b
加密后是:b d d f f h
解密过程:
要
解
密
的
密
文
b
d
d
f
f
h
密
钥
b
c
b
c
b
c
\begin{array}{|ccccccc|} \hline 要解密的密文&b&d&d&f&f&h\\ \hline 密钥&b&c&b&c&b&c\\ \hline \end{array}
要解密的密文密钥bbdcdbfcfbhc
p[b,b]=(b-b)mod26
=0mod26
=0
=a
验证:
3.playfair密码(普莱费尔密码)
Playfair加密算法是先将明文按两个字母一组进行分组,然后在矩阵中找对应的密文。
1.建立密钥
Playfair算法基于一个5*5的字母矩阵,该矩阵使用一个关键词构造,方法是按从左到右、从上到下顺序,填入关键词的字母(去除重复字母)后,将字母表其作余字母填入。
例如:
取密文的规则如下:
-
若明文出现相同字母在一组,则在重复的明文字母中插入一个填充字母(eg:X)进行分隔后重新分组(eg: balloon被重新分组为ba lX lo on)
-
若分组到最后一组时只有一个字母,则补充字母X
-
若明文字母在矩阵中同行,则循环取其右边下一个字母为密文(矩阵最右边的下一个是最左边的第一个)(eg: ar被加密为RM)
-
若明文字母在矩阵中同列,则循环取其下边下一个字母为密文(矩阵最下边的下一个是最上边的第一个)(eg: mu被加密为CM)
-
若明文字母在矩阵中不同行不同列,则取其同行且与同组另一字母同列的字母为密文(eg: hs被加密为BP,ea被加密为IM或JM)
例子:
明文为we are discovered save yourself,分组成为we ar ed is co ve re ds av ey ou rs el fz;
用上述矩阵加密后的密文为:UG RM KC SX HM UF MK BT OX GC MV AT LU KV
用软件后的结果:
解码规则:
-
若明文字母在矩阵中同行,则循环取其左边下一个字母为密文(矩阵最左边的下一个是最右边的最后一个)(eg: RM被解码为ar)
-
若明文字母在矩阵中同列,则循环取其上边上一个字母为密文(矩阵最上边的上一个是最下边的最后一个)(eg: CM被解码为mu)
-
若明文字母在矩阵中不同行不同列,则取其同行且与同组另一字母同列的字母为密文(eg: BP被解码为hs,IM或JM被解码为ea)
4.one-time pad 一次一密 (按位异或,支持中英文各类字符)
前面三种古典密码,他们共通的弱点都是语言中字母频率的不等,导致密钥加密后密文中字母出现概率依旧不等,从而发现突破口。导致可以出现泄露。
而一次性密码本,则是使用了与明文等长的密文,使得所有字母的使用概率相等,密文完全不揭示任何明文信息,使得任何唯密文攻击无效。
算法原理:
C:密文 E:加密操作 D:解密操作 m:明文 k:密钥
C = E( k, m) = k ⊕ m
D = ( k, c) = k ⊕ c
这里是base64加密后的。