1

我想用python构建一个密码,它通过从左到右然后从右到左反复遍历移位器的数字来解码文本,并将字母表中的字母移动相应的数字。

例子:

  • 变速杆:123
  • 文本:i like python
  • 过程:i+1=j,空间,l+2=n,i+3=l,k+3=n,e+2=g,空间,p+1=q,y+1=z,t+ 2=v, h+3=j, o+3=q, n+2=p
  • 结果:j nlng qzvjqp

到目前为止的代码:

import string

numbers = ""

x = 3

while x < 10000:
    numbers = numbers + str(x)
    x += 1

shift = 221

#string.ascii_lowercase
letters = string.ascii_letters + string.punctuation + numbers
text = (raw_input("Please enter text"))

encoded = ''
for letter in text:
    if letter == ' ':
        encoded = encoded + ' '
    else:
        x = letters.index(letter) + shift
        encoded = encoded + letters[x]

print encoded

它使用迄今为止的基本编码方法。我很想知道如何在代码中实现上述编码系统。

4

2 回答 2

2

这是您的版本优化(和工作):

import string

shift = 221

letters = string.ascii_letters + string.punctuation + string.digits
text = raw_input("Please enter text\n")

e = ''.join(letters[letters.index(l) + shift % len(letters)]
            if letters.index(l) is not None else ' ' for l in text)
print e

编辑带有数字的部分确实是错误的,因为它在您的编码序列中添加了重复的字母。这意味着编码的文本不能被唯一地解码。

Edit2:如果你想要安全的加密/解密,你需要像 AES 这样的现代算法。如果您希望它自己实现或理解代码,RC4 是一个简单的(但如果使用正确仍然是安全的)替代方案。

Edit3:这是优化版本的 Vigenere:

from itertools import cycle, izip
from operator import add, sub
from string import printable as alphabet

def vigenere(text, key, mode='encode'):
    alen = len(alphabet)
    key = cycle(key + key[-2:0:-1])
    op = add if mode == 'encode' else sub
    return ''.join(alphabet[op(alphabet.index(c),
                               alphabet.index(k)) % alen]
                   for c, k in izip(text, key))

c = vigenere('attack at dawn', 'secret', mode='encode')
print c  # CHFBqN8BF8FoIO
print vigenere(c, 'secret', mode='decode')
于 2012-06-22T10:15:01.083 回答
1

只是为了好玩,这里有一个(故意冗长的)vigenere实现,带有一个“摆”键:

def pendulum(s):
    """Given abcd yields abcdcbabcdc... """
    while True:
        for p in s: yield p
        for p in reversed(s[1:-1]): yield p


def vigenere(text, key, mode='encode'):
    alphabet = 'abcdefghijklmnopqrstuvwxyz '
    key = pendulum(key)
    encoded = ''

    for char in text:
        index = alphabet.index(char)
        offset = alphabet.index(next(key))

        if mode == 'encode':
            shifted = index + offset
        else:
            shifted = index - offset

        encoded += alphabet[shifted % len(alphabet)]
    return encoded

# test

print vigenere('attack at dawn', 'secret', mode='encode') # sxvrgcdrvdveyd
print vigenere('sxvrgcdrvdveyd', 'secret', mode='decode')

如果您有任何问题,请告诉我们。

于 2012-06-22T10:26:11.823 回答