首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字母移位的一次性衬垫加密

基于字母移位的一次性衬垫加密
EN

Code Review用户
提问于 2017-01-06 20:50:11
回答 1查看 402关注 0票数 4

这个程序要求用户输入一个单词列表。然后,它返回一个加密单词列表和第二个列表,该列表指定用于加密这些单词的数字移位。这个想法是从https://www.khanacademy.org/computing/computer-science/cryptography/crypt/v/one-time-pad得到的。

代码语言:javascript
复制
import random

def rotate_letter(letter, number):
    if letter == ' ':
        return letter
    if letter.islower():
        start = ord('a')
    elif not letter.islower():
        start = ord('A')

    normal_shift = ord(letter) - start
    new_letter = start + (normal_shift + number) % 26
    return chr(new_letter)

def avoid(letter):
    avoid = ' ,!?¿,*+-%/@1234567890'
    for i in avoid:
        if i == letter:
            return False
    return True

def rotate_word(word):
    new_word = ''
    random_series = []
    for letter in word:
        if avoid(letter):
            random_number = random.randint(1,26)
            new_letter = rotate_letter(letter, random_number)
            new_word += new_letter
            random_series.append(random_number)
        else:
            new_word += letter
    return (new_word, random_series)

def shift(words):
    index = 0
    encrypted_words = []
    random_shifts = []
    while index < len(words):
        (new_word, random_series) = rotate_word(words[index])
        encrypted_words.append(new_word)
        random_shifts.append(random_series)
        index += 1
    return (encrypted_words, random_shifts)

def get_input():
    words = []
    while True:
        user = (input('Input words to encrypt. Done when ready \n' ))
        if user == 'Done' or user == 'done':
            return words
        words.append(user)

def start():
    words = get_input()
    encrypted_words = []
    random_shifts = []
    (encrypted_words, random_shifts) = shift(words)
    print('UNENCRYPTED WORDS', words)
    print('ENCRYPTED WORDS', encrypted_words)
    print('RANDOM SHIFTS', random_shifts)

start()
EN

回答 1

Code Review用户

发布于 2017-01-06 22:09:26

您的函数avoid是非常不必要的,也是令人困惑的。我希望avoid('@')返回True。当您将字母存储为全局常量和设置时,您应该获得一定的速度(因为它不需要一次又一次地重构,而且对于set来说成员资格测试非常快。我用letter not in letters_avoid代替了你的功能。

每当您在Python中进行字符串添加时,您可能做错了什么。这是因为字符串是不可变的,所以每次添加时都必须创建一个新字符串,并且需要复制要添加的字符串的内容。这太慢了。相反,可以使用list来积累new_word的字母,并在结尾处对它们进行str.join

返回tuple时,()是隐式的。你可以直接写return a, b

words上迭代时,您应该直接迭代它,而不是它的索引。

使用str.lower可以将双比较if user == 'Done' or user == 'done'减少到if user.lower() == 'done':

您应该使用if __name__ == '__main__':保护来调用您的代码,以便在不执行整个脚本的情况下从另一个脚本导入您的函数。

最终代码:

代码语言:javascript
复制
import random


letters_avoid = set(' ,!?¿,*+-%/@1234567890')


def rotate_letter(letter, number):
    if letter == ' ':
        return letter
    if letter.islower():
        start = ord('a')
    elif not letter.islower():
        start = ord('A')

    normal_shift = ord(letter) - start
    new_letter = start + (normal_shift + number) % 26
    return chr(new_letter)


def rotate_word(word):
    new_word = []
    random_series = []
    for letter in word:
        if letter not in letters_avoid:
            random_number = random.randint(1, 26)
            new_word.append(rotate_letter(letter, random_number))
            random_series.append(random_number)
        else:
            new_word.append(letter)
    return "".join(new_word), random_series


def shift(words):
    encrypted_words = []
    random_shifts = []
    for word in words:
        new_word, random_series = rotate_word(word)
        encrypted_words.append(new_word)
        random_shifts.append(random_series)
    return encrypted_words, random_shifts


def get_input():
    words = []
    while True:
        user = input('Input words to encrypt. Done when ready \n')
        if user.lower() == 'done':
            return words
        words.append(user)


def start():
    words = get_input()
    encrypted_words, random_shifts = shift(words)
    print('UNENCRYPTED WORDS', words)
    print('ENCRYPTED WORDS', encrypted_words)
    print('RANDOM SHIFTS', random_shifts)

if __name__ == "__main__":
    start()
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/151916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档