AES加密解密

题目:

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  # 生成一个随机的密钥,长度为32字节(256位)
    iv = os.urandom(16)  # 生成一个随机的初始化向量,长度为16字节(128位)
    print(bytes_to_long(key) ^ bytes_to_long(iv))  # 将密钥和初始化向量转换为长整数,并执行异或操作,然后打印结果
    #91144196586662942563895769614300232343026691029427747065707381728622849079757
    aes = AES.new(key, AES.MODE_CBC, iv)  # 使用密钥、模式(CBC)和初始化向量创建一个新的AES加密对象
    enc_flag = aes.encrypt(FLAG)  # 使用AES加密对象对FLAG进行加密,并将加密后的结果存储在enc_flag变量中
    print(enc_flag)  # 打印加密后的FLAG
    #\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p

if __name__ == "__main__":
    main()  # 如果当前模块是主模块,则调用main函数

解题思路:

  • 输出了两个值,一个keyiv(偏移量)xor的结果,一个enc_flag也就是keyiv利用aescbc模式加密后的结果
  • key的值是随机生成了16字节,然后*2,变成32字节的,其实也就是说key的高位128位和低位128位是相同的
  • iv是16字节的,也就是128位的,那么去计算key和iv的异或时,其实key仅有低位参与了异或运算,高位相当于没变
  • key和iv仅异或了低16字节,key的高16字节是不变的,所有由aes.py中key是生成来看解题思路,获取了key的高16字节,便获取了key的256位
  • 然后通过key的低位与xor的低位进行异或得到的结果就是aes.py中的iv

解答:

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              #取了之前加密key和iv的异或的前16字节,相当于取了高位的128位。
iv = bytes_to_long(key[16:])^bytes_to_long(out[16:])    #此时取了key的后16位与xor的后16位进行xor来还原iv
iv = long_to_bytes(iv)
aes = AES.new(key,AES.MODE_CBC,iv)
flag = aes.decrypt(enc_flag)
print(flag)
#actf{W0W_y0u_can_so1v3_AES_now!}
posted @ 2025-03-12 00:02  sevensnight  阅读(61)  评论(0)    收藏  举报