凯撒密码由两个字母移位

时间:2016-09-29 19:35:07

标签: python encryption caesar-cipher

def main():

    cc = (input("Enter Message to Encrypt\n"))#user input

    shift = int(2) #shift length

    a=["a","b","c","d","e","f","g","h","i","j","k","l",
       "m","n","o","p","q","r","s","t","u","v","w","x","y","z"] #reference list

    newa={} #new shifted reference list

    for i in range (0,len(a)):
        newa [a[i]]=a[(i+shift)%len(a)]
        #adds shifted 2 alaphabet into newalaphabet
        #% moodulus used to wrap

        for i in cc: #iterates through cc
            if i in a:
                    a[i]=cc[i]
                    a[i]=newa[i]

main()

所以我需要用户输入#cc

转变需要两个

我使用了字母表

然后将字母表移动两次以创建newa

但我不知道如何将新字母应用于我的用户输入

5 个答案:

答案 0 :(得分:0)

遍历字符串cc并使用get newa方法替换所有字母表。不在字典中的字符保留原样,当缺少密钥时将它们作为默认值传递给newa.get

newa = {}
for i, x in enumerate(a):
    newa[x] = a[(i+shift) % len(a)]

encrypted_text = ''.join(newa.get(i, i) for i in cc)

在这种情况下,可以使用Python的内置enumerate代替range(len(a)),您需要a中的项目及其各自的索引。

答案 1 :(得分:0)

对每个字符使用映射,然后将它们连接起来以创建加密消息:

''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower()))

像这样整合:

import string
alphabet = string.ascii_lowercase
cc = input('Enter string to encode: ')
shift = 2 # could be any number

encrypted = ''.join(map(lambda x: chr((ord(x) - 97 + shift) % 26 + 97) if x in alphabet else x, cc.lower()))

cc.lower()表示字母完全相同(使用常量ord进行映射)

chr((ord(x) - 97 + shift) % 26 + 97)

  • 获取数字减去97的值(a为0,b为1等)。
  • 应用班次(a转到c等)。
  • 调整26以防止z之类的字母超出(25 + 2 = 27,27%26 = 1 = b)。
  • 添加97以将字母恢复为ascii标准(a为97,b为98等)。

if x in alphabet else x覆盖非字母的标记(如果您想忽略空格和标点符号而使用if x in alphabet else '')。

答案 2 :(得分:0)

使用字典将输入映射到输出

shifted_a = a[-shift:] + a[:-shift]
cipher = {a[i]: shifted_a[i] for i in range(len(a))}
output = ''.join(cipher[char] for char in cc)

答案 3 :(得分:0)

我只是构建转换表并用它来解码字符串。

import string
shift = 2
letters = string.ascii_lowercase + string.ascii_uppercase
transtable = str.maketrans({letters[i]: letters[(i + shift) % len(letters)] 
                            for i in range(len(letters))})

cc = input('Enter string to encode: ')
print(cc.translate(transtable))

答案 4 :(得分:0)

我会把我的解决方案扔进那里。应该很清楚它是如何工作的......

import string

index_lookup = {letter: index for index, letter in enumerate(string.ascii_lowercase)}

def caesar_letter(l, shift=2):
    new_index = index_lookup[l] + shift
    return string.ascii_lowercase[new_index % len(index_lookup)]

def caesar_word(s):
    return ''.join([caesar_letter(letter) for letter in s])

我认为上述内容对可读性更好,但如果您反对进口......

index_lookup = {chr(idx): idx - ord('a') for idx in range(ord('a'), ord('z')+1)}

...

In [5]: caesar_word('abcdefghijklmnopqrstuvwxyz')
Out[5]: 'cdefghijklmnopqrstuvwxyzab'