Caesar密码的Python字符串连接,与Java代码兼容

时间:2014-11-14 22:17:06

标签: java python encryption cryptography

我已经用Java编写了Caesar密码的加密代码,我的计划是在Python中使用相同的逻辑重写程序。虽然它可以通过多种方式完成,但是有什么办法可以在Python中使用与 StringBuilder 等效的东西吗?如果我在Python中有一个存储字符串值的 hold 变量,那么如何以类似于Java的方式添加新字符或字符串呢?

    static String encrypt(String s, int shift)
    {
        shift = shift % 26 + 26;
        StringBuilder hold = new StringBuilder();
        for (char i : s.toCharArray()) 
        {
            if (Character.isLetter(i)) 
            {
                if (Character.isUpperCase(i))
                    hold.append((char)('A' + (i - 'A' + shift) % 26 ));
                else
                    hold.append((char)('a' + (i - 'a' + shift) % 26 ));
            } 
            else
                hold.append(i);
        }
        return hold.toString();
    }

2 个答案:

答案 0 :(得分:2)

您可以使用字符串的直接列表转换,然后使用ord()/ chr()函数来混淆单个字符的ASCII值。

字符串是不可变的,但列表不是。您可以在Python中很好地连接字符串,并且可以通过列表转换和使用split()和join()重新转换来更改字符串。

Python字符串也有isupper(),islower(),isdigit()和isalpha()方法,它们给出一个布尔值。

我现在无法对此进行测试,因为我并不完全了解您的密码,但我认为它很接近复制您的JAVA代码。你可能想稍微调整密码位。

def encrypt(encryptString, shift):
    shift = shift % 26 + 26
    stringList = list(encryptString)
    for eachCharacter in stringList:
        if eachCharacter.isalpha() == True:
            if eachCharacter.isupper() == True:
                eachCharacter = chr( ( ord('A') + ord(eachCharacter) - ord('A') + shift) % 26)
            else:
                eachCharacter = chr( ( ord('a') + ord(eachCharacter) - ord('a') + shift) % 26)

    encryptString = ''.join(stringList)
    return encryptString

答案 1 :(得分:1)

我建议使用一个字符列表,即

>>> x = ['a', 'b', 'c']
>>> x
['a', 'b', 'c']
>>> x.append('d')
>>> x += ['e', 'f']
>>> x
['a', 'b', 'c', 'd', 'e', 'f']
>>> "".join(x)
'abcdef'