托马斯.杰斐逊-转轮密码-详解

目录

1、直接以例题进行解密详解

1、重新排列

2、循环

3、按列找flag

2、杰斐逊转轮密码背景知识


做题的时候碰到了这个密码算法,感觉还不错,顺便学习记录一下。

1、直接以例题进行解密详解

题目来自https://www.polarctf.com/#/page/challenges这个靶场

题目给出两个txt文件

一个txt中的信息为

BRUEIFYRGBEUNVUICRHFU
FYURGUAROINNIEURYVYRU
E3BYUGDUWRNYUTFSRDE5W
FURYGRUTGUTUNAWGDUIEB
UYGIGNGIHFYBFYURGFURB
TFRUBYFUVOVNERTWINDUE
HUGRURBIGGNSUITIMTQEI
GBUTNGUIJTINGIEGFURYU
TYVCTYSAIBYEIFWIRHUGF
TRTUBGUYTRGSONIUONRRI
6YMUYTNYTIUWABRWBTESS
BRUHGUFGTJNUBAFDEGTEF
DHYEUBFYEYFTYUEBFIUBA
CTBRTNUKMIWGRBEHSDDVC
RUEBFUIRGFRBVXUAVTYEF
YUGRTFBUKCZUIWEIHUEFB
FRVRUIYUFRLNRUYGQEBYE

另一个txt文件

这里有两串密码,来找找flag在哪吧
(听说阿拉伯数字全世界通用哦)

和谐民主和谐富强和谐民主和谐自由和谐富强和谐民主和谐自由和谐富强和谐文明和谐富强和谐民主和谐自由和谐富强和谐爱国和谐爱国和谐民主和谐富强和谐爱国
和谐爱国和谐自由和谐文明和谐民主和谐富强和谐民主和谐富强和谐爱国和谐爱国和谐自由和谐民主和谐富强和谐爱国和谐爱国和谐文明和谐富强和谐民主和谐富强和谐爱
国和谐爱国和谐自由和谐文明和谐富强和谐爱国和谐爱国和谐自由和谐文明和谐民主和谐富强和谐爱国和谐爱国和谐自由和谐文明和谐民主和谐富强和谐爱国和谐爱国和谐
自由和谐文明和谐民主和谐富强和谐爱国和谐爱国和谐自由和谐文明和谐民主和谐富强和谐爱国和谐爱国和谐自由和谐文明和谐民主

lqbehgfdajmopcikn

将找到的字符串进行md5加密后套上flag{}即可

这里需要进行社会价值观解密和云影解密,既然这里介绍的是转轮密码,就省去中间的解密步骤

直接得出转轮解密需要的所有解密要素,如下

密码本(这里添加了行号)
1-BRUEIFYRGBEUNVUICRHFU
2-FYURGUAROINNIEURYVYRU
3-E3BYUGDUWRNYUTFSRDE5W
4-FURYGRUTGUTUNAWGDUIEB
5-UYGIGNGIHFYBFYURGFURB
6-TFRUBYFUVOVNERTWINDUE
7-HUGRURBIGGNSUITIMTQEI
8-GBUTNGUIJTINGIEGFURYU
9-TYVCTYSAIBYEIFWIRHUGF
10-TRTUBGUYTRGSONIUONRRI
11-6YMUYTNYTIUWABRWBTESS
12-BRUHGUFGTJNUBAFDEGTEF
13-DHYEUBFYEYFTYUEBFIUBA
14-CTBRTNUKMIWGRBEHSDDVC
15-RUEBFUIRGFRBVXUAVTYEF
16-YUGRTFBUKCZUIWEIHUEFB
17-FRVRUIYUFRLNRUYGQEBYE

密钥
12,17,2,5,8,7,6,4,1,10,13,15,16,3, 9, 11,14
(1-2--3-4-5-6-7-8-9-10-11-12-13-14-15-16-17)
(对密钥的每个元素进行位置的对应)

密文
 A-E-E-B-E-Q-W-A-U--R-A--V--W--W--W--W--W
(1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17)
(对密文的每个元素进行位置的对应)

杰斐逊转轮密码中,密码本是一个n行m列的字符阵列,密钥是一个具有n个数字的数字组,密文是n长的字符串,解码本也是一个n行m列的字符阵列

这个题中n=17,m一般不关注

