题目:
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'
思路:
这个就是rsa的CBC模式加密,其中偏移量iv和密文enc_flag已知,同时key的产生途径已知,就是利用爆破把key爆破出来,然后再解密即可
key的加密途径:
n=m % key//相当于key就是(m-n)的一个因子
就把(m-n)进行质因数分解 http://factordb.com/ 在线分解的网站rsa常用
然后得出7个因子,key就是任一因子的相乘
然后还要满足n=m % key的条件,就可以筛选掉一部分的key
同时key还是os.urandom(24)产生的
就还可以滤掉不是24字节的key
exp
from Crypto.Cipher import AES
from Crypto.Util.number import long_to_bytes
from Crypto.Util.number import *
from Crypto.Cipher import AES
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'
m=88007513702424243702066490849596817304827839547007641526433597788800212065249
n=103560843006078708944833658339172896192389513625588
a=[3,37,439,3939851,265898280367,5036645362649,342291058100503482469327892079792475478873]
i=0
j=0
k=0
l=0
s=0
o=0
num=0
for i in range(7):
for j in range(i,7): #这里从i开始就是防止重复的出现,减少之后的工作量,之后的同理
if(a[i]*a[j]>n):
if(n==m%(a[i]*a[j])):
key=a[i]*a[j]
print(key)
for k in range(j,7):
if(a[i]*a[j]*a[k]>n):
if(n==m%(a[i]*a[j]*a[k])):
key=a[i]*a[j]*a[k]
print(key)
for l in range(k,7):
if(a[i]*a[j]*a[k]*a[l]>n):
if(n==m%(a[i]*a[j]*a[k]*a[l])):
key=a[i]*a[j]*a[k]*a[l]
print(key)
for s in range(l,7):
if(a[i]*a[j]*a[k]*a[l]*a[s]>n):
if(n==m%(a[i]*a[j]*a[k]*a[l]*a[s])):
key=a[i]*a[j]*a[k]*a[l]*a[s]
print(key)
for o in range(s,7):
if(a[i]*a[j]*a[k]*a[l]*a[s]*a[o]>n):
if(n==m%(a[i]*a[j]*a[k]*a[l]*a[s]*a[o])):
key=a[i]*a[j]*a[k]*a[l]*a[s]*a[o]
print(key)
print(1)
输出的就是所有的key的可能性,这里不多,就是心情好把输出新建一个txt一个个试也不是不行的(我就是试出来的)
解密脚本:
key_bytes = long_to_bytes(key)
aes = AES.new(key_bytes, AES.MODE_CBC, iv)
decrypted_flag = aes.decrypt(enc_flag)
print(decrypted_flag.rstrip(b"\x00")) #解密就是一个常规的解密,就是需要去除一下空字符
这个比赛其实挺劝退的,主要题少,水平还不行,除了这个简单一点,其它一窍不通
标签:AES,纳新,crypto,Crypto,2024,flag,key,print,import From: https://blog.csdn.net/dreamwang12/article/details/136763581