题目描述

被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂5只小鸡,你嘿嘿一笑对着小鱼说这次可是我先找到答案了。


ccehgyaefnpeoobe{lcirg}epriec_ora_g

Solution

题目描述里出现了“栅栏”,暗示这是栅栏密码。栅栏密码把要加密的明文分成 N 个一组,然后把每组的第 1 个字连起来,形成一段无规律的话。题目提到了 5 只小鸡🐥,这可能是把明文 5 个一组进行分组了。

对于栅栏密码,可能存在古典型和 W 型,网友的 Python 解密脚本 如下:

  1. # 若知道栏数,则使用defence解密,若不知道,则使用crack_cipher遍历所有可能性
  2. def generate_w(string, n):
  3. '''将字符排列成w型'''
  4. array = [['.']*len(string) for i in range(n)] # 生成初始矩阵
  5. row = 0
  6. upflag = False
  7. for col in range(len(string)): # 在矩阵上按w型画出string
  8. array[row][col] = string[col]
  9. if row == n-1:
  10. upflag = True
  11. if row == 0:
  12. upflag = False
  13. if upflag:
  14. row -= 1
  15. else:
  16. row += 1
  17. return array
  18. def encode(string, n):
  19. '''加密'''
  20. array = generate_w(string, n)
  21. msg = []
  22. for row in range(n): # 将每行的字符连起来
  23. for col in range(len(string)):
  24. if array[row][col] != '.':
  25. msg.append(array[row][col])
  26. return array, msg
  27. def decode(string, n):
  28. '''解密'''
  29. array = generate_w(string, n)
  30. sub = 0
  31. for row in range(n): # 将w型字符按行的顺序依次替换为string
  32. for col in range(len(string)):
  33. if array[row][col] != '.':
  34. array[row][col] = string[sub]
  35. sub += 1
  36. msg = []
  37. for col in range(len(string)): # 以列的顺序依次连接各字符
  38. for row in range(n):
  39. if array[row][col] != '.':
  40. msg.append(array[row][col])
  41. return array, msg
  42. def crack_cipher(string):
  43. '''破解密码'''
  44. for n in range(2, len(string)): # 遍历所有可能的栏数
  45. print(str(n)+'栏:'+''.join(decode(string, n)[1]))
  46. if __name__ == "__main__":
  47. string = "ccehgyaefnpeoobe{lcirg}epriec_ora_g"
  48. # n = 2 # 栏数
  49. # 若不知道栏数,则遍历所有可能
  50. crack_cipher(string)
  51. # 若知道栏数
  52. #array, msg = decode(string, n)
  53. #array, msg = encode(string, n)
  54. # for i in array:
  55. # print(i)
  56. # print(''.join(msg))

跑完结果如下:

005-1.png

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

005-2.png