1、重新排列

根据密码本和密钥得到解码本

密钥组中第1个数字为12,意思是解码本中第1行的字符串是密码本中第12行的字符串,注意相同颜色的对应关系,得到解码本第1

解码本
1-BRUHGUFGTJNUBAFDEGTEF

到这里有没有一点点清晰,下面再来一行

密钥组中第2个数字为17,意思是解码本中第2行的字符串是密码本中第17行的字符串,得到解码本第2

解码本
1-BRUHGUFGTJNUBAFDEGTEF
2-FRVRUIYUFRLNRUYGQEBYE

再来一行

密钥组中第3个数字为2,意思是解码本中第3行的字符串是密码本中第2行的字符串,得到解码本第3

解码本
1-BRUHGUFGTJNUBAFDEGTEF
2-FRVRUIYUFRLNRUYGQEBYE
3-FYURGUAROINNIEURYVYRU

解码本后面的行与上面的步骤相同,最后得到重新排列好的解码本,如下

解码本
1-BRUHGUFGTJNUBAFDEGTEF
2-FRVRUIYUFRLNRUYGQEBYE
3-FYURGUAROINNIEURYVYRU
4-UYGIGNGIHFYBFYURGFURB
5-GBUTNGUIJTINGIEGFURYU
6-HUGRURBIGGNSUITIMTQEI
7-TFRUBYFUVOVNERTWINDUE
8-GBUTNGUIJTINGIEGFURYU
9-TYVCTYSAIBYEIFWIRHUGF
10-TRTUBGUYTRGSONIUONRRI
11-DHYEUBFYEYFTYUEBFIUBA
12-RUEBFUIRGFRBVXUAVTYEF
13-YUGRTFBUKCZUIWEIHUEFB
14-E3BYUGDUWRNYUTFSRDE5W
15-TYVCTYSAIBYEIFWIRHUGF
16-6YMUYTNYTIUWABRWBTESS
17-CTBRTNUKMIWGRBEHSDDVC

2、循环

根据上一步得到的解码本和密文,对解码本进行循环

密文
 A-E-E-B-E-Q-W-A-U--R-A--V--W--W--W--W--W
(1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17)
(对密文的每个元素进行位置的对应)

看到密文第1个字符为A,则对解码本的第1行,从左往右找到第一个A,将A作为第一个字符进行循环左移,画了一张图,将就看

 

得到循环后的第一行

循环后的解码本
1-AFDEGTEFBRUHGUFGTJNUB

密文第二个字符为E,到解码本第二行字符串,从左往右找到第一个E,进行循环左移,得到循环后的第二行

循环后的解码本
1-AFDEGTEFBRUHGUFGTJNUB
2-EBYEFRVRUIYUFRLNRUYGQ

后面的行按以上步骤进行,最后得到循环后的解码本

循环后的解码本
AFDEGTEFBRUHGUFGTJNUB
EBYEFRVRUIYUFRLNRUYGQ
EURYVYRUFYURGUAROINNI
BFYURGFURBUYGIGNGIHFY
EGFURYUGBUTNGUIJTINGI
QEIHUGRURBIGGNSUITIMT
WINDUETFRUBYFUVOVNERT
AWGDUIEBFURYGRUTGUTUN
UEIFYRGBEUNVUICRHFUBR
RTUBGUYTRGSONIUONRRIT
ADHYEUBFYEYFTYUEBFIUB
VXUAVTYEFRUEBFUIRGFRB
WEIHUEFBYUGRTFBUKCZUI
WRNYUTFSRDE5WE3BYUGDU
WIRHUGFTYVCTYSAIBYEIF
WABRWBTESS6YMUYTNYTIU
WGRBEHSDDVCCTBRTNUKMI

3、按列找flag

到这里基本解密结束,下面就是按查找解码本,可以看到从右往左第7列,找到flag

循环后的解码本
AFDEGTEFBRUHGU F GTJNUB
EBYEFRVRUIYUFR L NRUYGQ
EURYVYRUFYURGU A ROINNI
BFYURGFURBUYGI G NGIHFY
EGFURYUGBUTNGU I JTINGI
QEIHUGRURBIGGN S UITIMT
WINDUETFRUBYFU V OVNERT
AWGDUIEBFURYGR U TGUTUN
UEIFYRGBEUNVUI C RHFUBR
RTUBGUYTRGSONI U ONRRIT
ADHYEUBFYEYFTY U EBFIUB
VXUAVTYEFRUEBF U IRGFRB
WEIHUEFBYUGRTF B UKCZUI
WRNYUTFSRDE5WE 3 BYUGDU
WIRHUGFTYVCTYS A IBYEIF
WABRWBTESS6YMU Y TNYTIU
WGRBEHSDDVCCTB R TNUKMI

