202312_古剑山杯_Vigenere++
0x01 题目
import sys
from secret_file import *
def _l(idx, s):
return s[idx:] + s[:idx]
def main(p, k1, k2):
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
i1 = 0
i2 = 0
c = ""
for a in p:
c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])]
i1 = (i1 + 1) % len(k1)
i2 = (i2 + 1) % len(k2)
return c
flag="flag{************************}"
key="**********"
# * 为马赛克,长度为1。
# hint: 可以自己尝试下运行加密函数,看看秘钥对加密结果的影响。
# hint: 首先根据线索求秘钥,秘钥不唯一,找到一个有效的,就能爆破flag了。
print main(flag, key, key[::-1])
# 程序运行结果(即密文为):
kqTyKgfxgXT5a_RiTAua4_sbMkjDyE
0x02 WP
先利用flag的前5位flag{
进行key
爆破,再使用key
对密文进行维吉尼亚解密
def _l(idx, s):
return s[idx:] + s[:idx]
def main(p, k1, k2):
s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz_{}"
t = [[_l((i+j) % len(s), s) for j in range(len(s))] for i in range(len(s))]
i1 = 0
i2 = 0
c = ""
for a in p:
c += t[s.find(a)][s.find(k1[i1])][s.find(k2[i2])]
i1 = (i1 + 1) % len(k1)
i2 = (i2 + 1) % len(k2)
return c
flag="flag{************************}"
key="**********"
sOutput="kqTyKgfxgXT5a_RiTAua4_sbMkjDyE"
# * 为马赛克,长度为1。
# hint: 可以自己尝试下运行加密函数,看看秘钥对加密结果的影响。
# hint: 首先根据线索求秘钥,秘钥不唯一,找到一个有效的,就能爆破flag了。
key2=""
# 爆破key,得到key2
for i in range(0,5):
for j in range(32,127):
tmpKey=(key2+chr(j)+key)[0:len(key)]
if sOutput[i]==main(flag, tmpKey, tmpKey[::-1])[i]:
key2 = key2+chr(j)
print(tmpKey,sOutput[i],main(flag, tmpKey, tmpKey[::-1])[i])
break
key2=(key2+key)[0:len(key)]
print("\n key is :",key2,"\n")
# key is : GGnTN*****
# 利用key2爆破flag
for i in range(len(flag)-1):
for j in range(32, 127):
if i!=(len(flag)):
tmpFlag=flag[0:i]+chr(j)+flag[i+1:]
else:
tmpFlag=flag[0:i]+chr(j)
sOutput2=main(tmpFlag, key2, key2[::-1])
if sOutput2[i]==sOutput[i]:
print(tmpFlag)
flag=tmpFlag
break
print("\nflag is :",flag)
# flag is : flag{4XLbSO0riF6BRp5ZvGTA81Ut}