ByteCTF2021 Crypto - easyxor writeup

easyxor

shift函数是个常见的移位异或操作,convert是对一个数字使用不同的key和mask进行4次移位异或,这个函数在已知key的情况下是可逆的。

encrypt函数是对明文块进行两种模式(CBC和OFB)的块加密,块长度为8,对于每一块的加密使用的就是上面的convert函数。

首先通过密文的长度可以得知一共被分成了6块;前3块明文使用OFB模式,后三块明文使用CBC模式;keys是一个长度为4的列表,列表中每个值的范围是(-32, 32), 6 4 4 64^4 644爆破也是可以接受的。

读完题目代码之后可以想到其实我们已经知道第一块明文了,就是flag的格式ByteCTF{ ,而OFB模式实际上是加密的key,最终结果和明文块异或,所以第一个明文块异或第一个密文块就可以知道第一个key加密的结果,也就是cur_c = convert(last, k)cur_c,这样就可以得到第二块的last。

现在对于第二块,已知IV(last),未知keys,已知明文是可显示字符,所以可以爆破keys了,把能解出可显示字符明文的keys都保留出来,发现有4836个keys是满足的,那么我们还要借助第三块再筛一次,最终只得到一组keys。

from itertools import product
from tqdm import tqdm
from Crypto.Util.number import bytes_to_long, long_to_bytes
def check(s):
    return min([((i<129) and (i>31)) for i in s])

c = "89b8aca257ee2748f030e7f6599cbe0cbb5db25db6d3990d3b752eda9689e30fa2b03ee748e0da3c989da2bba657b912"
c_list = [int(c[i*16:i*16+16], 16) for i in range(len(c)//16)]
known_m = bytes_to_long(b'ByteCTF{')
range64 = list(range(-32, 33))
cur_c = known_m^c_list[
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值