如何将我的代码转换为有效的Caesar Cipher转换器?

时间:2017-11-27 03:03:56

标签: python caesar-cipher

我一直在尝试处理我的这段代码,它接受一串单词,将每个字母转换为ASCII码,添加一定数量(rotate_number),然后打印出这些数字的翻译版本,全部转换回一串随机字母(但空格和符号保持不变)。例如,我想要一个字符串“你今天过得怎么样?”旋转多少说+4,以便最终产品说“Lsa evi csy xshec?”

这是我到目前为止的代码,但是当我运行它时,只旋转一个字母并打印出来:

def encrypt_words(words, rotate_number):
    blank = ""
    for i in words:
        translate1 = ord(i) + rotate_number
        translated = chr(translate1)
        blank += translated
    print translated

encrypt_words("How are you today?", 3)

另外,如果我的问题已经得到解答,我很抱歉。我一直在网上和这个特定的网站上搜索,但似乎没有什么对我有用......

2 个答案:

答案 0 :(得分:0)

看起来您希望打印字符串“空白”,而不是在代码中翻译。请尝试以下方法:

def encrypt_words(words, rotate_number):
    blank = ""
    for i in words:
        translate1 = ord(i) + rotate_number
        translated = chr(translate1)
        blank += translated
    print blank

空白是每个翻译值的串联。您应该重命名'blank',因为该名称具有误导性。

答案 1 :(得分:0)

我建议先创建一个旋转方法

def rotate(alphabet,rotation):
    return alphabet[rotation:]+alphabet[:rotation]

#test it
print(rotate(string.ascii_lowercase,5))

现在创建一个旋转的查找表

def create_lookup_table(rotation,*alphabets):
    if not alphabets:
       alphabets = [string.ascii_lowercase,string.ascii_uppercase]
    alphabet = "".join(alphabets)
    rotated = "".join(rotate(a,rotation) for a in alphabets)
    return dict(zip(alphabet,rotated))

# test it
create_lookup_table(5)
create_lookup_table(2,"abcdef","GHIJKLM")

现在实施ceasar密码很简单,因为我们已经给自己提供了帮助我们的工具集

def ceasar(msg_plain,rotation):
    lookup_table = create_lookup_table(rotation)
    return ''.join(lookup_table.get(char,char) for char in msg_plain)

# test it
ceasar("Hello World!",13) # 'Uryyb Jbeyq!'