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 に答える