2024吾杯网络安全技能大赛 Crypto-Easy题 - 附详细脚本

深入浅出,知无不答,言无不尽,力求详尽

它那个代码逻辑乱, 大部分人做不出来可能是因为这个原因, 我用python重写了一下, 逻辑上大概相同, 这个看不懂也没办法, 你都没办法, 我怎么会有办法呢...

s = [i for i in range(256)]  # 初始化s列表
t = [''] * 256  # 初始化t列表
key = "hello world"  # 密钥


flag = "?"  # 需要逆向回去的flag


# t密钥数组
for i in range(256):
    t[i] = key[i % len(key)]

j = 0

# 第一次置换
for i in range(256):
    j = (j + s[i] + ord(t[i])) % 256
    s[i], s[j] = s[j], s[i]  

# 第二次置换
i = 0
j = 0
for m in range(37):
    i = (i + 1) % 256  
    j = (j + s[i]) % 256  
    s[i], s[j] = s[j], s[i]  
    x = (s[i] + s[j]) % 256  
    flag[m] = chr(ord(flag[m]) ^ s[x] % 256)  

# 这里简化一下, flag输出到文件了
print(flag)

下面是解题脚本, 已经非常详尽了。

# 悟杯Wucup - Easy题专用 by Vvu1pes

# 初始化输入值
key = "hello world"
flag = "d8 d2 96 3e 0d 8a b8 53 3d 2a 7f e2 96 c5 29 23 39 24 6e ba 0d 29 2d 57 52 57 83 59 32 2c 3a 77 89 2d fa 72 61 b8 4f"

t = []

# flag转换成列表
flag1 = flag.split(" ")

for i in range(len(flag1)):
    flag1[i] = int(flag1[i], 16)

# 初始化s索引列表
s = []
for i in range(256):
    s.append(i)
    
# 初始化t 索引列表
for i in range(256):
    t.append(ord(key[i % len(key)]))

# s和t置换
j = 0
for i in range(256):
    j = (j + s[i] + t[i]) % 256
    s[i], s[j] = s[j], s[i]

# 对flag进行异或
i = 0
j = 0
for m in range(39):
    i = (i + 1) % 256
    j = (j + s[i]) % 256
    s[i], s[j] = s[j], s[i]
    x = (s[i] + s[j]) % 256
    flag1[m] ^= s[x]
    flag1[m] = chr(flag1[m])

# 答案输出
flag1 = "".join(flag1)
print(flag1)

源十六进制数据, 一般十六进制都是两个两个处理的, 做题应该要有的经验, 那么怎么把这串数据分割成两位两位呢?

d8d2 963e 0d8a b853 3d2a 7fe2 96c5 2923
3924 6eba 0d29 2d57 5257 8359 322c 3a77
892d fa72 61b8 4f

也要靠我们的python来写脚本:

# 数据分割专用脚本 -By Vvu1pes 20/11/11 1:11
def split_data(data, division):
    result = []
    i = 0
    
    data = data.replace('\n','') # 处理换行符
    data = data.replace(' ', '') # 处理空格
    
    while i < len(data):
        result.append(data[i:i + division] + " ")
        i += division
        
    # 输出数据处理成字符串
    result = ''.join(result)
    return result

# 需要分隔的数据
data = """d8d2 963e 0d8a b853 3d2a 7fe2 96c5 2923
3924 6eba 0d29 2d57 5257 8359 322c 3a77
892d fa72 61b8 4f"""

division = int(input("分割几个字符: "))

print(split_data(data, division))

这题简单没啥好细说的, 密码学也不好讲, 就这样吧...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值