古典密码学入门:几种常见古典密码的加密与解密方法
古典密码学入门:几种常见古典密码的加密与解密方法
古典密码学是密码学的基础,了解这些古老的加密方法不仅能帮助我们更好地理解现代密码学的原理,还能培养我们的逻辑思维能力。本文将介绍几种常见的古典密码及其解密方法。
多表加密密码
Playfair密码
Playfair密码是一种简单的替换密码,其加密过程如下:
- 选取一串英文字母作为密钥,去除重复字母后,按顺序排入5*5的矩阵中,剩余空位将未加入的A-Z顺位填入(Q去除,I,J视为相同);
- 明文两两一组,若相同则在该组第一个字母后加入X后重新分组,单剩余一个也加X;
- 若字母不同行不同列,则找出两个字母与这两个字母组成矩形(第一个字母对应行优先);若同行,则选右方字母;如同列,则选下方字母。
Poiybius密码(棋盘密码)
棋盘密码的密码表示例如下:
例题:
密文:ilnllliiikkninlekile
压缩包给了一行十六进制:546865206c656e677468206f66207468697320706c61696e746578743a203130
解密步骤:
- 十六进制转换得"The length of this plaintext: 10"
- 由密文可知密码表由i,l,n,k,e五个构成,可想到为棋盘密码
- 由于未知五个字母如何排序,可爆破
import itertools
key = []
cipher = "ilnllliiikkninlekile"
for i in itertools.permutations('ilnke', 5):
key.append(''.join(i))
for now_key in key:
solve_c = ""
res = ""
for now_c in cipher:
solve_c += str(now_key.index(now_c))
for i in range(0,len(solve_c),2):
now_ascii = int(solve_c[i])*5+int(solve_c[i+1])+97
if now_ascii>ord('i'):
now_ascii+=1
res += chr(now_ascii)
if "flag" in res:
print(now_key,res)
运行结果:linke flagishere
Vigenere密码(维吉尼亚密码)
维吉尼亚密码是由一系列凯撒密码组成,其加密过程如下:
- 明文:come greatwall
- 密钥:crypto
- 将密钥进行填充使其长度与明文长度一样
- 查表得密文:efkt zferrltzn
破解方法:大部分多表密码的破译都是以字母频率为基础的,而在维吉尼亚密码中,一个字母可以被加密成不同的密文,所以简单的频率分析无法采用,关键在于它的密钥是循环重复的。如果知道密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。关于密码的长度,可以使用卡西斯基试验和弗里德曼试验来获取。
卡西斯基试验是基于类似 the 这样的常用单词有可能被同样的密钥字母进行加密,从而在密文中重复出现。如密钥DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD,其中,两个 DYDUXRMH 的出现相隔了 18 个字母。因此,可以假定密钥的长度是 18 的约数,即长度为 18、9、6、3 或 2。而两个 NQD 则相距 20 个字母,意味着密钥长度应为 20、10、5、4 或 2。取两者的交集,则可以基本确定密钥长度为 2。
Nihilist密码(关键字密码)
Nihilist密码的加密过程类似于Polybius密码,需要新建一个5×5矩阵M。参照矩阵M进行解密时,可以看出密文的特征有如下几点(密文就是在矩阵中的位置):
- 纯数字
- 只包含1到5
- 密文长度为偶数
Hill密码
希尔密码使用每个字母在字母表中的顺序作为其对应的数字,即A=0,B=1,C=2等,然后将明文转化为n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。注意用作加密的矩阵(即密匙)在Zn26必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。
AutokeyCipher(自动密钥密码)
自动密钥密码也是多表替换密码,与维吉尼亚密码类似,但使用不同的方法生成密钥。通常来说它要比维吉尼亚密码更安全。自动密钥密码主要有两种,关键词自动密钥密码和原文自动密钥密码。