Bugku-不可破译的密码[wp]
一 题目分析
flag.txt

cipher.txt

(1)密码表形式和维吉尼亚密码一样
(2)看到504Q0304 很容易想到 504B0304 Zip文件头。
二 解题步骤
2.1 解密密文
根据分析(2)得知和压缩包有关,查看Q对应的明文,观察是否为B。

列对应的是明文,行是密钥。即 明文B + 密钥A -> 密文Q
该密码表和原维吉尼亚密码相比,映射的关系有所差别,所以考虑使用一个新的解密规则将cipher.txt文件中的字母解密出来替换掉。脚本如下:
from string import ascii_uppercase as uppercase
from itertools import cycle # 创建密码表
table = dict()
dictories=[['P', 'Q', 'L', 'N', 'E', 'Y', 'O', 'D', 'H', 'R', 'J', 'M', 'B', 'K', 'C', 'T', 'F', 'U', 'A', 'Z', 'S', 'X', 'I', 'W', 'V', 'G'],
['H', 'R', 'V', 'K', 'E', 'I', 'Y', 'B', 'J', 'G', 'M', 'Q', 'P', 'C', 'X', 'D', 'F', 'N', 'Z', 'T', 'U', 'O', 'L', 'A', 'W', 'S'],
['S', 'N', 'U', 'K', 'R', 'T', 'P', 'B', 'O', 'E', 'X', 'G', 'A', 'V', 'Z', 'Q', 'D', 'J', 'H', 'W', 'C', 'Y', 'I', 'M', 'L', 'F'],
['J', 'T', 'K', 'Q', 'V', 'F', 'L', 'X', 'D', 'Z', 'W', 'U', 'O', 'A', 'M', 'I', 'E', 'B', 'Y', 'G', 'P', 'R', 'S', 'H', 'C', 'N'],
['J', 'Z', 'B', 'L', 'E', 'P', 'K', 'G', 'N', 'O', 'A', 'C', 'R', 'U', 'I', 'S', 'D', 'M', 'F', 'V', 'X', 'H', 'Q', 'T', 'W', 'Y'],
['X', 'F', 'Y', 'Q', 'W', 'G', 'I', 'R', 'V', 'S', 'O', 'C', 'L', 'E', 'J', 'T', 'B', 'M', 'K', 'U', 'P', 'Z', 'A', 'N', 'H', 'D'],
['U', 'P', 'L', 'A', 'Y', 'T', 'Q', 'K', 'F', 'M', 'O', 'Z', 'I', 'G', 'S', 'H', 'J', 'B', 'E', 'N', 'X', 'R', 'W', 'D', 'V', 'C'],
['U', 'F', 'C', 'Q', 'P', 'A', 'I', 'W', 'R', 'Y', 'G', 'H', 'T', 'Z', 'V', 'B', 'K', 'S', 'J', 'O', 'M', 'X', 'D', 'N', 'L', 'E'],
['S', 'Q', 'A', 'T', 'P', 'R', 'N', 'X', 'Y', 'L', 'H', 'B', 'W', 'Z', 'F', 'U', 'O', 'K', 'E', 'C', 'G', 'V', 'I', 'M', 'J', 'D'],
['R', 'L', 'M', 'P', 'Z', 'Y', 'T', 'H', 'F', 'U', 'A', 'S', 'J', 'N', 'I', 'K', 'G', 'V', 'X', 'Q', 'B', 'E', 'W', 'C', 'D', 'O'],
['Y', 'U', 'I', 'K', 'S', 'Z', 'W', 'A', 'R', 'T', 'J', 'E', 'Q', 'C', 'P', 'M', 'L', 'D', 'H', 'B', 'G', 'O', 'N', 'V', 'X', 'F'],
['Q', 'W', 'J', 'S', 'T', 'K', 'R', 'P', 'B', 'O', 'V', 'U', 'L', 'N', 'H', 'F', 'X', 'D', 'G', 'A', 'M', 'Z', 'I', 'E', 'Y', 'C'],
['X', 'G', 'H', 'Y', 'Q', 'W', 'R', 'Z', 'K', 'M', 'P', 'N', 'E', 'V', 'L', 'C', 'D', 'U', 'J', 'F', 'T', 'S', 'I', 'A', 'O', 'B'],
['G', 'A', 'P', 'S', 'M', 'B', 'E', 'W', 'N', 'X', 'R', 'I', 'L', 'Y', 'C', 'F', 'O', 'K', 'Z', 'T', 'D', 'V', 'U', 'J', 'H', 'Q'],
['G', 'N', 'B', 'Z', 'Q', 'Y', 'U', 'R', 'C', 'H', 'L', 'V', 'E', 'A', 'I', 'O', 'M', 'F', 'P', 'X', 'W', 'S', 'K', 'T', 'D', 'J'],
['D', 'B', 'G', 'U', 'N', 'A', 'S', 'Q', 'F', 'R', 'E', 'Y', 'L', 'O', 'T', 'I', 'J', 'P', 'K', 'C', 'Z', 'X', 'H', 'M', 'W', 'V'],
['Z', 'V', 'S', 'X', 'C', 'G', 'J', 'Q', 'O', 'H', 'A', 'W', 'R', 'N', 'M', 'L', 'U', 'T', 'Y', 'P', 'D', 'K', 'I', 'B', 'F', 'E'],
['E', 'X', 'R', 'F', 'M', 'Y', 'W', 'L', 'P', 'H', 'C', 'N', 'B', 'J', 'Z', 'S', 'G', 'D', 'I', 'O', 'Q', 'V', 'U', 'A', 'T', 'K'],
['V', 'Q', 'M', 'K', 'A', 'X', 'R', 'S', 'Z', 'E', 'B', 'H', 'I', 'O', 'D', 'L', 'Y', 'T', 'N', 'C', 'G', 'F', 'J', 'W', 'U', 'P'],
['R', 'G', 'Y', 'D', 'F', 'A', 'J', 'L', 'B', 'V', 'K', 'P', 'H', 'Z', 'Q', 'S', 'O', 'X', 'E', 'C', 'T', 'M', 'U', 'N', 'W', 'I'],
['P', 'W', 'B', 'X', 'H', 'Q', 'E', 'J', 'I', 'G', 'A', 'D', 'S', 'F', 'O', 'U', 'T', 'V', 'C', 'Z', 'N', 'M', 'Y', 'K', 'L', 'R'],
['S', 'P', 'E', 'F', 'Q', 'N', 'R', 'X', 'U', 'D', 'M', 'Y', 'I', 'A', 'V', 'H', 'B', 'T', 'C', 'G', 'K', 'L', 'O', 'J', 'Z', 'W'],
['O', 'F', 'E', 'X', 'L', 'J', 'Z', 'I', 'B', 'G', 'Q', 'R', 'N', 'D', 'K', 'M', 'Y', 'S', 'P', 'V', 'A', 'T', 'C', 'W', 'H', 'U'],
['H', 'S', 'J', 'E', 'Q', 'L', 'I', 'R', 'N', 'O', 'C', 'F', 'V', 'T', 'B', 'G', 'Z', 'Y', 'D', 'A', 'W', 'U', 'P', 'M', 'K', 'X'],
['I', 'S', 'B', 'U', 'Z', 'R', 'L', 'V', 'Q', 'C', 'Y', 'E', 'K', 'P', 'J', 'G', 'F', 'T', 'W', 'O', 'A', 'H', 'X', 'D', 'M', 'N'],
['M', 'X', 'D', 'E', 'W', 'L', 'R', 'Q', 'V', 'S', 'U', 'I', 'F', 'G', 'N', 'P', 'C', 'A', 'O', 'Z', 'H', 'K', 'T', 'Y', 'B', 'J']]
lines=[]
cnt=0
for d in dictories:
# print(d)
tmp =''
for c in d:
tmp +=c
lines.append(tmp)
cnt +=1
# print(lines)
for ch in uppercase:
index = uppercase.index(ch)
table[ch] = lines[index]
print(table)
# print(uppercase) # # 加密/解密
def encrypt(plainText, key):
result = []
# 创建cycle对象,支持密钥字母的循环使用
currentKey = cycle(key)
# print(currentKey)
for ch in plainText:
if 'A' <= ch <= 'Z':
index = uppercase.index(ch)
# 获取密钥字母
ck = next(currentKey)
# print('ck:',ck)
for i in range(26):
if ch == table[ck][i]:
result.append(uppercase[i])
else:
result.append(ch)
return ''.join(result)
# 解密
fp = open(r'C:\Users\PC\Desktop\ctf\cipher_text.txt','r')#密文文件
op = open(r'C:\Users\PC\Desktop\ctf\res1.txt','w') #输出文件
q=fp.read()
# print(q)
key = 'ABCDE'
op.write(encrypt(q,key))
op.close()
fp.close()
将解密后的文件写入16进制编辑器,得到resul.zip
2.2 解压zip

