2024年VCTF纳新赛 crypto 狂飙

题目:

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'

思路:

        这个就是AES的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")) #解密就是一个常规的解密,就是需要去除一下空字符

完整exp(就是电脑负担小,运行就秒出):

from Crypto.Cipher import AES
from Crypto.Util.number import long_to_bytes
import os
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'  # 加密后的flag,应该是一个字节串# 加密时使用的密钥,需要是长整数形式
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):
        if(a[i]*a[j]>n):
            if(n==m%(a[i]*a[j])):
                key=a[i]*a[j]
                key_bytes = long_to_bytes(key)
                if(len(key_bytes)==24):
                    aes = AES.new(key_bytes, AES.MODE_CBC, iv)
                    decrypted_flag = aes.decrypt(enc_flag)
                    print(decrypted_flag.rstrip(b"\x00"))
        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]
                    key_bytes = long_to_bytes(key)
                    if(len(key_bytes)==24):
                        aes = AES.new(key_bytes, AES.MODE_CBC, iv)
                        decrypted_flag = aes.decrypt(enc_flag)
                        print(decrypted_flag.rstrip(b"\x00"))
            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]
                        key_bytes = long_to_bytes(key)
                        if(len(key_bytes)==24):
                            aes = AES.new(key_bytes, AES.MODE_CBC, iv)
                            decrypted_flag = aes.decrypt(enc_flag)
                            print(decrypted_flag.rstrip(b"\x00"))
                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]
                            key_bytes = long_to_bytes(key)
                            if(len(key_bytes)==24):
                                aes = AES.new(key_bytes, AES.MODE_CBC, iv)
                                decrypted_flag = aes.decrypt(enc_flag)
                                print(decrypted_flag.rstrip(b"\x00"))
                    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]
                                key_bytes = long_to_bytes(key)
                                if(len(key_bytes)==24):
                                    aes = AES.new(key_bytes, AES.MODE_CBC, iv)
                                    decrypted_flag = aes.decrypt(enc_flag)
                                    print(decrypted_flag.rstrip(b"\x00"))
print(1)

这个比赛其实挺劝退的,主要题少,个人水平还不行,除了这个简单一点,其它一窍不通

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值