flag = 'xxxxxxxxxxxxxxxxxxxxx'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
c1 = ord(flag[i])//17 #商数
c2 = ord(flag[i])%17 #余数
result += s[(c1+i)%34]+s[-(c2+i+1)%34] #两个一组,打乱s的顺序,两个一组拼接成result
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
直接求解法:
直接用两个if进行判断的,判断是否要不要加上34,而且这里的话你要发现s1*17+s2恰好就是ord(flag[i])的值,这两个点就是解题的要点。明白了这两个点,直接解题法你就可以理解了
flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(21):
s1 = result[i*2]
s2 = result[i*2+1]
x = s.index(s1)
y = s.index(s2) - 34
if x+34-i<17:
a = x+34-i
else:
a= x-i
if -y-i-1+34<17:
b = -y-i-1+34
else:
b = -y-i-1
flag += chr(a*17+b)
print(flag)
爆破解法:
相对于直接解法,爆破解法需要动用的脑汁较少,这里的我也不多讲,直接放代码。
flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(21):
for j in range(126):
s1 = j//17
s2 = j%17
if result[2*i:2*(i+1)] == s[(s1+i)%34]+s[-(s2+i+1)%34]:
flag += chr(j)
print(flag)
126是ascii码可显示字符的范围,相信flag也不可能是不可显示吧。🤪🤪🤪