杰斐逊转轮密码

   今天,在攻防世界做了一道密码题,需要用到杰斐逊转轮密码,特此记录一下。

   我们看一下原题

杰斐逊转轮密码原理:托马斯-杰弗逊转轮加密由三串字符串组成,第一部分为加密表,第二部分为密钥,第三部分为密文。加密表就是我们需要利用密钥和密文来进行加密,具体的过程如下: 首先查看密钥第一个字符为2,因此我们需要到加密表中去查找第2行的数据 2: < KPBELNACZDTRXMJQOYHGVSFUWI < 。再利用密文的第一个字符N进行旋转,N在这里的作用就是旋转过后的第一个字符即为N,在这里的旋转为循环(即字母z后面为a)。同理,对之后的秘钥进行相同操作。这里放上大佬写的脚本:

 1  -*- coding:utf-8 -*-
 2 import re
 3 text=""
 4 with open("wheelcipher.txt","r",encoding="utf-8") as f:
 5     text=f.read()
 6 #print (text) 查看是否读取完整
 7 code=[]#将字符提取出来放在这里
 8 code=re.findall(r"<(.*)<",text)
 9 for i in range(len(code)):
10     code[i]=code[i].strip()
11 print(code)
12 codetext="NFQKSEVOQOFNP"
13 codenum="2,3,7,5,13,12,9,1,8,10,4,11,6"
14 codenum=codenum.split(",")#把这些数字都弄到一个里面去
15 #print(codenum)
16 a=0
17 print("解密后的:")
18 for i in codenum:
19     index=code[int(i)-1].index(codetext[a])
20     a=a+1
21     code[int(i)-1]=code[int(i)-1][index:]+code[int(i)-1][:index]
22     print(code[int(i)-1])
23 
24 #完成了变形了
25 
26 print("下面是每一列的")
27 for i in range(len(code[0])):
28       str=""
29       print("第{}列的是:".format(i),end="")
30       for j in codenum:
31           str+=code[int(j)-1][i]
32       print(str.lower())
View Code

然后执行后为

其中每一列的意思是将解密后的所有行字母一列一列输出的,最后的难题就是flag在哪,我看了别人的解析,他们说是第17列的是,答案确实正确,但我没找到为什么,难道要一列一列试吗?望哪位大佬知道的话能够告知,万分感谢!

猜你喜欢

转载自www.cnblogs.com/zs0618/p/12312558.html