蓝帽杯2020-Misc-熟悉的解密

news/2024/11/16 7:28:59/文章来源:https://www.cnblogs.com/qihumuyang/p/18377298

蓝帽杯2020-MISC-熟悉的解密

前言

怎么说呢,我觉得对我一个不懂加解密算法的人来说,应该算是Crypto,不过对于专业人员来说可能TEA、AES、RSA、LCG这种应该都比较ez(like 编码?)

一、题目

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uDT==
Iy0qLSBjb2Rpbmc6IHV0Zi04IC0qLQ0=
aW1wb3J0IHN5cw3=
ZnJvbSBjdHlwZXMgaW1wb3J0ICoN
ZGVmIGVuY2lwaGVyKHYsIGspOg1=
ICAgIHkgPSBjX3VpbnQzMih2WzBdKQ2=
ICAgIHogPSBjX3VpbnQzMih2WzFdKQ0=
ICAgIHN1bSA9IGNfdWludDMyKDApDc==
ICAgIGRlbHRhID0gMHg5ZTM3NzliOQ3=
ICAgIG4gPSAzMg0=
ICAgIHcgPSBbMCwwXQ0=
ICAgIHdoaWxlKG4+MCk6DT==
ICAgICAgICBzdW0udmFsdWUgKz0gZGVsdGEN
ICAgICAgICB5LnZhbHVlICs9ICggei52YWx1ZSA8PCA0ICkgKyBrWzBdIF4gei52YWx1ZSArIHN1bS52YWx1ZSBeICggei52YWx1ZSA+PiA1ICkgKyBrWzFdDT==
ICAgICAgICB6LnZhbHVlICs9ICggeS52YWx1ZSA8PCA0ICkgKyBrWzJdIF4geS52YWx1ZSArIHN1bS52YWx1ZSBeICggeS52YWx1ZSA+PiA1ICkgKyBrWzNdDT==
ICAgICAgICBuIC09IDEN
ICAgIHdbMF0gPSB5LnZhbHVlDS==
ICAgIHdbMV0gPSB6LnZhbHVlDW==
ICAgIHJldHVybiB3DW==
ZGVmIGVuY29kZXN0cih0ZXh0LCBrZXkpOg1=
ICAgIGNpcGhlckxpc3QgPSBbXQ2=
ICAgIHRleHQgKz0gKDggLSBsZW4odGV4dCkgJSA4KSAqIGNocigwKQ0=
ICAgIGZvciBpIGluIHJhbmdlKGxlbih0ZXh0KS84KToN
ICAgICAgICB2MSA9IDAN
ICAgICAgICB2MiA9IDAN
ICAgICAgICBmb3IgaiBpbiByYW5nZSg0KToN
ICAgICAgICAgICAgdjErPSBvcmQodGV4dFtpKjgral0pIDw8ICg0LWotMSkqOA1=
ICAgICAgICAgICAgdjIrPSBvcmQodGV4dFtpKjgrais0XSkgPDwgKDQtai0xKSo4DT==
ICAgICAgICBjaXBoZXJMaXN0LmFwcGVuZChlbmNpcGhlcihbdjEsdjJdLGtleSkpDX==
ICAgIHJldHVybiBjaXBoZXJMaXN0DX==
Dd==
aWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoN
ICAgIGtleSA9IFsxMSwyMiwzMyw0NF0N
CWZsYWcgPSA/DQ==
ICAgIGNpcGhlciA9IGVuY29kZXN0cihmbGFnMSxrZXkpDQ==
CSNjaXBoZXIgPSBbWzQwMTgyODkyMzNMLCAyOTUwMzIwMTUxTF0sIFsxNzcxODI3NDc4TCwgNDkzOTgwODc2TF0sIFsxODYzMjg0ODc5TCwgMTEzNzc5NzU5OUxdLCBbMjc1OTcwMTUyNUwsIDM5NTc4ODUwNTVMXSwgWzI2MDA4NjY4MDVMLCA3ODg1MDcyNExdXQ0=

二、解题

1、解码

看着base,上cyberchef

base64成功,python源码

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
from ctypes import *
def encipher(v, k):y = c_uint32(v[0])z = c_uint32(v[1])sum = c_uint32(0)delta = 0x9e3779b9n = 32w = [0,0]while(n>0):sum.value += deltay.value += ( z.value << 4 ) + k[0] ^ z.value + sum.value ^ ( z.value >> 5 ) + k[1]z.value += ( y.value << 4 ) + k[2] ^ y.value + sum.value ^ ( y.value >> 5 ) + k[3]n -= 1w[0] = y.valuew[1] = z.valuereturn w
def encodestr(text, key):cipherList = []text += (8 - len(text) % 8) * chr(0)for i in range(len(text)/8):v1 = 0v2 = 0for j in range(4):v1+= ord(text[i*8+j]) << (4-j-1)*8v2+= ord(text[i*8+j+4]) << (4-j-1)*8cipherList.append(encipher([v1,v2],key))return cipherListif __name__ == "__main__":key = [11,22,33,44]flag = ?  #"flag{57735e0c-6d02-11ea-8072-040e3c032fa7}" 放这里了,后面调试才看懂cipher = encodestr(flag1,key)#cipher = [[4018289233L, 2950320151L], [1771827478L, 493980876L], [1863284879L, 1137797599L], [2759701525L, 3957885055L], [2600866805L, 78850724L]]

