[ACTF新生赛2020]crypto-aes(考点:AES)

#注:文中代码都使用 python3

题目:

from Cryptodome.Cipher import AES
import os
import gmpy2
from flag import FLAG
from Cryptodome.Util.number import *

def main():
    key=os.urandom(2)*16
    iv=os.urandom(16)
    print(bytes_to_long(key)^bytes_to_long(iv))
    aes=AES.new(key,AES.MODE_CBC,iv)
    enc_flag = aes.encrypt(FLAG)
    print(enc_flag)
if __name__=="__main__":
    main()

输出附件:

91144196586662942563895769614300232343026691029427747065707381728622849079757
b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'

题目代码很简明,使用了一个密钥 Key 和初始化向量 IV,选择的CBC模式加密

先分析一下题目中的几个关键函数和方法:

urandom:

语法  os.urandom(size)
参数:
	size:字符串随机字节的大小
	返回值:该方法返回一个字符串,该字符串表示适合加密使用的随机字节。
例 os.urandom(1)
输出:b'\x91'
二进制:10010001 (8bits)

AES.new(key, mode, *args, **kwargs)

param key(参数密钥):
在对称密码中使用的秘密密钥。

它必须为162432个字节长(分别用于AES-128, AES-192或AES-256)。
mode(模式)
模式(支持的MODE_*常量之一)–用于加密或解密的链接模式。
学习链接:https://pycryptodome.readthedocs.io/en/latest/src/cipher/aes.html
Keyword Arguments(关键字参数):
IV(字节,字节组,memoryview- (只适用于MODE_CBC,MODE_CFB,MODE_OFB,和MODE_OPENPGP模式)。

用于加密或解密的初始化向量。

对于MODE_CBC,MODE_CFB和MODE_OFB它必须是16个字节。

解题思路:
解密 flag 我们需要获取到 key 和 iv 的值,由条件:
key=os.urandom(2)*16
iv=os.urandom(16)
可知:key是32bytes,256bits ;iv是16bytes ,128bits

key^iv ,那么只有 iv 与 key的低128位相异或,所以key的高128位是固定不变的。所以输出结果的高128bits,就是key的高128bits,进而可以得到key的所有值256bits。

之后key的低128bits,与输出结果的低128bits 相异或,所得结果就是 iv的值了

key,iv得到后直接aes.decrypt()解密就ok了

#python3
from Crypto.Cipher import AES
import os
from gmpy2 import*
from Crypto.Util.number import*

xor = 91144196586662942563895769614300232343026691029427747065707381728622849079757
enc_flag = b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'
out = long_to_bytes(xor)
key = out[:16]*2
# print(key)
iv = bytes_to_long(key[16:])^bytes_to_long(out[16:])
# print(iv)
iv = long_to_bytes(iv)
# print(iv)
aes = AES.new(key,AES.MODE_CBC,iv)
flag = aes.decrypt(enc_flag)
print(flag)
根据引用\[1\]中的脚本,这段代码是用于解决ACTF新生2020中的base64隐写问题的。该问题涉及到一个名为"abcc.txt"的文件,其中包含了经过base64编码的字符串。脚本通过比较经过隐写处理的字符串和原始字符串的差异,来获取隐写信息。具体的解决过程如下: 1. 首先,脚本会读取"abcc.txt"文件的内容,并将每一行的换行符去除。 2. 然后,脚本会将每一行的字符串进行base64解码,并再次进行base64编码,去除换行符,得到一个经过隐写处理的字符串。 3. 接下来,脚本会调用"get_base64_diff_value"函数,比较经过隐写处理的字符串和原始字符串的差异。该函数会返回两个字符之间在base64字符集中的差值。 4. 如果差异不为0,则将差值转换为二进制,并填充到bin_str字符串中。 5. 如果差异为0,则将"0"填充到bin_str字符串中。 6. 最后,脚本会调用"goflag"函数,将bin_str字符串转换为ASCII字符,并返回解密后的隐写信息。 请注意,这段代码是用于特定比的解决方案,如果你想要解决其他base64隐写问题,可能需要根据具体情况进行修改。 #### 引用[.reference_title] - *1* [[ACTF新生2020]base64隐写 -wp](https://blog.csdn.net/freerats/article/details/108155636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值