IceCTF Crypto Substituted

题目

Lw!

Gyzvecy ke WvyVKT!

W'zz by reso dsbdkwksky tzjq teo kly ujr. Teo keujr, gy joy dksurwmq bjdwv vorakeqojalr jmu wkd jaazwvjkwemd. Vorakeqojalr ljd j zemq lwdkeor, jzklesql gwkl kly juxymk et vecaskyod wk ljd qekkym oyjzzr vecazwvjkyu. Decy dwcazy ezu vwalyod joy kly Vjydjo vwalyo, kly Xwqymyoy vwalyo, kly dsbdkwkskwem vwalyo, glwvl wd klwd emy, jmu de em. Jzcedk jzz et klydy vwalyod joy yjdwzr boeiym keujr gwkl kly lyza et vecaskyod. Decy myg ymvorakwem cykleud joy JYD, kly vsooymk dkjmujou teo ymvorakwem, jzemq gwkl ODJ. Vorakeqojalr wd j xjdk twyzu jmu wd xyor wmkyoydkwmq klesql. De iwvi bjvi, oyju sa em decy veez vwalyod jmu ljxy tsm!

El jmu teo reso oyveoud cr mjcy wd WvyVKT.

分析与解题过程

  1. 单表代替密码,先统计一下字母出现的频率。由于这段文本大写字母较少,故不做大小写的统一直接统计了,代码如下:
c = "Lw!
Gyzvecy ke WvyVKT!
W'zz by reso dsbdkwksky tzjq teo kly ujr. Teo keujr, gy joy dksurwmq bjdwv vorakeqojalr jmu wkd jaazwvjkwemd. Vorakeqojalr ljd j zemq lwdkeor, jzklesql gwkl kly juxymk et vecaskyod wk ljd qekkym oyjzzr vecazwvjkyu. Decy dwcazy ezu vwalyod joy kly Vjydjo vwalyo, kly Xwqymyoy vwalyo, kly dsbdkwkskwem vwalyo, glwvl wd klwd emy, jmu de em. Jzcedk jzz et klydy vwalyod joy yjdwzr boeiym keujr gwkl kly lyza et vecaskyod. Decy myg ymvorakwem cykleud joy JYD, kly vsooymk dkjmujou teo ymvorakwem, jzemq gwkl ODJ. Vorakeqojalr wd j xjdk twyzu jmu wd xyor wmkyoydkwmq klesql. De iwvi bjvi, oyju sa em decy veez vwalyod jmu ljxy tsm!
El jmu teo reso oyveoud cr mjcy wd WvyVKT{jzgjrd_zwdkym_ke_reso_dsbdkwksky_tzjqd}."

upperLetter = []
lowerLetter = []
for i in range(65,91):
    upperLetter.append(chr(i))
for j in range(97,123):
    lowerLetter.append(chr(j))
lst = upperLetter + lowerLetter
d = dict.fromkeys(lst,0)
print(d)
for i in c:
    if i in lst:
        d.update({i:int(d.get(i))+1})
    else:
        continue
print(d)
d = sorted(d.items(),key=lambda item:item[1],reverse=True)
print(d)

得到统计结果为:

