SWPU NSS 2022 秋季招新赛 Crypto 出题人笔记
观前提醒
别骂了师傅们,实验室被学校 gank 了,缺了部分题目 Writeup,会在稍晚发出来,这个 Writeup 里面有图片是炸的是因为出题人用的图床的锅,别骂了呜呜呜,再给点时间
善哉善哉
@Aurorapj
善斋善哉,出题人以慈悲为怀
考点:莫斯、佛曰
Shoot by Aurorapj
发现没什么特别,拖进Winhex 看看,发现最后面有点东西
一看 莫斯! 马上在线工具
发现新佛曰,继续在线工具
新佛曰:諸隸僧降閦吽諸閦陀摩隸僧缽薩閦嚤降斯咤須閦色嘚嘇叻閦夷喃哆嚴吶菩若嘇耨咒閦愍閦囉耨所嚤閦嘇閦降陀叻羅宣吽眾阿愍菩修心降叻陀嚤吽蜜吶斯閦嘚愍吽若宣哆色塞囉伏嘇愍降嘇吽闍兜喼如
这里有点脑洞,不过仔细看应该能看出来上面有变化。
得到:
施主,此次前来,不知有何贵干?
但是直接拿去提交Flag发现错误,继续在文件里找线索。
最终在属性-备注中发现线索,需要对佛说的内容进行MD5加密
此处省略MD5加密过程,直接贴flag了
NSSCTF{7551772a99379ed0ae6015a470c1e335}
什锦
@MuFeng
猪猪这么这么可爱,怎么可以吃猪猪呢!——奇奇怪怪的密码
考点:猪圈密码、社会核心价值观加密、Brainfuck
CodeA=Decode(友善爱国平等友善自由友善敬业爱国诚信文明诚信自由平等友善平等友善公正诚信民主友善自由友善爱国公正敬业爱国爱国诚信自由友善爱国自由诚信民主爱国诚信民主友善平等友善爱国公正敬业公正爱国法治友善爱国公正敬业爱国爱国诚信自由诚信自由平等敬业文明爱国诚信文明诚信自由爱国诚信民主富强敬业富强)
CodeB=Decode(CodeB.png)
CodeC=Decode(CodeC.txt)
flag=MD5(CodeA+CodeB+CodeC)
CodeA一看就是社会主义核心价值观加密 在线工具 解得
富强明主文明和谐
CodeB 一只猪 还有一堆菜~斯哈~ 饿了,呜呜呜
联系题目描述,是猪圈密码 在线工具 解得
pigissocutewhyyoukillpig
注意:此处是小写 且字母与字母之间无空格
CodeC:打开满屏的加号,后面发现有大于号等,用工具解,加密方式是Brainfuck,这边有点问题,很多在线工具无法解出中文结果
但是猪猪好好吃诶
合并ABC得
富强明主文明和谐pigissocutewhyyoukillpig但是猪猪好好吃诶
进行MD5加密并用NSSCTF包裹,得到flag
NSSCTF{c05485d678cb8a6beb401f31d762532a}
小明文
@MuFeng
为什么这道题看着好眼熟,但我确不会做
考点:RSA小明文攻击
from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag
e = 3
p = getPrime(1024)
q = getPrime(1024)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("c=" + str(c))
#c=128198926274489803523728445192921664
#flag=NSSCTF{c}
一看,是一道RSA题目,但是只给了C,并且联系题目名和e=3,应该是小明文攻击
原理:当e=3时 flag也较小时,m的e次方远远小于n,所以c就是m的e次方,c、e已知,求m,直接开e次方
脚本:
import math
from Crypto.Util.number import long_to_bytes
a=128198926274489803523728445192921664
print(long_to_bytes(math.ceil(a ** (1 / 3))))
将输出结果用NSSCTF{}包裹,得到flag
NSSCTF{ufind}
Yafu分解
@MuFeng
我题出错了吗?为什么查不到?
考点:RSA大数分解-yafu
from gmpy2 import invert
from Crypto.Util.number import getPrime, bytes_to_long
from flag import getflag
e = 65537
p = getPrime(140)
q = getPrime(140)
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
m = bytes_to_long(getflag().encode())
c = pow(m, e, n)
print("n=" + str(n))
print("c=" + str(c))
#n=1851012829537540993346897265450988006921329733937556249710137670254755668838970157221
#c=1165608868963663237838494928147497339359377331987999335624507621030816298293537918937
这同样是一道RSA的题,发现给了e、n、c,但是解的话需要d,想要d的要phiN,然后得到pq,尝试去分解n,发现在线工具无法分解,用yafu工具本地跑试试吧。
成功解出pq
现在就是模板了,随便搜一个RSA解密脚本,修改对应的值,直接出flag
脚本:
from Crypto.Util.number import long_to_bytes
from gmpy2 import invert
c = 1165608868963663237838494928147497339359377331987999335624507621030816298293537918937
p = 1358730637766188714476624560503309609820513
q = 1362310363870711901033415700690289289304517
e = 65537
n = p * q
phiN = (p - 1) * (q - 1)
d = invert(e, phiN)
print(long_to_bytes(pow(c, d, n)))
得到:AFFPGS{snzv1l_ov9_gur_g0_Jr1p0zr}
用rot13解密,得到flag
NSSCTF{fami1y_bi9_the_t0_We1c0me}
AES
@MuFeng
看着好像Base,但是又不是,他是什么呢
考点:AES基础
题目:
import base64
from Crypto.Cipher import AES
from flag import getflag
iv = '1229002635654321'
key = 'nssctfneedcrypto'
data = getflag()
def pad(data):
pad_data = data
for i in range(0, 16 - len(data)):
pad_data = pad_data + ' '
return pad_data
def AES_en(key, data):
if len(data) < 16:
data = pad(data)
AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
AES_en_str = AES_obj.encrypt(data.encode("utf-8"))
AES_en_str = base64.b64encode(AES_en_str)
AES_en_str = AES_en_str.decode("utf-8")
return AES_en_str
data = AES_en(key, data)
print(data)
#data=862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8=
题目名已经给完提示了,AES加密了,我比较懒,这个题我搜了个脚本,然后把解密部分直接删了,百度这道题的部分代码,应该是可以找到完整代码的。
脚本:
import base64
from Crypto.Cipher import AES
iv = '1229002635654321'
key = 'nssctfneedcrypto'
data = '862EoKZMO3sqpNlzyvIW5G/8MFeAI/zgGXcgi5eNOL8='
# 将原始的明文用空格填充到16字节
def pad(data):
pad_data = data
for i in range(0, 16 - len(data)):
pad_data = pad_data + ' '
return pad_data
def AES_de(key, data):
data = data.encode("utf-8")
data = base64.b64decode(data)
AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))
AES_de_str = AES_de_obj.decrypt(data)
AES_de_str = AES_de_str.strip()
AES_de_str = AES_de_str.decode("utf-8")
return AES_de_str
data = AES_de(key, data)
print(data)
直接跑出flag了
NSSCTF{NSS_CRYPTO_NEED_YOU_0000}
爆破MD5
@MuFeng
一个Crypto手需要会使用Python喔!
考点:Python爆破MD5
data='Boom_MD5****'
flag=MD5(data)
print(flag)
#0618ac93d4631df725bceea74d0*****
其实,这道题是拿来凑数的,不到一分钟就出好了
没想到居然难度这么大^_^
意思就是 data的md5等于后面那串注释掉的,差4位
直接爆破吧,反正也不多
脚本:
import hashlib
dic = ['Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'P', 'L', 'Z', 'X', 'C','V', 'B', 'N', 'M', '_']
for a in range(len(dic)):
for b in range(len(dic)):
for c in range(len(dic)):
for d in range(len(dic)):
m = 'Boom_MD5' + dic[a] + dic[b] + dic[c] + dic[d]
flag = hashlib.md5()
flag.update(m.encode())
md5 = flag.hexdigest()
print(m)
if md5[0:8] == '0618ac93':
print(md5)
quit()
跑出后用NSSCTF包裹,得到flag
NSSCTF{0618ac93d4631df725bceea74d0fe071}
DiscreteDiscrete
@m1nus
Discrete,题目名字上提示也很明显啦,就是离散对数的问题,题目描述我给的"Do I look like RSA?",是希望大家去了解离散对数问题和RSA的区别
题目附件
import libnum
import random
from Crypto.Util.number import *
flag = "*************************"
m = int(hex(libnum.s2n(flag)) , 16)
n = 2 ** 512
print(f"n = {n}")
x = random.randint(2, n-1) | 1
print(f"x = {x}")
c = pow(x , m , n)
print(f"c = {c}")
# n = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
# x = 9795065994886226384204904966849239623474055462495495755216573935495433269421238891934740481621010281153676351284936882958509364458306524174275663183354347
# c = 12124630419477800996787439916074125902945359931344392715324003381817849996550355767138542576383623513820157574593640624060741986552381770011023574637567067
关键就在于c = pow(x , m , n)
,也就是$x^m \equiv c \mod n$,这里的m也就是明文flag,可以发现m是在指数的位置上
使用sympy的discrete_log方法,discrete_log(n,c,x),三个参数分别是模数,余数,底数,拿到m
import libnum
import sympy
n = 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
x = 9795065994886226384204904966849239623474055462495495755216573935495433269421238891934740481621010281153676351284936882958509364458306524174275663183354347
c = 12124630419477800996787439916074125902945359931344392715324003381817849996550355767138542576383623513820157574593640624060741986552381770011023574637567067
m = sympy.discrete_log(n, c, x)
print(libnum.n2s(m))
#NSSCTF{DIscReTe_diSCrEtE}
SWPU NSS 2022 秋季招新赛 Crypto 出题人笔记
https://www.wd-ljt.com/post/1024/903.html
来源于问谛居,转载记得联系作者哟~
共有 0 条评论