思路 :
- 1.直接ARCHPR爆破密码
- 2.crc32爆破
- 遗憾的是都不行,后来请教其他师傅得知是根据crc32爆破得到的内容组成新字典进行爆破~

python main.py -f result.zip#得到output.dic字典,再使用ARCHPR字典爆破即可.密码自行尝试就不贴了
2.3解密flag.txt

这个是base解密,网上找了个base循环解密脚本.
#-*- coding:utf-8 -*-
import base64 s=''
with open(r'C:\Users\PC\Desktop\ctf\flag1.txt', 'r', encoding='UTF-8') as f: #输入文件
s="".join(f.readlines()).encode('utf-8')
src=s
while True:
try:
src=s
s=base64.b16decode(s)
str(s,'utf-8')
continue
except:
pass
try:
src=s
s=base64.b32decode(s)
str(s,'utf-8')
continue
except:
pass
try:
src=s
s=base64.b64decode(s)
str(s,'utf-8')
continue
except:
pass
break
with open(r'C:\Users\PC\Desktop\ctf\flag2.txt','w', encoding='utf-8') as file: #输出文件
file.write(str(src,'utf-8'))
print("ok!")
得到flag2.txt


拿到flag!!![]()
Bugku-不可破译的密码[wp]的更多相关文章
- bugku 密码学一些题的wp
---恢复内容开始--- 1.滴答滴 摩斯密码,http://tool.bugku.com/mosi/ 2.聪明的小羊 从提示猜是栅栏密码,http://tool.bugku.com/jiemi/ 3 ...
- ctf古典密码从0到
本文首发于“合天智汇”公众号 作者:淡灬看夏丶恋雨 古典密码和现代密码的区别: 代换密码 单表代换密码 字符或数学型 凯撒密码 仿射密码 四方密码 培根密码 图表 标准银河字母 圣堂武士密码 猪圈密码 ...
- 长理ACM 7-密码破译(闫博钊)
/* //题目标题: *密码破译(闫博钊) //题目描述: *某组织欲破获一个外星人的密码,密码由一定长度的字串组成.此组织拥有一些破译此密码的长度不同的钥匙,若两个钥匙的长度之和恰好为此密码的长度, ...
- BUUCTF 部分wp
目录 Buuctf crypto 0x01传感器 提示是曼联,猜测为曼彻斯特密码 wp:https://www.xmsec.cc/manchester-encode/ cipher: 55555555 ...
- 实验吧-杂项-你知道他是谁吗?(转盘密码、NTFS数据流检测及导出)
刚看到的时候听懵,没注意到重点,其实很多时候题目中的细节就是给我们线索的,所以审题和思考是很重要的. 在没做到点上的是,也做了一点努力,没有效果,科普一下这个人((*^▽^*))图片上是托马斯.杰斐逊 ...
- buu misc 1-32 wp
buuCTFwp(1~32) 1.签到题 题里就有flag flag{buu_ctf} 2.二维码 1.题目是一个二维码,用010发现提示四位数字,想到应该是暗藏压缩包 2.虚拟机foremost分离 ...
- 前端学HTTP之摘要认证
前面的话 上一篇介绍的基本认证便捷灵活,但极不安全.用户名和密码都是以明文形式传送的,也没有采取任何措施防止对报文的篡改.安全使用基本认证的唯一方式就是将其与SSL配合使用 摘要认证与基本认证兼容,但 ...
- NOIP2009潜伏者【B003】
[B003]潜伏者[难度B]—————————————————————————————————————————————————————————————————— [题目要求] R国和S国正陷入战火之中 ...
- 《CODE》读后笔记——第14~20章
14.反馈与触发器 振荡器不需要人的干涉即可自主且不断地实现断开和闭合.所有计算机都靠某种振荡器来使其他部件同步工作. 当两个开关都断开时,电路有两个稳定状态,这样的一个电路称为触发器.触发器具有记忆 ...
- AC日记——潜伏着 openjudge 1.7 11
11:潜伏者 总时间限制: 1000ms 内存限制: 65536kB 描述 R国和S国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动. 历经艰险后,潜伏于S国的R国间谍小C终于摸清了S国军 ...
随机推荐
- C++Day09 深拷贝、写时复制(cow)、短字符串优化
一.std::string 的底层实现 1.深拷贝 1 class String{ 2 public: 3 String(const String &rhs):m_pstr(new char[ ...
- 让你的手,不再抽筋,速度:修改mac的快捷键,以及鼠标滑动
我是资深️windows系统爱好者️ 最近开始尝试使用MAC系统进行代码运行测试,从配置环境,到写博客,一天按下了n次的复制粘贴快捷键, 妈耶,感觉要抽筋了 呜呜--- 这简直无法忍,我决定修改这个快 ...
- C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面
在医学影像领域中,将三维重建中的人体组织展开平铺至二维,用来研判病灶和制定治疗方案的重要手段之一, 它能够将立体曲面所包含的信息更为直观的展示到二维平面上,常用的情景包括: 牙床全景图.平铺血管.骨骼 ...
- KingbaseES函数三态
理解函数的三态1 VOLATILE: volatile函数没有限制,可以修改数据(如执行delete,insert,update), 使用同样的参数调用可能返回不同的值. STABLE: 不允许修改数 ...
- Task记录2.ContinueWith 延续任务,等待上一个任务执行完毕
Task.Run(() => {for (int i = 0; i < 20; i++) { Console.WriteLine(i); } } }).ContinueWith(NewTa ...
- Feign远程调用 (介绍与使用)
Feign远程调用 Feign是代替RestTemplate进行远程调用的组件,避免了RestTemplate手写复杂的url容易出错的问题,并提高代码的可读性 使用Feign步骤 1)引入依赖 哪个 ...
- spring-cloud06---Hystrix01简介
转:https://segmentfault.com/a/1190000005988895 # 1.服务雪崩介绍## 1.1基本概念分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, ...
- OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析
OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中 guided 调度方式的实现原理.这个调度方式其实和 dy ...
- Redis(安装、启动、测试、环境)
Redis 概述: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数 ...
- Fiegn 声明式接口调用
五:Fiegn 声明式接口调用 什么是Fiegn Netfix,Fiegn 是一个提供模板式的Web Service客户端,使用Fiegn 可以简化Web Service 客户端的编写,开发者可以通过 ...