[SWPUCTF 2021 新生赛]非常简单的逻辑题
[SWPUCTF 2021 新生赛]非常简单的逻辑题
这道题拿到附件是一个python的程序,
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’
扔给ai之后,
核心原理(看懂加密→解密)
1. 加密逻辑(原题代码)
每次从 flag 取1 个字符,拆成两个值:
- s1 = 字符ASCII码 // 17
- s2 = 字符ASCII码 % 17
再从字符表 s 中取两个字符拼接:
- 第 1 个:s[(s1+i) % 34]
- 第 2 个:s[-(s2+i+1) % 34]
1 个明文字符 → 2 个密文字符
2. 解密逻辑(逆向推导)
已知2 个密文字符,还原1 个明文字符:
- 用密文字符反查在
s中的下标 - 逆运算求出
s1和s2 - 还原:
ASCII = s1 * 17 + s2 - 转成字符即可得到 flag
大致就是这样,然后有解密的代码:
#已知密文
result = ‘v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i’
#字符表
s = ‘wesyvbniazxchjko1973652048@$+-&*<>’
flag = ‘’
#逐两个字符解密(因为加密时每次加2个字符)
for i in range(len(result) // 2):
#取出密文中的两个字符
c1 = result[2i]
c2 = result[2i + 1]
#逆向计算 s1 和 s2
s1 = (s.index(c1) - i) % 34
s2 = (- (s.index(c2) + i + 1)) % 34
#还原原始字符
char_ord = s1 * 17 + s2
flag += chr(char_ord)
print(“解密后的flag:”, flag)
有wp的代码,可能比ai给的简单点:
result=‘v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i’
s = ‘wesyvbniazxchjko1973652048@$+-&*<>’
flag = ‘’
for i in range(len(result) // 2):
c1 = result[2i]
c2 = result[2i + 1]
for j in range(32, 126):
s1 = j // 17
s2 = j % 17
if s[(s1 + i) % 34] == c1 and s[-(s2 + i + 1) % 34] == c2:
flag += chr(j)
break
print(flag)
得到flag:NSSCTF{Fake_RERE_QAQ}