最终flag为flagisvucuuub3ayr,完结!!!

从网上找了大佬的解密脚本,进行了注释,供大家学习

import re
text = ""
code = [  # 密码本
"BRUEIFYRGBEUNVUICRHFU",
"FYURGUAROINNIEURYVYRU",
"E3BYUGDUWRNYUTFSRDE5W",
"FURYGRUTGUTUNAWGDUIEB",
"UYGIGNGIHFYBFYURGFURB",
"TFRUBYFUVOVNERTWINDUE",
"HUGRURBIGGNSUITIMTQEI",
"GBUTNGUIJTINGIEGFURYU",
"TYVCTYSAIBYEIFWIRHUGF",
"TRTUBGUYTRGSONIUONRRI",
"6YMUYTNYTIUWABRWBTESS",
"BRUHGUFGTJNUBAFDEGTEF",
"DHYEUBFYEYFTYUEBFIUBA",
"CTBRTNUKMIWGRBEHSDDVC",
"RUEBFUIRGFRBVXUAVTYEF",
"YUGRTFBUKCZUIWEIHUEFB",
"FRVRUIYUFRLNRUYGQEBYE"
]
print(code)
codetext = "AEEBEQWAURAVWWWWW"  # 密文
codenum = "12,17,2,5,8,7,6,4,1,10,13,15,16,3,9,11,14"  # 密钥
codenum = codenum.split(",")  # 把这些数字都放到一个列表里面去,以逗号隔开
#print(codenum)
a = 0
print("最终解码本:")
for i in codenum:
    index = code[int(i)-1].index(codetext[a])
    # code[int(i)-1]代表取出密钥对应的密码表中的字符串(对应重新排列),以解码本第一行为例,即取出密码本中的第12行字符串BRUHGUFGTJNUBAFDEGTEF
    # index(codetext[a])取出当前对应密文在取出的字符串中的下标(即先找到循环的下标),以解码本第一行为例,即密文中第一个字符A在上面一行取出的字符串中的下标,即13,从0开始

    a = a + 1  # 密文下标加一
    code[int(i)-1] = code[int(i)-1][index:] + code[int(i)-1][:index]  # 拼接得到最终的一行解码
    # code[int(i)-1][index:]是取出从密文对应的字符开始到最后的字符串,以解码本第一行为例,即取出AFDEGTEF
    # code[int(i)-1][:index]是取出从头到密文对应的字符的字符串,不包括密文对应的字符,以解码本第一行为例,即取出BRUHGUFGTJNUB
    print(code[int(i)-1])  # 此时输出的字符串是按解码本的顺序从第一行开始,但在code中存储的顺序是对应密钥内容的顺序

#完成了变形了

print("输出解码本每一列")
for i in range(len(code[0])):  # len(code[0])即一行的长度
      str=""
      print("第{}列的是:".format(i),end="")
      for j in codenum:
          str += code[int(j)-1][i]  # 因为变形后的解码本中的字符串是存储在密码本中,因此要按照密钥内容的顺序进行取出
      print(str.lower())

2、杰斐逊转轮密码背景知识

下面的链接文章介绍了关于杰斐逊转轮密码的相关背景,感兴趣的朋友可以看看

美国总统托马斯·杰弗逊与转轮加密器-推理罪-侦探推理门户网站

转载请标明出处!!!

参考文章

托马斯.杰斐逊 转轮密码_1: < zwaxjgdlubviqhkypntcrmosfe < 2: < kpbelnaczdt-CSDN博客

http://1o1o.xyz/CSDN/Bugku%20CTF%20%E5%8A%A0%E5%AF%86writeup%20%EF%BC%88%E6%9C%AA%E5%AE%8C%E5%BE%85%E7%BB%AD%EF%BC%89_KRDecad3%E7%9A%84%E5%8D%9A%E5%AE%A2.pdf

 

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值