Challenges Crypto esay
Baby Time Capsule
description
Qubit Enterprises 是一家新成立的公司,吹嘘其独有的量子位稳定方法。他们希望能在未来 10 年内制造出一台能计算 RSA-1024 数字的量子计算机。作为促销活动,他们正在发放 "时间胶囊",里面装着用 1024 位 RSA 加密的未来信息。他们可能是伟大的工程师,但肯定不是密码学家,你能找到不用等待他们的未来机器就能读取信息的方法吗?
solution
class TimeCapsule():
def __init__(self, msg):
self.msg = msg
self.bit_size = 1024
self.e = 5
def _get_new_pubkey(self):
while True:
p = getPrime(self.bit_size // 2)
q = getPrime(self.bit_size // 2)
n = p * q
phi = (p - 1) * (q - 1)
try:
pow(self.e, -1, phi)
break
except ValueError:
pass
return n, self.e
def get_new_time_capsule(self):
n, e = self._get_new_pubkey()
m = bytes_to_long(self.msg)
m = pow(m, e, n)
return {"time_capsule": f"{m:X}", "pubkey": [f"{n:X}", f"{e:X}"]}
观察代码我们可以发现是标准的RSA
,其中的m和e是不变的,那我们就可以考虑使用CRT
进行求解
exp
# SAGE
from pwn import *
from Crypto.Util.number import *
from gmpy2 import *
connect = remote(URL, Port)
e = 5
n, c = [], []
for _ in range(5):
connect.sendlineafter(b'Welcome to Qubit Enterprises. Would you like your own time capsule? (Y/n) ', b'Y')
info = connect.recvuntil(b']}').decode()
c.append(int(info[info.find('capsule": "') + 11:info.find('", "pubkey')], 16))
n.append(int(info[info.find('"pubkey":') + 12:info.find('", "5"]}')], 16))
me = crt(c,n)
m = iroot(me,e)[0]
print(long_to_bytes(m))
The Last Dance
description
要想跻身伯福特帝国的上流社会,你必须参加每年一度在高等法院举行的恰恰舞会。你不知道,在受邀的众多贵族中,你会发现一名被烧死的敌方间谍。你的目标很快变成了抓住他,在他的酒里放了点东西后,你成功地抓住了他。在你的情报机构的审讯室里度过了许多小时,你最终了解到了关于敌方情报机构秘密通讯的重要信息。你能用学到的知识解密其余的信息吗?
solution
可以发现这道题使用了chacha20
的一个算法,iv
被使用了两次,因此两次加密的明文和密文之间就存在如下关系
plaintext1 ^ plaintext2 = cipertext1 ^ cipertext2
其中plaintext1
是message
,我们可以通过计算得到plaintext2
,也就是FLAG
FLAG = encrypted_message ^ encrypted_flag ^ message
exp
from pwn import *
message = b"Our counter agencies have intercepted your messages and a lot of your agent's identities have been exposed. In a matter of days all of them will be captured"
encrypted_message = bytes.fromhex('7aa34395a258f5893e3db1822139b8c1f04cfab9d757b9b9cca57e1df33d093f07c7f06e06bb6293676f9060a838ea138b6bc9f20b08afeb73120506e2ce7b9b9dcd9e4a421584cfaba2481132dfbdf4216e98e3facec9ba199ca3a97641e9ca9782868d0222a1d7c0d3119b867edaf2e72e2a6f7d344df39a14edc39cb6f960944ddac2aaef324827c36cba67dcb76b22119b43881a3f1262752990')
encrypted_flag = bytes.fromhex('7d8273ceb459e4d4386df4e32e1aecc1aa7aaafda50cb982f6c62623cf6b29693d86b15457aa76ac7e2eef6cf814ae3a8d39c7')
flag = xor(encrypted_message, encrypted_flag, message)
print(flag)
Flippin Bank
description
世界银行受到攻击黑客找到了入侵方法,并将管理员锁在外面。然而,入侵者的 netcat 身份验证并不完全安全。你能帮助管理员登录吗?
solution
观察代码可以发现这道题是AES-CBC
,题目需要我们输入账密,代码会对'logged_username=' + user + '&password=' + passwd
进行加密并输出,而我们所要做的就是输入一个加密代码让其解密,并得到admin&password=g0d
在其解密后的明文里。既然没有key
和iv
那我们就只能从解密过程上下手了。
在上面的解密过程中,Plaintext1
是logged_username=
而解密是需要第二块Plaintext2
是admin&password=g
,我们可以发现Plaintext2
是Ciphertext1
与Text1
(Ciphertext2
经过block cipher decryption
)异或后得到的,其中Text1
我们无法控制但Ciphertext1
是可以控制的,我们通过对Ciphertext1
的控制可以实现Plaintext2
符合要求。
username: abcde
abcde's password: g0ld3n_b0y
########################################################################
# Welcome to the Bank of the World #
# All connections are monitored and recorded #
# Disconnect IMMEDIATELY if you are not an authorized user! #
########################################################################
Leaked ciphertext: 3a5541e1862d553f9f42e95e187914e6797e8b5f9238331e3a9414b15f693eac57fdbf7b1abeabe790c3cfef2e940ef6
在上面我们加密的信息为logged_username=abcde&password=g0ld3n_b0y
,其中Plaintext2
为abcde&password=g
而我们的目的就是让解密后的Plaintext2
为admin&password=g
,Text1=Ciphertext1\oplus Plaintext2,有了Test1
我们就可以更改Ciphertext1
exp
C1_o = 0x3a5541e1862d553f9f42e95e187914e6
P2_o = bytes_to_long(b'abcde&password=g')
P2_t = bytes_to_long(b'admin&password=g')
C1_t = hex(C1 ^ P2_o ^ P2_t)
# C1_t用于替换Ciphertext1
print(C1_t)
**Notes:**但对于这道题有些许疑惑,题目在其中不让我们输入为admin&password=g0ld3n_b0y
但可以输入为admin&password=g0ld3n
这样不仅可以避免被检测,而且题目加密出来的Leaked ciphertext
也是可以直接使用,在本地按照题目的加解密也是可以正确运行的,但事实是无法使用,可能出题人不想让我们这么做。
xorxorxor
description
有了 XOR,谁还需要 AES?
solution
就是XOR
exp
from os import *
from Crypto.Util.number import *
Flag = long_to_bytes(0x134af6e1297bc4a96f6a87fe046684e8047084ee046d84c5282dd7ef292dc9)
flag = b'HTB{'
key = b''
for i in range(4):
key += long_to_bytes(Flag[i] ^ flag[i])
for i in range(4, len(Flag)):
flag += long_to_bytes(Flag[i] ^ key[i % len(key)])
print(flag)
RLotto
description
准备好赢彩票了吗?猜随机乐透号码。现在是您成为百万富翁的时候了。
solution
这道题主要是让我们猜测乐透的后五位,看起来是随机的我们并不能一次猜出所有的数字,但有一点就是python
中的随机数是伪随机数,当我们有种子后我们就能得到后面的所谓随机数,这道题的种子是时间
。
exp
from pwn import *
from time import *
extracted = []
next_five = []
connect = remote('167.172.62.51', 32708)
info = connect.recvuntil(b'Put here the next 5 numbers:')
NowTime = int(time())
TrueExtracted = info[len(info) - info[::-1].find(b' :NOITCARTXE'):info.find(b' \r\n')].decode().split(' ')
while TrueExtracted != extracted:
extracted = []
NowTime -= 1
random.seed(NowTime)
while len(extracted) < 5:
r = random.randint(1, 90)
if (r not in extracted):
extracted.append(str(r))
while len(next_five) < 5:
r = random.randint(1, 90)
if (r not in next_five):
next_five.append(r)
sendinfo = ''
for i in next_five:
sendinfo += str(i) + ' '
connect.sendline(sendinfo[:-1].encode())
print(connect.recvuntil(b'}'))
Lost Modulus
description
我用 RSA 加密了一条密文,但丢失了模数。你能帮我恢复吗?
solution
我们查看发现c为907bit远小于n,所以c=m^{e}
exp
from Crypto.Util.number import *
from gmpy2 import *
c = FLAG
e = 3
print(long_to_bytes(iroot(c,e)[0]))
RSAisEasy
description
我想这是安全的...对吗?
solution
经过化简,我们就可以发现q=\gcd(n_{1},(n1 * E) + n2),知道q我们就开始求z,在p*E+z中我们只需要模p即可得到z
exp
from Crypto.Util.number import *
from gmpy2 import *
n1 =
c1 =
c2 =
# (n1 * E) + n2
n1En2 =
e = 0x10001
q = gcd(n1En2,n1)
p = n1 //q
z = n1En2//q%p
n2 = q*z
phi1 = (p-1)*(q-1)
phi2 = (q-1)*(z-1)
d1 = invert(e,phi1)
d2 = invert(e,phi2)
print(long_to_bytes(pow(c1,d1,n1)).decode()+long_to_bytes(pow(c2,d2,n2)).decode())
Protein Cookies
description
又是一天对着镜子大展肌肉,却仍然对自己的身材形象不满意。在肾上腺素和肌酸的刺激下,你唯一缺少的就是一个好的锻炼计划。我们听说最好的健身计划来自 Swole Eagle 健身房,但他们已经关闭了注册,因为美国食品和药物管理局(FDA)正在追捕他们,因为他们有一个令健美运动员痛恨的秘密。你有打破常规的胃口,烤箱里满满的蛋白质饼干也准备好成为一天的运动后甜点,你必须进行正确的锻炼,才能不浪费任何宝贵的肌肉增长潜力。渗入健身房会员资格的入口,获得你知道自己应得的锻炼计划!🍪
solution
exp
Quantum-Safe
description
我听说 Shor 的算法会对 RSA 做各种可怕的事情,所以我决定采用超现代的方法,用酷炫的新 maffs 来保护我的旗帜!
solution
exp
Embryonic Plant
description
在一个末世世界里,你是一位有抱负的植物学家,毕生致力于研究植物及其基因操作,是研究植物胚胎阶段的专家。在你环游世界,希望找到人工培育植物的方法,以抵御地球残酷的环境时,你在一个看似荒凉的地方发现了一个新物种。你知道是时候揭开大自然的秘密了。5 棵植物够吗?
solution
exp
Rhome
description
我收到了这封可爱的信,但寄信人在信上贴了封条。她说,只有在我们家罗姆才能打开。
solution
exp
Secure Signing
description
您能破解我们的超级安全签名 Oracle 吗?