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}
posted @ 2025-08-24 12:06  JasonJHu  阅读(8)  评论(0)    收藏  举报