Python 2.7:ROT13字母替换密码

时间:2016-05-09 12:41:01

标签: python string encryption

问题陈述:

  

ROT13是一个简单的字母替换密码,用字母表后面的字母替换字母后面的13个字母。 ROT13是Caesar密码的一个例子。

     

创建一个接受字符串并返回用Rot13加密的字符串的函数。如果字符串中包含数字或特殊字符,则应按原样返回。只有拉丁语/英语字母表中的字母才会被移动,就像最初的Rot13"实现"。

     

请注意使用"编码"在Python中被认为是作弊。

我的代码:

from string import *

def rot13(message):
    melist = list(message)

    for i in message:
        lpos = index(letters,i)

        if i.islower():
            print lpos
            melist[index(message,i)] =  lower(letters[lpos + 13])

        elif i.isupper():
            try:
                melist[index(message,i)] =  upper(letters[lpos + 13])
            except IndexError:
                melist[index(message,i)] =  upper(letters[lpos + 13 - 52])

    return ''.join(melist)

这个东西适用于转换除最后一个字母

之外的字符串

例如,如果你这样做:

>>> rot13('test') 
    'grft'

最后一个角色' t'虽然它应该没有改变,但我不知道我做错了什么。一些帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

这里的问题不是最后一封信。代码的这一部分总是会在字符串中找到第一个字母出现:

letters.index(i)

因此,即使您将't'作为输入,您也可以获得第一个索引,而不是给出'test'中最后一个'texttttttt'的索引 - 所有最后一个't'将保持不变。

您必须对算法进行一些更改......

答案 1 :(得分:0)

这是一个使用translate函数的非常简单的rot13版本。

import string
def rot13(message):
    norm=string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', \
                          'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM')
    return message.translate(norm)

print rot13("now is the time FOR ALL GOOD")

输出为
abj vf gur gvzr SBE NYY TBBQ

答案 2 :(得分:-1)

问题不在于最后一个字母,问题在于重复的字母:

>> print rot13('abba')
noba

原因是index功能:

    index(message,i)

它返回imessage出现第一次的位置。解决方案是使用start的可选index()参数来指定搜索应从指定位置开始:

for j,i in enumerate(message):
    lpos = index(letters,i)

    if i.islower():
        print lpos

        // this will find the correct position of the current occurence of i
        melist[index(message,i,j)] =  lower(letters[lpos + 13])
    ...

答案 3 :(得分:-1)

您的问题来自于使用“索引”方法!

在您的示例中,第二个“t”已处理,但结果将与列表中第一个“t”位于同一位置。

我认为这里没有索引,你可以简单地从空开始,并将每个字母附加到列表的末尾,同样:

melist = []
for i in message:
    if i.islower():
        melist.append(lower(letters[lpos + 13]))
...