分析

这个题目需要大胆猜。题目信息是:将一个英文字母加密为两个字符

密文是这样的(每次刷新都不一样,所以flag也不一样):

ierkvkllhwhardjzaahardsxrkvknqlf cxrkjz dynywxhwuvnordnydy rdhvsxnq frnynqnqhallny nqjzwxwxnynqnqrvjzaaaauvlf nthanq vkrkrd rdrkrk dysxrvrvsxwxjzaard nysxrdhvnyhwce hhhanq sxrdav ntnyaaaace llrkrkdy qirkwllf abvkrdnyhw rdhvsxnq asnyuvhhrkhwdy hanq nqrkaajzrdsxrkvknj nynydydyfrrkhawlaanqrvrvlf

看上面黑体部分lf。根据题目可以知道有大小写和标点符号。句子末尾的单词应该是句号.故而猜测lf.的密文。

那么第一个字符串部分,ierkvkllhwhardjzaahardsxrkvknqlf就是一句话,去掉lf这个句号之后还有30个密文,也就是15个单词,并且这15个单词可以单独成句。可以想到“Congratulations

有此映射

['ie', 'rk', 'vk', 'll', 'hw', 'ha', 'rd', 'jz', 'aa', 'ha', 'rd', 'sx', 'rk', 'vk', 'nq', 'lf']
Congratulations 

接着根据已知密文,推出其他密文:

#字符串每两个进行分隔,建立字典
miwen = "ierkvkllhwhardjzaahardsxrkvknqlf cxrkjz dynywxhwuvnordnydy rdhvsxnq frnynqnqhallny nqjzwxwxnynqnqrvjzaaaauvlf nthanq vkrkrd rdrkrk dysxrvrvsxwxjzaard nysxrdhvnyhwce hhhanq sxrdav ntnyaaaace llrkrkdy qirkwllf abvkrdnyhw rdhvsxnq asnyuvhhrkhwdy hanq nqrkaajzrdsxrkvknj nynydydyfrrkhawlaanqrvrvlf"
miwen1 = miwen.split(" ")
 
dic = {'ie':'C','rk':'o','vk':'n','ll':'g','hw':'r','ha':'a','rd':'t','jz':'u','aa':'l','sx':'i','nq':'s','lf':'.'}
for i in miwen1:
    a =[]
    for j in range(0,len(i),2):
        a.append(i[j:j+2])        #密文字符串每两个分开
    print(a)
    b = []
    for k in a:
        if k in dic:
            b.append(dic[k])      #解密
        else:
            b.append('?')         #解不出来的用'?'填充
    txt = ''.join(b)
    print(txt)

运行结果:

['ie', 'rk', 'vk', 'll', 'hw', 'ha', 'rd', 'jz', 'aa', 'ha', 'rd', 'sx', 'rk', 'vk', 'nq', 'lf']
Congratulations.
['cx', 'rk', 'jz']
?ou
['dy', 'ny', 'wx', 'hw', 'uv', 'no', 'rd', 'ny', 'dy']
???r??t??
['rd', 'hv', 'sx', 'nq']
t?is
['fr', 'ny', 'nq', 'nq', 'ha', 'll', 'ny']
??ssag?
['nq', 'jz', 'wx', 'wx', 'ny', 'nq', 'nq', 'rv', 'jz', 'aa', 'aa', 'uv', 'lf']
su???ss?ull?.
['nt', 'ha', 'nq']
?as
['vk', 'rk', 'rd']
not
['rd', 'rk', 'rk']
too
['dy', 'sx', 'rv', 'rv', 'sx', 'wx', 'jz', 'aa', 'rd']
?i??i?ult
['ny', 'sx', 'rd', 'hv', 'ny', 'hw', 'ce']
?it??r?
['hh', 'ha', 'nq']
?as
['sx', 'rd', 'av']
it?
['nt', 'ny', 'aa', 'aa', 'ce']
??ll?
['ll', 'rk', 'rk', 'dy']
goo?
['qi', 'rk', 'wl', 'lf']
?o?.
['ab', 'vk', 'rd', 'ny', 'hw']
?nt?r
['rd', 'hv', 'sx', 'nq']
t?is
['as', 'ny', 'uv', 'hh', 'rk', 'hw', 'dy']
????or?
['ha', 'nq']
as
['nq', 'rk', 'aa', 'jz', 'rd', 'sx', 'rk', 'vk', 'nj']
solution?
['ny', 'ny', 'dy', 'dy', 'fr', 'rk', 'ha', 'wl', 'aa', 'nq', 'rv', 'rv', 'lf']
?????oa?ls??.

根据

['cx', 'rk', 'jz']
?ou

猜测'cx'是'Y',构成句子开头You,因为上一句是"Congratulations."

根据

['nq', 'jz', 'wx', 'wx', 'ny', 'nq', 'nq', 'rv', 'jz', 'aa', 'aa', 'uv', 'lf']
su???ss?ull?.

猜测'wx'是'c','ny'是'e','rv'是'f','uv'是'y'

修改代码中的字典赋值一行为:

dic = {'ie':'C','rk':'o','vk':'n','ll':'g','hw':'r','ha':'a','rd':'t','jz':'u','aa':'l','sx':'i','nq':'s','lf':'.','cx':'Y','wx':'c','ny':'e','rv':'f','uv':'y'}

从这里也可以看到大写Y和小写y的密文不一样。

运行结果:

['ie', 'rk', 'vk', 'll', 'hw', 'ha', 'rd', 'jz', 'aa', 'ha', 'rd', 'sx', 'rk', 'vk', 'nq', 'lf']
Congratulations.
['cx', 'rk', 'jz']
You
['dy', 'ny', 'wx', 'hw', 'uv', 'no', 'rd', 'ny', 'dy']
?ecry?te?
['rd', 'hv', 'sx', 'nq']
t?is
['fr', 'ny', 'nq', 'nq', 'ha', 'll', 'ny']
?essage
['nq', 'jz', 'wx', 'wx', 'ny', 'nq', 'nq', 'rv', 'jz', 'aa', 'aa', 'uv', 'lf']
successfully.
['nt', 'ha', 'nq']
?as
['vk', 'rk', 'rd']
not
['rd', 'rk', 'rk']
too
['dy', 'sx', 'rv', 'rv', 'sx', 'wx', 'jz', 'aa', 'rd']
?ifficult
['ny', 'sx', 'rd', 'hv', 'ny', 'hw', 'ce']
eit?er?
['hh', 'ha', 'nq']
?as
['sx', 'rd', 'av']
it?
['nt', 'ny', 'aa', 'aa', 'ce']
?ell?
['ll', 'rk', 'rk', 'dy']
goo?
['qi', 'rk', 'wl', 'lf']
?o?.
['ab', 'vk', 'rd', 'ny', 'hw']
?nter
['rd', 'hv', 'sx', 'nq']
t?is
['as', 'ny', 'uv', 'hh', 'rk', 'hw', 'dy']
?ey?or?
['ha', 'nq']
as
['nq', 'rk', 'aa', 'jz', 'rd', 'sx', 'rk', 'vk', 'nj']
solution?
['ny', 'ny', 'dy', 'dy', 'fr', 'rk', 'ha', 'wl', 'aa', 'nq', 'rv', 'rv', 'lf']
ee???oa?lsff.

根据

['dy', 'ny', 'wx', 'hw', 'uv', 'no', 'rd', 'ny', 'dy']
?ecry?te?

猜测'dy'是'd','no'是'p'从而构成decrypted

根据

['rd', 'hv', 'sx', 'nq']
t?is

猜测'hv'是'h',构成this

根据

['fr', 'ny', 'nq', 'nq', 'ha', 'll', 'ny']
?essage

猜测'fr'是'm',构成message

['dy', 'sx', 'rv', 'rv', 'sx', 'wx', 'jz', 'aa', 'rd']
?ifficult

说明'dy'是'd',上面decrypted已经猜出


修改代码行为:

dic = {'ie':'C','rk':'o','vk':'n','ll':'g','hw':'r','ha':'a','rd':'t','jz':'u','aa':'l','sx':'i','nq':'s','lf':'.','cx':'Y','wx':'c','ny':'e','rv':'f','uv':'y','dy':'d','no':'p','hv':'h','fr':'m'}

运行结果:

['ie', 'rk', 'vk', 'll', 'hw', 'ha', 'rd', 'jz', 'aa', 'ha', 'rd', 'sx', 'rk', 'vk', 'nq', 'lf']
Congratulations.
['cx', 'rk', 'jz']
You
['dy', 'ny', 'wx', 'hw', 'uv', 'no', 'rd', 'ny', 'dy']
decrypted
['rd', 'hv', 'sx', 'nq']
this
['fr', 'ny', 'nq', 'nq', 'ha', 'll', 'ny']
message
['nq', 'jz', 'wx', 'wx', 'ny', 'nq', 'nq', 'rv', 'jz', 'aa', 'aa', 'uv', 'lf']
successfully.
['nt', 'ha', 'nq']
?as
['vk', 'rk', 'rd']
not
['rd', 'rk', 'rk']
too
['dy', 'sx', 'rv', 'rv', 'sx', 'wx', 'jz', 'aa', 'rd']
difficult
['ny', 'sx', 'rd', 'hv', 'ny', 'hw', 'ce']
either?
['hh', 'ha', 'nq']
?as
['sx', 'rd', 'av']
it?
['nt', 'ny', 'aa', 'aa', 'ce']
?ell?
['ll', 'rk', 'rk', 'dy']
good
['qi', 'rk', 'wl', 'lf']
?o?.
['ab', 'vk', 'rd', 'ny', 'hw']
?nter
['rd', 'hv', 'sx', 'nq']
this
['as', 'ny', 'uv', 'hh', 'rk', 'hw', 'dy']
?ey?ord
['ha', 'nq']
as
['nq', 'rk', 'aa', 'jz', 'rd', 'sx', 'rk', 'vk', 'nj']
solution?
['ny', 'ny', 'dy', 'dy', 'fr', 'rk', 'ha', 'wl', 'aa', 'nq', 'rv', 'rv', 'lf']
eeddmoa?lsff.

可以发现还差个'wl',就可以得到flag了

根据

['ll', 'rk', 'rk', 'dy']
good
['qi', 'rk', 'wl', 'lf']
?o?.

猜测'qi'是'j','wl'是'b',从而构成good job

提交

因此flag是eeddmoablsff,提交即可。

重复一下,每次刷新密文都会变,所以你的flag和我做的不同,但是思路最重要。


参考:

wechall Training: Crypto - Digraphs (Crypto, Training) - qq_23997471的博客 - CSDN博客
ctf-wechall-Crypto - zhang14916的博客 - CSDN博客