0

我正在做一个关于“替代密码”的项目

我得到了我的“钥匙”,这是一系列数字,例如:

a = {12,31,42,1,23,-12,...}  

我的纯文本是 "abcdef" ,然后ord (plain text) = {97,98,99,100,101,102}

基本上我想要做的是将相应的密钥添加到我的纯文本中。

也就是说,当纯文本为 时"a",它是第 0 个字母,因此我想将第 0 个键(即 12)添加到我的 ord "a" 中。当纯文本是"b"时,它是第一个字母,所以我在这个纯文本中添加第一个密钥以获得我的密文。等等。

我该如何开始?

4

2 回答 2

1

您可以使用zip()来配对多个列表的元素:

key = (12, 31, 42, 1, 23, -12)  # a tuple
inputstring = 'abcdef'

for char, keyval in zip(map(ord, inputstring), key):
    # do something with the char ordinal and the key value.

确实假设您的密钥至少与输入字符串一样长。

如果您的输入键是固定长度并且您想重复使用它,您可以使用该itertools.cycle()函数重复循环键并将键值与字符串配对,直到字符串中的字符用完:

from itertools import cycle

key = (12, 31, 42, 1, 23, -12)  # a tuple
inputstring = 'abcdefghijkl'

for char, keyval in zip(map(ord, inputstring), cycle(key)):
    # do something with the char ordinal and the key value.

演示:

>>> from itertools import cycle
>>> key = (12, 31, 42, 1, 23, -12) 
>>> inputstring = 'abcdefghijkl'
>>> for char, keyval in zip(map(ord, inputstring), cycle(key)):
...     print char, keyval
... 
97 12
98 31
99 42
100 1
101 23
102 -12
103 12
104 31
105 42
106 1
107 23
108 -12

在这里,键值重复,因为它们与输入字符串的序数配对。

于 2013-11-12T12:33:21.863 回答
1

正如 Martijn 指出的那样,您正在使用不维护顺序的set概念 ( {}),您可能想要使用列表表示法 ( []) 或元组表示法 ( ())。现在,我们可以对字符串使用 enumerate 来获取字符串中的索引和对应的字符。我们可以在密码表上使用相同的索引来获取对应的数字。

a = [12,31,42,1,23,-12]
plainString, lenA = "abcdef", len(a)
for index, char in enumerate(plainString):
    print char, ord(char), a[index % lenA]

输出

a 97 12
b 98 31
c 99 42
d 100 1
e 101 23
f 102 -12
于 2013-11-12T12:36:38.737 回答