古典密码
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加密后的。