buuctf-鸡藕椒盐味,[NPUCTF2020]EzRSA,[WUSTCTF2020]大数计算
1.鸡藕椒盐味
题目“鸡藕椒盐味”不就是谐音“奇偶校验位”,本题给了验证码110010100000共12位,但是是个错误的验证码,这时我们需要了解海明码校验----
(不了解的可以去看看海明码原理与应用详解-CSDN博客,讲的很好)
题目给了一个提示:每个汉堡8块,也就是说, 数据位为8,校验位为4,而这四位校验码位置一定是在2^n上,即1,2,4,8。题目是说验证码倒了,我们再倒回去是0000 0101 0011,我们想要更清晰的分析就去列个表格
第一个检验位r1,它检验的位置为1,3,5,7,9,11(读一位隔一位)
第二个检验位r2,它检验的位置为2,3,6,7,10,11(读二位隔二位)
第三个检验位r4,它检验的位置为4,5,6,7,12(读四位隔四位)
第四个检验位r8,它检验的位置为8,9,10,11,12(读八位隔八位)
之后对校验位对应的数据进行异或运算(偶校验)
r1=0⊕1⊕1⊕0⊕1=1
r2=0⊕0⊕1⊕0⊕1=0
r3=1⊕0⊕1⊕1=1
r4=0⊕0⊕1⊕1=0
全0才表示无错,但是r1=1,发现了出错,当发生错误时,将r1r2r3r4的值转化为十进制
即可知道发生错误的位置,1010即9,第九位出了问题。把0改成1后即0000 0101 1011,最后倒过来110110100000
最后一步就是求md5了,脚本如下
import hashlib
def calculate_md5(input_string):# 创建 MD5 哈希对象md5_hash = hashlib.md5()# 更新哈希对象(需要将字符串编码为字节)md5_hash.update(input_string.encode('utf-8'))# 获取十六进制哈希值return md5_hash.hexdigest()
if __name__ == "__main__":user_input = input("请输入要计算 MD5 的字符串: ")result = calculate_md5(user_input)print(f"MD5 哈希值: {result}")
#d14084c7ceca6359eaac6df3c234dd3b
flag{d14084c7ceca6359eaac6df3c234dd3b}
2.[NPUCTF2020]EzRSA
本题给了e很奇怪,54722,先不管我们先去分解n试试,我尝试了yafu工具和factordbd网站分解,后者成功了,得出p和q,直接求phi=(p-1)*(q-1)
那么该有的数据都有了,剩下求个私钥之后不直接可以求m了吗
不不不,我们要验证gcd(e,phi)是否等于1,不然求不出逆元啊
import gmpy2
p=106021448991021391444550749375115277080844281746248845802565680557785009341952320484175568763707424932172033597514861602114171459176440279045761846695231788376075050452154924141266290931413542110639081792550648106240966552406813059396358355737185354885474455248579946190266152416149137616855791805617206153497
e = 54722
q=161136651053130509602530659420755324119806487925813087617466818245407407797561810253722204813002837916779909309520498985459703212021249251124954613236122142746302911323565396331355397916764254680629384957057354297855676493062493901977415968666512459829211010720514167083018352796496733697235524845188512914793
phi =(p-1)*(q-1)
x = gmpy2.gcd(phi,e)
print(x)
#x=2
居然不等于1,那就不可以直接带入了,这种情况就属于e,phi不互素了
原理和解题脚本大家去参考(RSA-e和phi不互素-CSDN博客)
脚本直接把p,q,e,c换一下即可.
我直接使用轩禹RSA工具一把梭了
flag{diff1cult_rsa_1s_e@sy}
3.[WUSTCTF2020]大数计算
这个题目纯就是靠写计算代码了
flag等于 wctf2020{Part1-Part2-Part3-Part4} 每一Part都为数的十六进制形式(不需要0x),并用 '-' 连接
Part1 = 2020*2019*2018* ... *3*2*1 的前8位
Part2 = 520^1314 + 2333^666 的前8位
Part3 = 宇宙终极问题的答案 x,y,z绝对值和的前8位
Part4 = 见图片附件,计算结果乘上1314
对part1有;
import math# 初始化结果为1(因为阶乘从1开始乘)
result = 1
for i in range(1, 2021):result *= i# 当数字太大时,只保留前15位数字if result > 10 ** 15:result = int(str(result)[:15])first_8_digits = str(result)[:8]
print("2020!的前8位数字是:", first_8_digits)
#38609695
对part2有:
part2 = 520**1314 + 2333**666
print("part2 =",str(part2)[:8])
# part2 = 67358675
对part3有:
参考Hackergame 2019——宇宙终极问题 42-CSDN博客
x = 80538738812075974
y = 80435758145817515
z = 12602123297335631
part3 = x + y + z
print("part3 =",str(part3)[:8])
# part3 = 17357662
对part4有;
直接算了(2*22+36)*1314 = 683280
最后求flag
#转十六进制不要前面的0x
part1 = hex(38609695)[2:]
part2 = hex(67358675)[2:]
part3 = hex(17357662)[2:]
part4 = hex(683280)[2:]
print("wctf2020{"+part1+"-"+part2+"-"+part3+"-"+part4+"}")
# wctf2020{24d231f-403cfd3-108db5e-a6d10}
flag{24d231f-403cfd3-108db5e-a6d10}