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国军 ...
随机推荐
- P5683 [CSP-J2019 江西] 道路拆除
简要题意 给你一个 \(m\) 条边 \(n\) 个点的无向图.你需要去掉一些边,使得 \(1 \to s_1,1 \to s_2\) 连通,且 \(1 \to s_1\) 的最短路径长度小于 \(t ...
- [0]为什么是SpinalHDL-Spinal简介
[0]为什么是SpinalHDL-Spinal简介 1. verilog/VHDL打咩 稍微先说两句SpinalHDL,硬件描述语言(HDL)分为verilog/VHDL和其他(雾),不过确实是这样, ...
- 【Dubbo3终极特性】「流量治理体系」一文教你如何通过Dubbo-Admin实现动态进行流量隔离机制
背景信息 如果一个应用有多个版本在线上同时运行,部署在不同环境中,如日常环境和特殊环境,则 可以使用标签路由对不同环境中的不同版本进行流量隔离,将秒杀订单流量或不同渠道订单流量路由到特殊环境,将正常的 ...
- Bootstrap Blazor Viewer 图片浏览器 组件更新, 支持流转图片(ImageFromStream), 用于本地项目例如 MAUI Blazor,Blazor hybrid
示例: https://blazor.app1.es/viewer 使用方法: 1.nuget包 BootstrapBlazor.Viewer 2._Imports.razor 文件 或者页面添加 添 ...
- RAM算法原理
1 应用场景 信道的不对称性和信道的高波动是移动环境中无线信道的两个显著特征.因此,当在车辆网络等移动环境中使用IEEE 802.11设备时,有一个能够处理这些问题的有效速率自适应方案至关重要.RAM ...
- Mybatis的缓存与动态SQL
Mybatis的缓存 缓存也是为了减少java应用与数据库的交互次数,提升程序的效率 一级缓存 自带一级缓存,并且无法关闭,一直存在,存储在SqlSession中 使用同一个sqlsession进行查 ...
- h5与原生app通信的各种功能
import config from '@/config/index'; import cubeModule from '_public/CubeModule.json'; const _MIDEA_ ...
- RocketMQ - 消费者启动机制
RocketMQ客户端中有两个独立的消费者实现类:org.apache.rocketmq.client.consumer.DefaultMQPullConsumer 和 org.apache.rock ...
- ES6中的class对象和它的家人们
在ES6中新增了一个很重要的特性: class(类).作为一个在2015年就出了的特性, 相信很多小伙伴对class并不陌生.但是在日常开发中使用class的频率感觉并不高(可能仅限于作者),感觉对c ...
- webgl 系列 —— 初识 WebGL
初识 WebGL 什么是 WebGL webgl 在支持 canvas 的浏览器中进行 2d 或 3d 渲染. webgl 程序除了有 Html.javascript,还需要加入着色器语言(GLSL ...