题目描述
被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。
ccehgyaefnpeoobe{lcirg}epriec_ora_g
Solution
题目描述里出现了“栅栏”,暗示这是栅栏密码。栅栏密码把要加密的明文分成 N 个一组,然后把每组的第 1 个字连起来,形成一段无规律的话。题目提到了 5 只小鸡🐥,这可能是把明文 5 个一组进行分组了。
对于栅栏密码,可能存在古典型和 W 型,网友的 Python 解密脚本 如下:
# 若知道栏数,则使用defence解密,若不知道,则使用crack_cipher遍历所有可能性def generate_w(string, n):'''将字符排列成w型'''array = [['.']*len(string) for i in range(n)] # 生成初始矩阵row = 0upflag = Falsefor col in range(len(string)): # 在矩阵上按w型画出stringarray[row][col] = string[col]if row == n-1:upflag = Trueif row == 0:upflag = Falseif upflag:row -= 1else:row += 1return arraydef encode(string, n):'''加密'''array = generate_w(string, n)msg = []for row in range(n): # 将每行的字符连起来for col in range(len(string)):if array[row][col] != '.':msg.append(array[row][col])return array, msgdef decode(string, n):'''解密'''array = generate_w(string, n)sub = 0for row in range(n): # 将w型字符按行的顺序依次替换为stringfor col in range(len(string)):if array[row][col] != '.':array[row][col] = string[sub]sub += 1msg = []for col in range(len(string)): # 以列的顺序依次连接各字符for row in range(n):if array[row][col] != '.':msg.append(array[row][col])return array, msgdef crack_cipher(string):'''破解密码'''for n in range(2, len(string)): # 遍历所有可能的栏数print(str(n)+'栏:'+''.join(decode(string, n)[1]))if __name__ == "__main__":string = "ccehgyaefnpeoobe{lcirg}epriec_ora_g"# n = 2 # 栏数# 若不知道栏数,则遍历所有可能crack_cipher(string)# 若知道栏数#array, msg = decode(string, n)#array, msg = encode(string, n)# for i in array:# print(i)# print(''.join(msg))
跑完结果如下:

本题也可以手算得到答案:

