这里有人试过在 Python 上对 Scytale Cipher 进行编码和解码吗?
Has anyone here tried to encode and decode Scytale Cipher on Python?
我似乎无法在网上找到任何有用的教程/指南,我陷入了困境。请帮忙!
首先,您应该尝试考虑一下 scytale 如何将写在缠绕在它周围的条带上的文本的字母调换。为此,绘制 table 可能会有所帮助。例如,您可以制作一个天空故事,您可以在上面围绕圆周写 5 个字母,然后您可能想在上面写上“这是如何工作的”。您可以按照以下方式执行此操作,在每行上写 3 个字母(删除空格并大写所有内容)。
col0
col1
col2
row0
H
O
W
row1
D
O
E
row2
S
T
H
row3
I
S
W
row4
O
R
K
如果您逐列阅读此 table,您会按照它们从 skytale 展开后出现在条带上的顺序获得字母。这一切都归结为一个相对简单的模式。如果您将网格视为矩阵,那么对于 encode/decode,您基本上只需要转置该矩阵(行变为列,列变为行)。有几种方法可以尝试实现加密和解密,您应该首先尝试自己找到一种方法。这是一种方法。如果您对明文中的字符使用基于 0 的索引,则将字符的索引除以行数会得到该字符在 table 中的行,而除法的其余部分(即模运算) 给你它的专栏。以下代码使用此观察计算每个明文字母的密文索引。
def encrypt(rows, plaintext):
assert len(plaintext) % rows == 0
n = len(plaintext)
columns = n // rows
ciphertext = ['-'] * n
for i in range(n):
row = i // columns
col = i % columns
ciphertext[col * rows + row] = plaintext[i]
return "".join(ciphertext)
def decrypt(rows, ciphertext):
assert len(ciphertext) % rows == 0
return encrypt(len(ciphertext) // rows, ciphertext)
只有当 plain-/ciphertext 的长度可以被行数整除时,这些函数才有效。使该方案在所有情况下都有效的一种方法是,当文本的长度不能被行整除时,用随机字符扩展文本。请注意,您基本上也可以只使用加密函数来解密(如您在代码中所见)。可以肯定的是,我希望您知道这个加密方案非常容易破解这一事实。你不应该在实践中使用它!
我似乎无法在网上找到任何有用的教程/指南,我陷入了困境。请帮忙!
首先,您应该尝试考虑一下 scytale 如何将写在缠绕在它周围的条带上的文本的字母调换。为此,绘制 table 可能会有所帮助。例如,您可以制作一个天空故事,您可以在上面围绕圆周写 5 个字母,然后您可能想在上面写上“这是如何工作的”。您可以按照以下方式执行此操作,在每行上写 3 个字母(删除空格并大写所有内容)。
col0 | col1 | col2 | |
---|---|---|---|
row0 | H | O | W |
row1 | D | O | E |
row2 | S | T | H |
row3 | I | S | W |
row4 | O | R | K |
如果您逐列阅读此 table,您会按照它们从 skytale 展开后出现在条带上的顺序获得字母。这一切都归结为一个相对简单的模式。如果您将网格视为矩阵,那么对于 encode/decode,您基本上只需要转置该矩阵(行变为列,列变为行)。有几种方法可以尝试实现加密和解密,您应该首先尝试自己找到一种方法。这是一种方法。如果您对明文中的字符使用基于 0 的索引,则将字符的索引除以行数会得到该字符在 table 中的行,而除法的其余部分(即模运算) 给你它的专栏。以下代码使用此观察计算每个明文字母的密文索引。
def encrypt(rows, plaintext):
assert len(plaintext) % rows == 0
n = len(plaintext)
columns = n // rows
ciphertext = ['-'] * n
for i in range(n):
row = i // columns
col = i % columns
ciphertext[col * rows + row] = plaintext[i]
return "".join(ciphertext)
def decrypt(rows, ciphertext):
assert len(ciphertext) % rows == 0
return encrypt(len(ciphertext) // rows, ciphertext)
只有当 plain-/ciphertext 的长度可以被行数整除时,这些函数才有效。使该方案在所有情况下都有效的一种方法是,当文本的长度不能被行整除时,用随机字符扩展文本。请注意,您基本上也可以只使用加密函数来解密(如您在代码中所见)。可以肯定的是,我希望您知道这个加密方案非常容易破解这一事实。你不应该在实践中使用它!