[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 个明文字符:

  1. 用密文字符反查在 s 中的下标
  2. 逆运算求出 s1 和 s2
  3. 还原:ASCII = s1 * 17 + s2
  4. 转成字符即可得到 flag

大致就是这样,然后有解密的代码:

#已知密文

result = ‘v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i’

#字符表

s = ‘wesyvbniazxchjko1973652048@$+-&*<>’
flag = ‘’

#逐两个字符解密(因为加密时每次加2个字符)

for i in range(len(result) // 2):

#取出密文中的两个字符

​ c1 = result[2i]
​ c2 = result[2
i + 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[2
i + 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}