我正在尝试使用已知的密钥矩阵创建一个破解Hill密码的程序,当我输入密文并将字母转换为数字时,我将其用于循环:
letters = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = input('Enter your ciphertext')
ciphertext = list(ciphertext.lower())
for symbol in ciphertext:
num = int(letters.find(symbol))
print(num)
我想知道是否有办法将打印的数字传输到数组中,我用它来表示Hill密码中涉及的矩阵,因为我需要将每个2个字母的块插入到2x1矩阵,以便对每个矩阵进行矩阵乘法,以获得明文。
基本上,我试图以最有效的方式将for循环中的数字转换为数组,但我在python中编码非常新,所以我不知道我会怎么做。
另外,在python中使用矩阵是否只是一种更简单的方法,我不知道这将使整个事情变得更容易?
答案 0 :(得分:2)
看起来您想要在列表中返回字符的ASCII值。您可以使用列表推导在线性时间内完成此操作。
symbols = 'axy12c'
lst = [ord(c) - ord('a') if c.isalpha() and c.islower() else -1 for c in symbols]
print(lst)
[0, 23, 24, -1, -1, 2]
既然你提到数组,那么这也是一种愚蠢的方式,瞧瞧。
arr = np.array(list(symbols), dtype='|S1').view(np.int8) - 97
arr[(0 > arr) | (25 < arr)] = -1
print(arr)
array([ 0, 23, 24, -1, -1, 2], dtype=int8)
答案 1 :(得分:1)
是的,你应该使用列表理解:
letters = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = input().lower()
indices = [letters.find(c) for c in ciphertext]
这会将letters.find(c)
附加到c
中每个字母(此处称为ciphertext
)的索引。
但如果letters
始终是字母表(并且它看起来像维基百科那样),你可以使用ord
来加快速度,它会为你提供每个字母的ASCII索引。要使其'a'
为0
,您只需减去ord('a')
:
ciphertext = input().lower()
indices = [ord(c) - ord('a') for c in ciphertext]
查看维基百科的Hill Cipher,看起来你所描述的并不完全符合你的需要。
我的理解是你的关键必须是一个完美的正方形(n ^ 2)。然后,您将密钥整形为n
个n
矩阵,并将其乘以明文的n
个块。你应该研究numpy。它有很多用于处理矩阵的工具,我很确定你可以用几行来表达这个密码:
import numpy as np
ciphertext = np.array(map(ord, input().lowercase())) - ord('a')
n = int(sqrt(len(ciphertext)))
assert n**2 == len(ciphertext), 'ciphertext must be perfect square in length'
ciphertext.reshape((n, n)) # Make ciphertext a nxn matrix
# Matrix multiply plaintext chunks of n by ciphertext
plaintext.reshape((n, -1)) @ ciphertext
似乎密文也必须是可逆的。 numpy allows you to check that the ciphertext is invertible (and compute its inverse),而不必自己编写linalg内容。
答案 2 :(得分:0)
这是将它们列入清单的方法。
letters = 'abcdefghijklmnopqrstuvwxyz'
ciphertext = input('Enter your ciphertext')
ciphertext = list(ciphertext.lower())
desiredArray = list(map(lambda x: int(letters.find(x)), ciphertext))
这将您的查找和转换定义为&#34; lambda&#34;功能; &#34;地图&#34;函数将lambda函数映射到密文的元素,以及&#34; list&#34; function将结果转换为列表。这些都是值得学习的python。