hint:key key key
AES里面cbc模式的题,需要密文c,密钥key,偏移向量iv,已知iv,c,其中他的key经过一个模运算的加密,我们所要做的就是还原key的值
n=m%key
=>k*key=m-n
(k是一个整数,使上面的式子满足条件)
我们对m-n进行分解素数,使用了风二西的工具
这题能分解就一定可以还原key,
把分解后的数放在一个list里,找到他们所有的作乘法的可能,还原成字符串就是key的值
其中还原key有一个提示的flag{you_did_it}(可能不准确,大致的记忆),就知道做的是正解
找到其中24字节的key即可解出(文中exp并没有做出过滤就能出了,就没详细补充)
得到结果如下
原题:
import os
# from flag import flag
from Crypto.Util.number import *
from Crypto.Cipher import AES
m = 88007513702424243702066490849596817304827839547007641526433597788800212065249
key = os.urandom(24)
key = bytes_to_long(key)
n=m % key
flag += (16 - len(flag) % 16) * b'\x00'
iv = os.urandom(16)
aes = AES.new(key,AES.MODE_CBC,iv)
enc_flag = aes.encrypt(flag)
print(n)
print(enc_flag)
print(iv)
#103560843006078708944833658339172896192389513625588
#b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
#b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'
题解exp:
from itertools import combinations
from Crypto.Util.number import *
from Crypto.Cipher import AES
# 原始列表
list1 = [3, 37, 439, 3939851, 265898280367, 5036645362649, 342291058100503482469327892079792475478873]
# 存储所有乘积结果的列表
all_products = []
# 存储有效的密钥
key_list = []
# 遍历组合长度从2到列表长度的所有可能情况
for r in range(2, len(list1) + 1):
# 生成当前长度的所有组合
comb = combinations(list1, r)
# 遍历组合并计算乘积
for c in comb:
product = 1
for num in c:
product *= num
all_products.append(product)
# 输出所有乘积结果
print("列表中所有数字的所有可能乘积为:")
for product in all_products:
print(product)
key_list.append(long_to_bytes(product))
# 已知数据
enc_flag = b'\xfc\x87\xcb\x8e\x9d\x1a\x17\x86\xd9~\x16)\xbfU\x98D\xfe\x8f\xde\x9c\xb0\xd1\x9e\xe7\xa7\xefiY\x95C\x14\x13C@j1\x9d\x08\xd9\xe7W>F2\x96cm\xeb'
iv = b'UN\x1d\xe2r<\x1db\x00\xdb\x9a\x84\x1e\x82\xf0\x86'
for key in key_list:
try:
aes = AES.new(key, AES.MODE_CBC, iv)
dec_flag = aes.decrypt(enc_flag)
# 去除填充
dec_flag = dec_flag.rstrip(b'\x00')
print(dec_flag.decode())
except ValueError:
# AES解密失败,跳过当前密钥
continue