好耶,排名涨到12000 了,就做了十道题就涨了近4000名,瞬间信心就上来了,同时也说明一个问题,绝大多数萌新就在一开始就放弃了,但是如果能静下心来,慢慢钻研,就能有所突破。
9.Rabbit
代码语言:javascript复制题目:U2FsdGVkX1/ ydnDPowGbjjJXhZxm2MP2AgI
Rabbit密码在比赛非常常见,我参加的两场线下赛都遇到了,第一次是刚上大二那会,由于没遇到过这种加密方式还是没能解出来(其实就是我太菜了)
代码语言:javascript复制这种加密的特征是:有U2Fsd开头
关于Rabbit加密我在网站上暂时没有找到相关信息,查阅书籍也是一无所获,如果后期有相关的解析,我会更新脚本。 这里就用工具解一次吧
代码语言:javascript复制在线解密:
https://www.sojson.com/encrypt_rabbit.html
输出结果:Cute_Rabbit
flag{Cute_Rabbit}
今天中秋节放假,我也去休息了,明天继续续更。
10.篱笆墙的影子
题目描述:
代码语言:javascript复制星星还是那颗星星哟 月亮还是那个月亮 山也还是那座山哟
梁也还是那道梁 碾子是碾子 缸是缸哟 爹是爹来娘是娘
麻油灯呵还吱吱响 点的还是那么丁点亮 哦哦
注意:得到的 flag 请包上 flag{} 提交
题目:felhaagv{ewtehtehfilnakgw}
分析一波,这个密文格式看样子是已经有两个大括号了,那么解密就是要把这些字母已一种特定的方式排序。 如果有一定基础的可以看出这是个栅栏密码,那现在就给萌新科普一下:
所谓栅栏密码,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。 不过栅栏密码本身有一个潜规则,就是组成栅栏的字母一般不会太多。(一般情况不超过30个)
这里再来个简单的例子:
代码语言:javascript复制比如明文:THEREISACIPHER
两个一组 得到:TH ER EI SA CI PH ER
先取出第一个字母:TEESCPE
再取出第二个字母:HRIAIHR
连在一起得到密文:TEESCPEHRIAIHR
而解密的时候,我们先把密文从中间分开,变为两行:
T E E S C P E
H R I A I H R
再按上下上下的顺序组合起来:
得到明文:THEREISACIPHER
这里大概就懂原理了吧,那么-上脚本!
代码语言:javascript复制def zhalan(e):
elen = len(e)
field = []
for i in range(2, elen):
if (elen % i == 0):
field.append(i)
for f in field:
b = elen // f
result = {x: '' for x in range(b)}
for i in range(elen):
a = i % b;
result.update({a: result[a] e[i]})
d = ''
for i in range(b):
d = d result[i]
print(d)
d.lower()
if __name__ == '__main__':
e = 'felhaagv{ewtehtehfilnakgw}' 这里是题目给的密文
zhalan(e)
通常结果会将所有情况输出,我们只要找出带有flag的明文或有特殊意义的字符串就是flag了。
11.RSA
题目:
代码语言:javascript复制注意:得到的 flag 请将noxCTF替换为flag格式为flag{}提交。
在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17
求解出d作为flga提交
RSA加密算法的知识点:
根据上述的信息,我们简单用Python来写个脚本:
代码语言:javascript复制import gmpy2
p=473398607161
q=4511491
e=17
d=gmpy2.invert(e,(q-1)*(p-1))
解释:d = gmpy2.invert(e,n) # 求逆元,de = 1 mod n
print (d)
12.丢失的MD5
题目:
代码语言:javascript复制import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
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)
直接给了一段代码,题目说的是MD5,那么我们从MD5的角度来分析一波。 MD5特征:一般为16或32位(字母 数字) 现在我们就来审计这段代码,尝试改一改,让它能运行起来。 更改脚本:
代码语言:javascript复制import hashlib
for i in range(32,127):
for j in range(32,127):
for k in range(32,127):
m=hashlib.md5()
m.update('TASC' chr(i) 'O3RJMV' chr(j) 'WDJKX' chr(k) 'ZM')
#这里改一下,因为MD5哈希运算之前,要对数据进行编码
m.update('TASC'.encode('utf-8') chr(i).encode('utf-8') 'O3RJMV'.encode('utf-8') chr(j).encode('utf-8')
'WDJKX'.encode('utf-8') chr(k).encode('utf-8') 'ZM'.encode('utf-8'))
des=m.hexdigest()
if 'e9032' in des and 'da' in des and '911513' in des:
print (des)
运行截图:
13.Alice与Bob
题目:
代码语言:javascript复制密码学历史中,有两位知名的杰出人物,Alice和Bob。他们的爱情经过置换和轮加密也难以混淆,即使是没有
身份认证也可以知根知底。就像在数学王国中的素数一样,孤傲又热情。
下面是一个大整数:98554799767,请分解为两个素数,分解后,小的放前面,大的放后面,合成一个新的数字,
进行md5的32位小写哈希,提交答案。 注意:得到的 flag 请包上 flag{} 提交
这基本上就是一道密码学计算题了,我们计算出值提交即可。 第一步:将大整数分解为两个素数 整数分解(RSA算法),这个数太大了,脚本分解不了,还是上网站解。
代码语言:javascript复制网址:http://www.factordb.com/index.php
代码语言:javascript复制98554799767<11> = 101999 · 966233
第二步: 小数在前,大数在后,合起来新的数字:101999966233 第三步: 进行md5的32位小写哈希:
14.rsarsa
题目:
代码语言:javascript复制Math is cool! Use the RSA algorithm to decode the secret message,
c, p, q, and e are parameters for the RSA algorithm.
p=
964842302901051567659055174001042653494573763923573980064
39893520398525072984913995610350091634270503701075707336333
50911691280297777160200625281665378483
q =
11874843837980297032092405848653656852760910154543380907
650040190704283358909208578251063047732443992230647903
887510065547947313543299303261986053486569407
e = 65537
c =
83208298995174604174773590298203639360540024871256126892889
661345742403314929861939100492666605647316646576486526217
457006376842280869728581726746401583705899941768214138
7422596893348407356335530538876418476511737762518202930
872128856701803674068074067659236389731613758173
92737747832762751690104423869019034
RSA前面有讲,现在我们来直接解题。 脚本:
代码语言:javascript复制e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p*q
#密文
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
d = 56632047571190660567520341028861194862411428416862507034762587229995138605649836960220619903456392752115943299335385163216233744624623848874235303309636393446736347238627793022725260986466957974753004129210680401432377444984195145009801967391196615524488853620232925992387563270746297909112117451398527453977
#求明文
M = pow(C,d,n) #快速求幂取模运算
print(M)
#解出flag{5577446633554466577768879988}
运行截图:
代码语言:javascript复制flag:flag{5577446633554466577768879988}
15.大帝的密码武器
题目:
这道题就立马就不一样了,是个不可执行文件,有可能需要我们给它一个属性,试试zip.txt
那么zip.zip呢,再来试试。
不错,来看看题目:
题目说的很明白了已经,应该就是凯撒加密,我们先把题目给的密文解密,得出的密钥再加密给的明文,被加密的密文就是flag了。 开始搞:直接上脚本
代码语言:javascript复制str1 = 'FRPHEVGL'
str2 = str1.lower() #转换为小写方便识别
num = 1 #偏移量
for i in range(26):
print("{:<2d}".format(num),end = ' ')
for temp in str2:
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:
if (ord(temp) 13 > ord('z')):
print(chr(ord(temp) 13 - 26), end='')
else:
print(chr(ord(temp) 13), end='')
print('')
运行结果:
可以看出位移量是13的时候,我们得到明文:security 好,现在用我们得到key去加密题目给的密文。 继续上脚本:
代码语言:javascript复制import string
def kaisa(s, k): #定义函数 接受一个字符串s 和 一个偏移量k
lower = string.ascii_lowercase #小写字母
upper = string.ascii_uppercase #大写字母
before = string.ascii_letters #无偏移的字母顺序 小写 大写
after = lower[k:] lower[:k] upper[k:] upper[:k]#偏移后的字母顺序 还是小写 大写
#分别把小写字母和大写字母偏移后再加到一起
table = ''.maketrans(before, after) #创建映射表
return s.translate(table) #对s进行偏移 即加密
s = input('请输入一个字符串:')
k = int(input('请输入一个整数密钥:'))
print(kaisa(s, k))
运行结果:PbzrPuvan
16.Windows系统密码
题目:
代码语言:javascript复制Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::
尝试用md5解密,无果。 于是对自组字符串都进行了md5,得到了明文,在第二句ctf中。
代码语言:javascript复制一般MD5值是32位由数字“0-9”和字母“a-f”所组成的字符串。
如果出现这个范围以外的字符说明这可能是个错误的md5值,就没必要再拿去解密了。
1.确定性:一个原始数据的MD5值是唯一的,同一个原始数据不可能会计算出多个不同的MD5值。
2.碰撞性:原始数据与其MD5值并不是一一对应的,有可能多个原始数据计算出来的MD5值是一样的,这就是碰撞。
3.不可逆:也就是说如果告诉你一个MD5值,你是无法通过它还原出它的原始数据的,这是由它的算法所决定的。
一个给定的MD5值是可能对应多个原始数据的,并且理论上讲是可以对应无限多个原始数据。
所有无法确定到底是由哪个原始数据产生的。