https://blog.csdn.net/ao52426055/article/details/109304646
控制台解码
decodeURI()
、decodeURIComponent()
有点社工?一般姓名缩写加生日随机组合,先试试
flag{zs19900315}
题目提示变异凯撒,说明有新的规律,先试试前面几个字母和flag对比一下
:::info
f:102 —— a:97 5
l:108 —— f:102 6
a:97 —— Z:90 7
g:103 —— _:95 8
:::
发现每次的偏移量比前一次多一,写个脚本
flag = "afZ_r9VYfScOeO_UL^RWUc"
i = 1
k = 5
m = 0
while i<=len(flag):
for j in flag:
new = chr(ord(j)+k)
k += 1
i += 1
print(new,end="")
可打印字符引用编码
https://blog.csdn.net/qq_22146195/article/details/107500750
quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法
任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值 例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式
所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示
ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).
如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.
quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行,即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中
https://blog.csdn.net/l2645470582_/article/details/121372104
Rabbit 是一种高速流密码,Rabbit 使用一个 128 位密钥和一个 64 位初始化向量。 该加密算法的核心组件是一个位流生成器,该流生成器每次迭代都会加密 128 个消息位。
栅栏密码是一种简单的移动字符位置的加密方法,规则简单,容易破解。栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文。
例如:
明文:栅栏密码加密规则示例
每组字数:5
按照字数先把明文分成:
栅栏密码加
密规则示例
先取每组第一个字:栅密
再取每组第二个字:栏规
……
最后得到“栅密栏规密则码示加例”。
解密则反推:
密文被分成2个字一组:
栅密
栏规
密则
码示
加例
先取每组第一个字:栅栏密码加
再取每组第二个字:密规则示例
最后得到“栅栏密码加密规则示例”。
import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5() # 使用hash对象的update方法添加消息
m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print des
(1)此模块支持多种摘要算法
(2)hashlib.md5()
通过构造函数获得一个hash对象
(3)hash.update()
更新hash对象。连续的调用该方法相当于连续的追加更新。例如m.update(a); m.update(b)
相当于m.update(a+b)
由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()
的值都会不一样。
(4)hash.digest()
返回bytes格式的消息摘要
(5)hash.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。
(6)hash.copy()
返回一个hash对象的拷贝
:::tips
密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,进行md5的32位小写哈希,提交答案。
:::
素数分解
MD5加密
:::tips
公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
以下密文被解开后可以获得一个有意义的单词:FRPHEVGL
你可以用这个相同的加密向量加密附件中的密文,作为答案进行提交。
:::
:::tips
密文:ComeChina
:::
猜测是移位密码,用一下大佬脚本,偏移量为13时刻得到flag,若超出z需要减26使其回到A-z范围内
str1 = 'FRPHEVGL'
str2 = str1.lower() # 转换为小写方便识别
num = 1 # 偏移量
for i in range(26):
print("{:<2d}".format(num), end=' ') # 输出偏移量,左对齐宽度为2
for temp in str2: # 先加密str1
if ord(temp) + num > ord('z'): # 如果超出'z',需要重新映射会a~z这26个字母上
print(chr(ord(temp) + num - 26), end='')
else:
print(chr(ord(temp) + num), end='')
num += 1
print('') # 换行
str = 'ComeChina'
for temp in str: # 再加密str
if ord(temp) + 13 > ord('z'):
print(chr(ord(temp) + 13 - 26), end='')
else:
print(chr(ord(temp) + 13), end='')
print('')
https://www.runoob.com/python/att-string-format.html
基本语法是通过 {}
和:
来代替以前的 %
>>>"{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
'hello world'
>>> "{0} {1}".format("hello", "world") # 设置指定位置
'hello world'
>>> "{1} {0} {1}".format("hello", "world") # 设置指定位置
'world hello world'
也可以设置参数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print("网站名:{name}, 地址 {url}".format(name="菜鸟教程", url="www.runoob.com"))
# 通过字典设置参数
site = {"name": "菜鸟教程", "url": "www.runoob.com"}
print("网站名:{name}, 地址 {url}".format(**site))
# 通过列表索引设置参数
my_list = ['菜鸟教程', 'www.runoob.com']
print("网站名:{0[0]}, 地址 {0[1]}".format(my_list)) # "0" 是必须的
# 网站名:菜鸟教程, 地址 www.runoob.com
# 网站名:菜鸟教程, 地址 www.runoob.com
# 网站名:菜鸟教程, 地址 www.runoob.com
数字格式化
^ < >
分别是居中、左对齐、右对齐,后面带宽度,:
号后面带填充的字符,只能是一个字符,不指定则默认是用空格填充。
+
表示在正数前显示+
,负数前显示-
; (空格)
表示在正数前加空格
b、d、o、x
分别是二进制、十进制、八进制、十六进制
:::tips
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
:::
题目给出了p q e以及明文
from gmpy2 import invert
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
e = 65537
c = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
n = p * q
y = (p - 1) * (q - 1) # 欧拉数
d = invert(e, y) # 逆元d
flag = pow(c, d, n)
print(flag)
:::tips
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
:::
看着就像MD5,解密一下
:::tips
也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文!)
:::
:::info
606046152623600817831216121621196386
:::
提示有清政府和明文为中文,想到可能是中文电码
中文电码表采用了四位数字作代号,从0001到9999按四位数顺序排列,用四位数字表示最多一万个汉字、字母和符号。汉字先按部首,后按笔划排列。字母和符号放到电码表的最尾。后来由于一万个汉字不足以应付户籍管理的要求,又有第二字面汉字的出现。在香港,两个字面都采用同一编码,由输入员人手选择字面;在台湾,第二字面的汉字会在开首补上“1”字,变成5个数字的编码。
:::tips
MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
:::
不知道为啥写的爆破脚本跑不出正确的flag,这里直接用爆破网站
:::tips
小明某一天收到一封密信,信中写了几个不同的年份
辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
信的背面还写有“+甲子”,请解出这段密文。
key值:CTF{XXX}
:::
第一个提示就是本题flag了
年份就是六十甲子嘛,根据下表推出每个对应的值,背面还有“+甲子”即为+1或者+60(一个甲子对应60年)
+1的话对照ASCII码有问题,那就+60刚好合适分别为:
88(X) 90(Z) 83(S) 68(D) 77(M) 70(F) 76(L) 90(Z)
XZSDMFLZ
题目提示古典密码:尝试栅栏和凯撒
先用栅栏解密:
将这两个栅栏解密得到的字符串分别凯撒爆破
发现此时shungyu能读懂可能是flag
https://www.cnblogs.com/darkcyan/p/15686724.html
https://blog.csdn.net/qq_52193383/article/details/119984884
https://blog.csdn.net/weixin_45897326/article/details/104069305
:::tips
5555555595555A65556AA696AA6666666955
这是某压力传感器无线数据包解调后但未解码的报文(hex)
已知其ID为0xFED31F,请继续将报文完整解码,提交hex。
提示1:曼联
:::
提示曼联猜测曼彻斯特编码,每位16进制数转成四位二进制数(位数不够高位补零),再进行转换。本次采用第二种编码即:
:::tips
0x5=0101 编码为11
0x6=0110 编码为10
0x9=1001 编码为01
0xA=1010 编码为00
:::
把5555555595555A65556AA696AA6666666955
转为二进制再编码后得到
11111111 11111111 01111111 11001011 11111000 00100110 00001010 10101010 10011111
转为十六进制0xffff7fcbf8260aaa9f
但是不包括题目0xFED31F
,于是需要根据八位倒序传输协议将二进制每八位reverse
(8位翻转:镜像翻转 比如01010101
反转后10101010
),
翻转后得到11111111 11111111 11111110 11010011 00011111 01100100 01010000 01010101 11111001
转为十六进制0xfffffed31f645055f9
包含0xFED31F
康康大佬脚本:
cipher='5555555595555A65556AA696AA6666666955'
def iee(cipher):
tmp=''
for i in range(len(cipher)):
a=bin(eval('0x'+cipher[i]))[2:].zfill(4)
tmp=tmp+a[1]+a[3]
print(tmp)
plain=[hex(int(tmp[i:i+8][::-1],2))[2:] for i in range(0,len(tmp),8)]
print(''.join(plain).upper())
iee(cipher)
曼彻斯特编码也叫做相位编码,是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。它在以太网媒介系统中的应用属于数据通信中的两种位同步方法里的自同步法(另一种是外同步法),即接收方利用包含有同步信号的特殊编码从信号自身提取同步信号来锁定自己的时钟脉冲频率,达到同步目的。用电平跳变来表示1或0的编码方法,其变化规则很简单,即每个码元均用两个不同相位的电平信号表示,也就是一个周期的方波,但0码和1码的相位正好相反。
解密:
第一种指定对于0位,信号电平将为低高电平(假设对数据进行幅度物理编码)-在位周期的前半段为低电平,在后半段为高电平。对于1位,信号电平将为高-低。即01 => 0 , 10 => 1。
第二种指出逻辑0由高-低信号序列表示,逻辑1由低-高信号序列表示。也就是说10代表0,01代表1,这正好也反映了每个码元均用两个不同相位的电平信号表示。