本篇接上
多表加密密码
playfair
本密码也是一种简单的替换密码
简单原理:1、选取一串英文字母作为密钥除去重复字母后,按顺序排入5*5的矩阵中,剩余空位将未加入的A-Z顺位填入,(Q去除,I,J视为相同);
2、明文两两一组,若相同则在该组第一个字母后加入X后重新分组,单剩余一个也加X
3、若字母不同行不同列,则找出两个字母与这两个字母组成矩形(第一个字母对应行优先);若同行,则选右方字母;如同列,则选下方字母
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
将密钥进行填充使其长度与明文长度一样。
明文 c o m e g r e a t w a l l
密钥 c r y p t o c r y p t o c
其次,查表得密文:efkt zferrltzn
破解:大部分多表密码的破译都是以字母频率为基础的,而在维吉尼亚密码中,一个字母可以被加密成不同的密文,所以简单的频率分析无法采用,关键在于它的密钥是循环重复的。 如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的凯撒密码,而其中每一个都可以单独破解。关于密码的长度,我们可以 使用卡西斯基试验和弗里德曼试验来获取。
卡西斯基试验是基于类似 the 这样的常用单词有可能被同样的密钥字母进行加密,从而在密文中重复出现。
如密钥DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD
其中,两个 DYDUXRMH 的出现相隔了 18 个字母。因此,可以假定密钥的长度是 18 的约数,即长度为 18、9、6、3 或 2。而两个 NQD 则相距 20 个字母,意味着密钥长度应为 20、10、5、4 或 2。取两者的交集,则可以基本确定密钥长度为 2。
Nihilist
又称关键字密码,明文 + 关键字 = 密文,类似 Polybius 密码,新建一个 5 × 5 矩阵M
参照矩阵 M 进行解密,可以看出,密文的特征有如下几点(密文就是在矩阵中的位置):
纯数字;只包含 1 到 5;密文长度偶数。
Hill
希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在 Z n 26必须是可逆的,否则就不可能解码。只有矩阵的行列式和 26 互质,才是可逆的。
AutokeyCipher
自动密钥密码也是多表替换密码,与维吉尼亚密码密码类似,但使用不同的方法生成密钥。通常来说它要比维吉尼亚密码更安全。自动密钥密码主要有两种,关键词自动密钥密码和原文自动密钥密码。