#Scytatle
"Scytale 是最早已知的加密设备之一,古希腊人(即斯巴达人)在军事行动中使用。 它由一根圆柱形杆或杖组成,周围缠绕着一条长长的羊皮纸。发送者只需沿着杆的长度和条带的风写下信息,直到到达羊皮纸的末端,然后转动圆柱体并继续写下一行。展开羊皮纸后,文字变得难以理解。 为了解密消息,它将被包裹在另一个相同直径的镰刀上,之后可以沿着它读取明文。
Scytale 是一种换位密码。与 Atbash 或 Caesar 密码等替换密码不同,这里的明文字母保持不变,但它们的顺序发生了变化。"
from typing import Optional
def scytale_decipher(ciphertext: str, crib: str) -> Optional[str]:
decrypted_sentence = []
for n in range(3, len(ciphertext)): # 包含上限和下限三棱柱
slice_length = n
count = 1
transposed = {i: [] for i in range(slice_length)}
# 每隔slice_length个字符进行切片
slices = [ciphertext[i:i+slice_length]
for i in range(0, len(ciphertext), slice_length)]
# 遍历切片,并将对应位置的字符添加到transposed字典中
for slice in slices:
for index, char in enumerate(slice):
# 只添加那些索引在slice_length范围内的字符
if index < slice_length:
transposed[index].append(char)
# 将每个位置的字符列表拼接成字符串,并返回结果列表
decrypted_words = [''.join(chars)
for index, chars in sorted(transposed.items())]
new = ''.join(map(str, decrypted_words))
# 检查crib是否存在于拼接后的字符串中
if crib in new:
decrypted_sentence.append(new)
print(decrypted_sentence)
if len(decrypted_sentence) == 1:
return decrypted_sentence[0]
return None # 如果没有找到匹配的crib,返回None
# 测试函数
result = scytale_decipher('hdoeerlallrdow', 'world')
print(result) # 如果解密成功,应输出'world'