2、加密解析

可以看到加密算法内外两层,将 flag 和 key 进行 encipher() 和 encodestr() 双重加密得到五组由两个整数组成的列表

(1)内层encipher()

TEA算法,主要依托黄金分割delta = 0x9e3779b9进行32层加密,每次加密key是(33-n)*delta这种(直到不满足n>0)

(2)外层encodestr()

将每次计算的一组数分别通过移位运算按照每8位进行分组排列拆分转换为字符

3、解密思路

(1)内层encipher()

TEA算法解密较为简单,整体算法结构基本不变

①将初始sum改为32*delta0xc6ef3720,循环处理方式改为递减

② [y,z]两组数改为迭减,计算顺序反向先计算z,再通过z计算y

③n改为递加

解密后得到5组数据

from ctypes import c_uint32def decipher(v, k):y = c_uint32(v[0])z = c_uint32(v[1])delta = 0x9e3779b9sum = c_uint32(delta * 32)  # This is the sum after 32 rounds of encryptionn = 32w = [0, 0]while n > 0:z.value -= ((y.value << 4) + k[2]) ^ (y.value + sum.value) ^ ((y.value >> 5) + k[3])y.value -= ((z.value << 4) + k[0]) ^ (z.value + sum.value) ^ ((z.value >> 5) + k[1])sum.value -= deltan -= 1w[0] = y.valuew[1] = z.valuereturn w# 本题用法
vs = [[4018289233, 2950320151], [1771827478, 493980876], [1863284879, 1137797599], [2759701525, 3957885055], [2600866805,78850724]]  # 加密后的数据
for v in vs:k = [11, 22, 33, 44]  # 密钥decrypted = decipher(v, k)print(decrypted)  # 解密后的数据
#[1718378855, 2067085111]
#[859137328, 1663907428]
#[808594737, 828727597]
#[942683954, 758133808]
#[1694498816, 0]

(2)外层encodestr()

外层相对简单,进行位移操作每次取8位转换成字符

#方法一
List = [[1718378855, 2067085111],[859137328, 1663907428],[808594737, 828727597],[942683954, 758133808],[1694498816, 0]
]def int_to_string(val):result = ""for j in range(4):char = chr(val >> (8 * (3 - j)) & 0xFF)result += charval -= (val >> (8 * (3 - j))) << (8 * (3 - j))return resultdef main():for i in range(5):now = List[i][0]print(int_to_string(now), end='')now = List[i][1]print(int_to_string(now), end='')if __name__ == "__main__":main()

image-20240824013143228

当然也可以直接调n2s实现,除了格式需要调整,没啥异常

from libnum import n2sList = [[1718378855, 2067085111],[859137328, 1663907428],[808594737, 828727597],[942683954, 758133808],[1694498816, 0]
]for i in range(4):x,y = List[i]print(n2s(x), n2s(y))

image-20240824013126081

4、base64隐写

🔥这个是第一次了解,做个记录,师傅写的很详细

https://www.tr0y.wang/2017/06/14/Base64steg/#%E8%A7%A3%E5%AF%86

(1)原理

简单来说就是base64补位的==位置存在不大于2*2的隐写空间

img

引用原文:

例如:直接解密VHIweQ==VHIweR==',得到的结果都是'Tr0y'

注意红色的 0,我们在解码的时候将其丢弃了,所以这里的值不会影响解码. 所以我们可以在这进行隐写。为什么等号的那部分 0 不能用于隐写?因为修改那里的二进制值会导致等号数量变化,解码的第 1 步会受影响。自然也就破坏了源字符串。而红色部分的 0 是作为最后一个字符二进制的组成部分,还原时只用到了最后一个字符二进制的前部分,后面的部分就不会影响还原。

唯一的影响就是最后一个字符会变化。

如果你直接解密VHIweQ==VHIweR==',得到的结果都是'Tr0y'。

当然,一行 base64 顶多能有 2 个等号,也就是有 2*2 位的可隐写位。所以我们得弄很多行,才能隐藏一个字符串,这也是为什么题目给了一大段 base64 的原因。接下来,把要隐藏的 flag 转为 8 位二进制,塞进去就行了。

也有简单的判断方法,比如出现大段base64密文,同时cyberchef自动解密时,整段复制进去无法自动解密,但手动拖入base64仍可成功解密,此时就可以测试base64隐写

image-20240824014249425image-20240824014306445

(2)解密

#加密
# -*- coding: cp936 -*-
import base64flag = 'Tr0y{Base64isF4n}' #flag
bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag])base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1: #'0.txt'是明文, '1.txt'用于存放隐写后的 base64for line in f0.readlines():rowstr = base64.b64encode(line.replace('\n', ''))equalnum = rowstr.count('=')if equalnum and len(bin_str):offset = int('0b'+bin_str[:equalnum * 2], 2)char = rowstr[len(rowstr) - equalnum - 1]rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset])bin_str = bin_str[equalnum*2:]f1.write(rowstr + '\n')
#解密
import base64b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('1.txt', 'rb') as f:flag = ''bin_str = ''for line in f.readlines():stegb64 = str(line, "utf-8").strip("\n")rowb64 =  str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")offset = abs(b64chars.index(stegb64.replace('=','')[-1]) - b64chars.index(rowb64.replace('=','')[-1]))equalnum = stegb64.count('=') #no equalnum no offsetif equalnum:bin_str += bin(offset)[2:].zfill(equalnum * 2)print([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)])

image-20240824014717165

补充到解密出来的第一段flag后面就行(见加密代码内flag注释),不再说明了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/786383.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

051、Vue3+TypeScript基础,页面通讯之v-model的基本用法

1、main.ts代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.moun…

InternLM 2.5 书生浦语 开源大模型本地部署体验

上海人工智能实验室发布了书生浦语(InternLM)新开源版本,增强了在复杂场景下的推理能力,本文介绍在本地进行部署和推理……老牛同学之前偶尔刷到过InternLM大模型相关的介绍文章,因为在老牛同学心中,Qwen2千问才是国内开源模型中最适合自己的大模型,原因是自己在本地部署…

全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式

在Python中,列表是一个非常灵活且常用的复合数据类型。它允许存储多个项,这些项可以是任意的数据类型,包括其他列表。列表推导式是一种简洁的方式来创建和操作列表。全网最适合入门的面向对象编程教程:37 Python 常用复合数据类型-列表和列表推导式摘要: 在 Python 中,列…

CareUEyes(调节屏幕亮度和颜色) v2.4.3.0 多语便携版

概述 CareUEyes 是一款用于调节屏幕亮度和颜色的软件,旨在保护用户眼睛的健康。它提供了多种功能和特点,使用户在使用电脑时能够更加舒适和健康。软件功能 蓝光过滤:该软件可以调整屏幕的色温,减少蓝光的强度,有助于减少眼部疲劳和视觉压力。休息提醒:软件会定时提醒用户…

050、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 // import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mou…

ut.cpp 最大线段并减线段交 [线段树]

题意:给定n条线段的左右端点,求两条有公共点的线段的并的长度减去它们的交的长度最大(\(n<=2e5\) \(1<=L,R<=1e9\))分析:不妨设\(L_i<=L_j<=R_i\),线段异或和为\(ans\),两条线段的右端点有两种情况: 1.\(R_j>=R_i\)此时 \(ans=R_j-R_i+L_j-L_i=L_j+…

Datawhale X 李宏毅苹果书 AI夏令营 -《深度学习详解》Task1

深度学习基础 学习目标理解深度学习的常见概念。 掌握优化神经网络的方法。 找到优化神经网络失败的原因。 学习调整学习率(lr)的高级方法。1、局部极小值与鞍点 在局部极小值与鞍点之前,首先了解一个特殊的点-临界点。 1.1 临界点 通常将梯度为零的点统称为“临界点”。什…

第二周作业

登录页面示例body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: rgba(247, 247, 247, 1) } .login-container { background-color: rgba(255, 255, 255, 1); padding: 20px; border-rad…

「代码随想录算法训练营」第四十五天 | 图论 part3

目录101. 孤岛的总面积DFS思路BFS思路102. 沉没孤岛103. 水流问题104. 建造最大岛屿 101. 孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173 文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html 题目状态:看题解DFS思路 思路: 代…

carlife

carlife是真的画中画。亿连客户端不是。没去除小房子效果如下:

【专题】2024数智医疗服务时代营销机遇洞察报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37466 如今,人工智能、大数据、物联网等众多智能技术持续且深入地在医药产业中得到应用。这不仅极大地增强了医药产业的创新能力,显著提高了医疗服务的质量与效率,还有力地促进了从预防、诊断、治疗到康复的全链条数字化转型,使市场效率得…

049、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mount(…