题目描述
被小鱼一连将了两军,你心里更加不服气了。两个人一起继续往前走, 一路上杂耍卖艺的很多,但是你俩毫无兴趣,直直的就冲着下一个谜题的地方去了。 到了一看,这个谜面看起来就已经有点像答案了样子了,旁边还画着一张画,是一副农家小院的 图画,上面画着一个农妇在栅栏里面喂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 = 0
upflag = False
for col in range(len(string)): # 在矩阵上按w型画出string
array[row][col] = string[col]
if row == n-1:
upflag = True
if row == 0:
upflag = False
if upflag:
row -= 1
else:
row += 1
return array
def 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, msg
def decode(string, n):
'''解密'''
array = generate_w(string, n)
sub = 0
for row in range(n): # 将w型字符按行的顺序依次替换为string
for col in range(len(string)):
if array[row][col] != '.':
array[row][col] = string[sub]
sub += 1
msg = []
for col in range(len(string)): # 以列的顺序依次连接各字符
for row in range(n):
if array[row][col] != '.':
msg.append(array[row][col])
return array, msg
def 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))
跑完结果如下:
本题也可以手算得到答案: