杰斐逊转轮加密器,这个装置由36片同样大小的木制转轮,套在一根杆上。每片转轮的圆周边缘上可有乱序的26个英文字母表。
通信双方必须各自拥有一套完全一样的转轮加密器。
加密方转动加密器上的转轮,是明文(不超过36字)正好出现在同一行上,这时转轮排列的其他25行都是无意义的乱码,把其中任意一行的乱码抄写来,得到密文。
接收方收到密文,转动加密器上的转轮,使得密文正好出现在同一行上,然后查看其他25行的内容,有意义的行就是明文。
杰斐逊加密器属于典型的“多表替换”加密(每一个转轮就相当于一个替换的字母表),他很难破解,除非能得到通信双方所使用的加密装置。
据称美国军队甚至到了20世纪60年代仍在使用它。这种加密器的缺点是每次只能传送简单的信息(字长不能超过转轮的片数),而且参与通信的各方不能太多。
例题:托马斯.杰斐逊(托马斯.杰斐逊 - Bugku CTF):
解密分析:
根据杰斐逊转轮,即我们找到密文所对应密钥的行(例:H第2行,C第5行...)并将密文全都转到第一个位置。
python代码实现如下:
# 仅保留每一行字母
a = '1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <'
print(a.index('Z'))
print(a.index('E'))
print(a[4:30])
txt = '''1: <ZWAXJGDLUBVIQHKYPNTCRMOSFE <
2: <KPBELNACZDTRXMJQOYHGVSFUWI <
3: <BDMAIZVRNSJUWFHTEQGYXPLOCK <
4: <RPLNDVHGFCUKTEBSXQYIZMJWAO <
5: <IHFRLABEUOTSGJVDKCPMNZQWXY <
6: <AMKGHIWPNYCJBFZDRUSLOQXVET <
7: <GWTHSPYBXIZULVKMRAFDCEONJQ <
8: <NOZUTWDCVRJLXKISEFAPMYGHBQ <
9: <QWATDSRFHENYVUBMCOIKZGJXPL <
10: <WABMCXPLTDSRJQZGOIKFHENYVU <
11: <XPLTDAOIKFZGHENYSRUBMCQWVJ <
12: <TDSWAYXPLVUBOIKZGJRFHENMCQ <
13: <BMCSRFHLTDENQWAOXPYVUIKZGJ <
14: <XPHKZGJTDSENYVUBMLAOIRFCQW <'''
x = []
lines = txt.strip().split('\n')
for line in lines:
x.append(line[4:31].strip().replace('<', ''))
print(x)
# 根据密文对应的密钥调整转表
key = '2,5,1,3,6,4,9,7,8,14,10,13,11,12'
key = key.split(',') # 转化为列表型
key = [int(i) for i in key] # 转化为数值型
print(key)
flag = []
mi = 'HCBTSXWCRQGLES'
for m, n in zip(key, mi):
flag.append(x[m - 1][x[m - 1].index(n):] + x[m - 1][:x[m - 1].index(n)])
print(flag)
for i in range(26):
for j in flag:
print(j[i],end='')
print()