base92 | ISCTF2024 | Crypto ChaCha20-Poly1305
2024年12月10日约 368 字大约 1 分钟
原题
from Crypto.Cipher import ChaCha20_Poly1305
import os
key = os.urandom(32)
nonce = os.urandom(12)
with open('flag.txt', 'rb') as f:
plaintext = f.read()
cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce)
ct, tag = cipher.encrypt_and_digest(plaintext)
print(f"Encrypted Flag: {ct.hex()}")
print(f"Tag: {tag.hex()}")
print(f"Nonce: {nonce.hex()}")
with open('key.txt', 'w') as key_file:
key_file.write(key.hex())
Encrypted Flag: 20408b9fc498063ad53a4abb53633a6a15df0ddaf173012d620fa33001794dbb8c038920273464e13170e26d08923aeb
Tag: 70ffcc508bf4519e7616f602123c307b
Nonce: d8ebeedec812a6d71240cc50
3=t#sMX3?9GHSPdi4i^gk!3*(cH8S8XT2y&?Tv4!?AGG=R]ZDy/PVVa+DqiXAH*}DS&Nn*a+@<H,=!L
题目描述:你的意思是说,只要我继续打 ctf,下次做 crypto 时,就会有一个长腿黑丝双马尾的甜妹突然坐到我的腿上,并害羞的红着脸对我说,前辈你 crypto 打的真厉害,所以要不要和我交往!
分析
查看文件附件提供的可以并不是真正的key
,真正的key
是 32 位 HEX 值。尝试对 key 进行解密,尝试各种解密方案,最后可以通过 base92 对key
进行解密。
另注:这题跟 ChaCha20-Poly1305 一点关系都没有,提交给官方的 Write UP 没说这句。
173974535637a5ef30a116b03d00bd2fe751951ca3eaa62daec2b8f5ca5b6135
获取到key
后,可以编写 payload 解密。
from Crypto.Cipher import ChaCha20_Poly1305
from binascii import unhexlify
# 已知的加密参数(替换为实际值)
key_hex = "173974535637a5ef30a116b03d00bd2fe751951ca3eaa62daec2b8f5ca5b6135"
nonce_hex = "d8ebeedec812a6d71240cc50"
ciphertext_hex = "20408b9fc498063ad53a4abb53633a6a15df0ddaf173012d620fa33001794dbb8c038920273464e13170e26d08923aeb"
tag_hex = "70ffcc508bf4519e7616f602123c307b"
# 转换十六进制为字节
key = unhexlify(key_hex)
nonce = unhexlify(nonce_hex)
ciphertext = unhexlify(ciphertext_hex)
tag = unhexlify(tag_hex)
# 创建解密器
cipher = ChaCha20_Poly1305.new(key=key, nonce=nonce)
try:
# 解密并验证
plaintext = cipher.decrypt_and_verify(ciphertext, tag)
print(f"解密后的明文: {plaintext.decode()}")
except ValueError as e:
print(f"解密失败: {str(e)}")
其实用在线工具也能解出来。