古典密码学
密码学(Cryptography)大致可分为古典密码学(Classic cryptography)和现代密码学(Modern cryptography),两者的主要差别在于计算机的使用,一般来说,古典密码学是基于字符的,而现代密码学是基于二进制位的。古典密码学主要包括两类,即代换和置换。
代换
代换密码是将明文中的字符替代成其他字符,即替代转换,若整个加密过程中每个字符采用同一张表替代,则为单表代换密码,类似的,若整个加密过程中每个字符采用不同的表替代,则为多表代换密码,典型的单表代换密码有凯撒密码、培根密码等,多表代换密码有维吉尼亚密码等。
凯撒密码
凯撒密码(Caesar cipher)就是将明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量为 3 时,所有的字母 A 将被替换成 D,B 变成 E,以此类推。
明文 Hello World
的加密过程如下:
- 取偏移量为 3
- 计算
H
的后 3 位为K
- 以此类推
- 密文为:
Khoor Zruog
类似的,解密过程如下:
- 计算
K
的前 3 位为H
- 以此类推
- 明文为:
Hello World
注意:当偏移量为 13 时,这种凯撒密码的特例又被称为 ROT13(回转 13 位)加密,ROT13 加密是一种对等加密(Reciprocal cipher),对等加密是对称加密的一个特例,即该类密码的加密算法是它自己本身的逆反函数,换言之,要对其解密,只需对其密文再次套用加密算法即可。当偏移量未知时,可采用穷举法一个个试,偏移量必定小于 26。
培根密码
培根密码(Bacon's cipher)加密时,明文中的每个字母都会转换成一组 5 个英文字母。其转换依靠下表:
明文 | 密文 | 明文 | 密文 | 明文 | 密文 | 明文 | 密文 |
---|---|---|---|---|---|---|---|
a | AAAAA | g | AABBA | n | ABBAA | t | BAABA |
b | AAAAB | h | AABBB | o | ABBAB | u-v | BAABB |
c | AAABA | i-j | ABAAA | p | ABBBA | w | BABAA |
d | AAABB | k | ABAAB | q | ABBBB | x | BABAB |
e | AABAA | l | ABABA | r | BAAAA | y | BABBA |
f | AABAB | m | ABABB | s | BAAAB | z | BABBB |
按照上表,明文 hello
的密文为 AABBBAABAAABABBABABBABBBA
,显然,密文的长度是明文长度的 5 倍。
除了上表用来加密小写明文外,还有一张用来加密大写明文的表,如下:
明文 | 密文 | 明文 | 密文 | 明文 | 密文 | 明文 | 密文 | 明文 | 密文 |
---|---|---|---|---|---|---|---|---|---|
A | aaaaa | G | aabba | M | abbaa | S | baaba | Y | bbaaa |
B | aaaab | H | aabbb | N | abbab | T | baabb | Z | bbaab |
C | aaaba | I | abaaa | O | abbba | U | babaa | ||
D | aaabb | J | abaab | P | abbbb | V | babab | ||
E | aabaa | K | ababa | Q | baaaa | W | babba | ||
F | aabab | L | ababb | R | baaab | X | babbb |
同理,明文 HELLO
的密文为 aabbbaabaaababbababbabbba
。
注意:虽然表中出现了 A
B
两种字符,但培根密码的本质是二进制,即用两种不同的特征来加密明文,可以是字母的大小写或字体的样式等等。例如采用字母的大小写加密 hello
为 GOod gOOd STUdY, dAY dAy UP, haHa
,其中大写代表 A
,小写代表 B
;类似的,也可以用粗体代表 A
,正常代表 B
,以字体的样式加密 hello
。显然,培根密码所包含的信息可以和用于承载其的文章完全无关。
维吉尼亚密码
维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,用来加解密的维吉尼亚表格如下所示:
这一表格包括了 26 行字母表,每一行都由前一行向左偏移 1 位得到。行为明文行,列为密钥列,密文位于表格内。
明文 HELLOWORLD
的加密结果如下:
- 选择某一关键词作为密钥,如
SECRET
- 对于明文第 1 个字母
H
,对应密钥的第 1 个字母S
,于是使用表格中S
行字母表进行加密,得到密文第一个字母Z
- 以此类推,若密钥长度小于明文长度,则转到密钥第 1 个字母继续循环,最终得到密文
ZINCSPGVNU
类似的,解密过程如下:
- 根据密钥第 1 个字母
S
所对应的S
行字母表,发现密文第 1 个字母Z
位于H
列,因而明文第 1 个字母为H
- 依次类推
显而易见,维吉尼亚密码相对于本文介绍的其他古典密码,很难利用穷举法破解。
置换
置换密码是将明文中的字母重新排列,字母本身不变,但其位置改变,即位置转换,典型的有栅栏密码等。
栅栏密码
栅栏密码(Rail fence cipher),又称篱笆密码,就是把要加密的明文分成 n 个一组,然后把每组的第一个字连起来,紧接着把每组的第二个字连起来,以此类推,形成一段无规律的话。
明文 Hello World
的加密过程如下:
- 去掉空格:
HelloWorld
- 5 个一组:
Hello
,World
- 取出每组第 1 个字母:
HW
- 取出每组第 2 个字母:
eo
- 以此类推
- 连在一起:
HWeolrllod
- 加上适当空格:
HWeol rllod
类似的,解密过程如下:
- 去掉空格:
HWeolrllod
- 分成 5 栏:
HW
、eo
、lr
、ll
、od
- 取出每栏第 1 个字母:
Hello
- 依次类推
- 连在一起:
HelloWorld
- 加上适当空格:
Hello World
注意:这里栅栏的栏数取决于 n 的取值,一般而言,n 要整除字母数,n 不可能大于或等于字母数,当不知道 n 为多少时,可采用穷举法一个个试。
其他
当铺密码
准确来说,当铺密码不是一种加密方式而是一种编码方式,它是将中文和数字进行转化的算法,具体为:当前汉字有多少笔画出头,就转化成数字几。如 王夫 井工 夫口 由中人
即为 67 84 70 123
。
猪圈密码
猪圈密码(Pigpen cipher),又称共济会密码(Masonic cipher),是一种以格子为基础的简单代换式密码。下图为猪圈密码中所用符号与 26 个英语字母之间的对应关系:
明文 X MARKS THE SPOT
的加密结果如下:
变形
猪圈密码还有一种变形,即采用图片中字符位置一一对应的形式加解密,如 FLAG
可加密为 OCJP
。