古典密码学

密码学(Cryptography)大致可分为古典密码学(Classic cryptography)和现代密码学(Modern cryptography),两者的主要差别在于计算机的使用,一般来说,古典密码学是基于字符的,而现代密码学是基于二进制位的。古典密码学主要包括两类,即代换置换

代换

代换密码是将明文中的字符替代成其他字符,即替代转换,若整个加密过程中每个字符采用同一张表替代,则为单表代换密码,类似的,若整个加密过程中每个字符采用不同的表替代,则为多表代换密码,典型的单表代换密码有凯撒密码、培根密码等,多表代换密码有维吉尼亚密码等。

凯撒密码

凯撒密码(Caesar cipher)就是将明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量为 3 时,所有的字母 A 将被替换成 D,B 变成 E,以此类推。

明文 Hello World 的加密过程如下:

  1. 取偏移量为 3
  2. 计算 H 的后 3 位为 K
  3. 以此类推
  4. 密文为:Khoor Zruog

类似的,解密过程如下:

  1. 计算 K 的前 3 位为 H
  2. 以此类推
  3. 明文为: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 两种字符,但培根密码的本质是二进制,即用两种不同的特征来加密明文,可以是字母的大小写或字体的样式等等。例如采用字母的大小写加密 helloGOod gOOd STUdY, dAY dAy UP, haHa,其中大写代表 A,小写代表 B;类似的,也可以用粗体代表 A,正常代表 B,以字体的样式加密 hello。显然,培根密码所包含的信息可以和用于承载其的文章完全无关。

维吉尼亚密码

维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,用来加解密的维吉尼亚表格如下所示:

维吉尼亚表格

这一表格包括了 26 行字母表,每一行都由前一行向左偏移 1 位得到。行为明文行,列为密钥列,密文位于表格内。

明文 HELLOWORLD 的加密结果如下:

  1. 选择某一关键词作为密钥,如 SECRET
  2. 对于明文第 1 个字母 H,对应密钥的第 1 个字母 S,于是使用表格中 S行字母表进行加密,得到密文第一个字母 Z
  3. 以此类推,若密钥长度小于明文长度,则转到密钥第 1 个字母继续循环,最终得到密文 ZINCSPGVNU

类似的,解密过程如下:

  1. 根据密钥第 1 个字母 S 所对应的 S 行字母表,发现密文第 1 个字母 Z 位于 H 列,因而明文第 1 个字母为 H
  2. 依次类推

显而易见,维吉尼亚密码相对于本文介绍的其他古典密码,很难利用穷举法破解。

置换

置换密码是将明文中的字母重新排列,字母本身不变,但其位置改变,即位置转换,典型的有栅栏密码等。

栅栏密码

栅栏密码(Rail fence cipher),又称篱笆密码,就是把要加密的明文分成 n 个一组,然后把每组的第一个字连起来,紧接着把每组的第二个字连起来,以此类推,形成一段无规律的话。

明文 Hello World 的加密过程如下:

  1. 去掉空格:HelloWorld
  2. 5 个一组:HelloWorld
  3. 取出每组第 1 个字母:HW
  4. 取出每组第 2 个字母:eo
  5. 以此类推
  6. 连在一起:HWeolrllod
  7. 加上适当空格:HWeol rllod

类似的,解密过程如下:

  1. 去掉空格:HWeolrllod
  2. 分成 5 栏:HWeolrllod
  3. 取出每栏第 1 个字母:Hello
  4. 依次类推
  5. 连在一起:HelloWorld
  6. 加上适当空格:Hello World

注意:这里栅栏的栏数取决于 n 的取值,一般而言,n 要整除字母数,n 不可能大于或等于字母数,当不知道 n 为多少时,可采用穷举法一个个试。

其他

当铺密码

准确来说,当铺密码不是一种加密方式而是一种编码方式,它是将中文和数字进行转化的算法,具体为:当前汉字有多少笔画出头,就转化成数字几。如 王夫 井工 夫口 由中人 即为 67 84 70 123

猪圈密码

猪圈密码(Pigpen cipher),又称共济会密码(Masonic cipher),是一种以格子为基础的简单代换式密码。下图为猪圈密码中所用符号与 26 个英语字母之间的对应关系:

猪圈密码

明文 X MARKS THE SPOT 的加密结果如下:

猪圈密码例子

变形

猪圈密码还有一种变形,即采用图片中字符位置一一对应的形式加解密,如 FLAG 可加密为 OCJP