NSSCTF [SWPUCTF 2021 新生赛]非常简单的逻辑题
打开py附件
这段代码的作用是将flag
字符串按照一定规则加密成result
字符串。具体来说:
- 对于每个明文字符,计算其在字符集
s
中的两个索引s1
和s2
。 - 根据这两个索引,从字符集
s
中取出对应的两个字符,并根据当前位置i
进行偏移。 - 将这两个字符连接起来形成加密后的字符对,最终构建加密后的
result
字符串。
# 初始的明文字符串
flag = 'xxxxxxxxxxxxxxxxxxxxx'
# 自定义的字符集
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
# 初始化加密后的字符串
result = ''
# 遍历明文字符串中的每个字符
for i in range(len(flag)):
# 计算字符在字符集中的索引
s1 = ord(flag[i]) // 17
s2 = ord(flag[i]) % 17
# 根据索引计算加密后的字符对并添加到结果中
result += s[(s1 + i) % 34] + s[-(s2 + i + 1) % 34]
# 输出加密后的结果
print(result)
# 预期的加密后的结果字符串
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
解题方法
1.爆破求解
flag = ''
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
num = 0
for i in range(0, len(result), 2):
for j in range(255):
if s[(j // 17 + num) % 34] == result[i] and s[-(j % 17 + num + 1) % 34] == result[i + 1]:
flag += chr(j)
num += 1
print('Decrypted flag:', flag)
2.求逆
flagg = '' # 存储解密后的明文字符串
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i' # 加密后的字符串
s = 'wesyvbniazxchjko1973652048@$+-&*<>' # 字符集
num = 0
# 遍历加密后的字符串result中的字符对
for i in range(0, len(result), 2):
# 找到对应字符在字符集s中的索引
a1 = s.index(result[i]) # a1 == s1 + num
a2 = s.index(result[i + 1]) # a2 == 34 - (s2 + 1 + num)
# 解密计算,得到明文字符的ASCII码
flag_tmp = (a1 - num) * 17 + (33 - num - a2)
# 将解密后的ASCII码转换为字符并添加到解密后的明文字符串中
flagg = flagg + chr(flag_tmp)
num = num + 1
print(flagg)
得到flag
NSSCTF{Fake_RERE_QAQ}