深入浅出,知无不答,言无不尽,力求详尽
它那个代码逻辑乱, 大部分人做不出来可能是因为这个原因, 我用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))
这题简单没啥好细说的, 密码学也不好讲, 就这样吧...