[('y', 59), ('k', 51), ('e', 46), ('j', 42), ('o', 40), ('d', 38), ('w', 38), ('l', 34), ('m', 29), ('v', 24), ('z', 23), ('a', 22), ('r', 21), ('u', 18), ('s', 17), ('q', 13), ('c', 12), ('t', 10), ('b', 7), ('g', 7), ('D', 5), ('V', 5), ('i', 4), ('x', 4), ('J', 3), ('T', 3), ('W', 3), ('K', 2), ('E', 1), ('G', 1), ('L', 1), ('O', 1), ('X', 1), ('Y', 1), ('A', 0), ('B', 0), ('C', 0), ('F', 0), ('H', 0), ('I', 0), ('M', 0), ('N', 0), ('P', 0), ('Q', 0), ('R', 0), ('S', 0), ('U', 0), ('Z', 0), ('f', 0), ('h', 0), ('n', 0), ('p', 0)]

  1. 所以基本确定y对应e,k对应t。
    此外从密文中我们可以看到,出现了多次kly的组合,因此l基本可以确定是h。
    然后又发现有klydy和klwd,因此d对应s,w对应i。
    又有注意到有个单字母的词j,所以j应该对应i或者a,因为i以被确定过,所以j对应a。
    有De,其中D对应S,所以e对应o。
  2. 发现最后的flag开头是WvyVKT,而给的字符串开头有Gyzvecy ke WvyVKT!这里的ke对应to,所以判定这应该是Welcome to *
    所以g对用w。
    z对应l
    v对应c
    所以WvyVKT应为IceCTF,故T对应F。
  3. 这个时候flag括号里的内容已经是alwars_listem_to_roso_ssbstitste_flaqs了,所以r应当对应y(always),m对应n(listen),s对应u(substitute),q对应g(flags)。再做替换
  4. 这次替换后,我们在结果中找到

    所以应有o对应r
  5. 此次输出结果已将flag括号内所有字符都解出来了:always_listen_to_your_substitute_flags,加上以上我们已经得到的开头则有IceCTF
c = "Lw!
Gyzvecy ke WvyVKT!
W'zz by reso dsbdkwksky tzjq teo kly ujr. Teo keujr, gy joy dksurwmq bjdwv vorakeqojalr jmu wkd jaazwvjkwemd. Vorakeqojalr ljd j zemq lwdkeor, jzklesql gwkl kly juxymk et vecaskyod wk ljd qekkym oyjzzr vecazwvjkyu. Decy dwcazy ezu vwalyod joy kly Vjydjo vwalyo, kly Xwqymyoy vwalyo, kly dsbdkwkskwem vwalyo, glwvl wd klwd emy, jmu de em. Jzcedk jzz et klydy vwalyod joy yjdwzr boeiym keujr gwkl kly lyza et vecaskyod. Decy myg ymvorakwem cykleud joy JYD, kly vsooymk dkjmujou teo ymvorakwem, jzemq gwkl ODJ. Vorakeqojalr wd j xjdk twyzu jmu wd xyor wmkyoydkwmq klesql. De iwvi bjvi, oyju sa em decy veez vwalyod jmu ljxy tsm!
El jmu teo reso oyveoud cr mjcy wd WvyVKT{jzgjrd_zwdkym_ke_reso_dsbdkwksky_tzjqd}."

upperLetter = []
lowerLetter = []
for i in range(65,91):
    upperLetter.append(chr(i))
for j in range(97,123):
    lowerLetter.append(chr(j))
lst = upperLetter + lowerLetter
d = dict.fromkeys(lst,0)
for i in c:
    if i in lst:
        d.update({i:int(d.get(i))+1})
    else:
        continue
print(d)
d = sorted(d.items(),key=lambda item:item[1],reverse=True)
print(d)

m = ""
for i in c:
    if i == 'y':
        i = 'e'
    elif i == 'k':
        i = 't'
    elif i == 'l':
        i = 'h'
    elif i == 'd':
        i = 's'
    elif i == 'w':
        i = 'i'
    elif i == 'j':
        i = 'a'
    elif i == 'e':
        i = 'o'
    elif i == 'g':
        i = 'w'
    elif i == 'z':
        i = 'l'
    elif i == 'v':
        i = 'c'
    elif i == 'c':
        i = 'm'
    elif i == 't':
        i = 'f'
    elif i == 'r':
        i = 'y'
    elif i == 'm':
        i = 'n'
    elif i == 's':
        i = 'u'
    elif i == 'q':
        i = 'g'
    elif i == 'o':
        i = 'r'
    m += i
print(m)
原文地址:https://www.cnblogs.com/vict0r/p/13503759.html