【问题标题】:vigenere encryption probleme with 'spaces' on pythonpython上“空格”的vigenere加密问题
【发布时间】:2020-09-16 06:30:45
【问题描述】:

我无法确定“空格”后加密出错的原因 这是代码:

def chiffre_vigenere(message,key):
        message = message.lower()
        key = key.lower()
        encrypted = []
        d = dict(a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,i=8,j=9,k=10,l=11,m=12,n=13,o=14,p=15,q=16,r=17,s=18,t=19,u=20,v=21,w=22,x=23,y=24,z=25)
        long_key = key
        while len(message) > len(long_key) :
                long_key = long_key + key
        i=0
        while i < len(message) :
                decalage = d.get(long_key[i])
                if message[i].isalpha() :            
                        c = ord(message[i]) + decalage
                        if c > 122 :
                                c = c - 26
                        encrypted.append(chr(c))
                else :
                        encrypted.append(message[i])       
                i = i+1
        print(listToString(encrypted))

例如,当我这样做时: chiffre_vigenere('stack overflow','apple') 它给出:sipno dkpvfadh 第一个单词是正确加密的,但在空格之后加密是错误的 提前感谢任何帮助

【问题讨论】:

    标签: python encryption vigenere


    【解决方案1】:

    问题是您使用相同的计数器变量i 在两个不同的字符串中标记您的位置:messagelong_key。每当您在message 中遇到一个非字母字符时,您都会跳到下一个字符,但您也会跳到long_key 中的下一个字符,这不是您想要做的。

    如果您只使用i 来计算long_key 中的字符数,那么问题就会消失。例如:

    def chiffre_vigenere(message,key):
        message = message.lower()
        key = key.lower()
        encrypted = []
        d = dict(a=0,b=1,c=2,d=3,e=4,f=5,g=6,h=7,i=8,j=9,k=10,l=11,m=12,n=13,o=14,p=15,q=16,r=17,s=18,t=19,u=20,v=21,w=22,x=23,y=24,z=25)
        long_key = key
        while len(message) > len(long_key):
            long_key = long_key + key
        i=0
        for ch in message:
            decalage = d.get(long_key[i])
            if ch.isalpha() :        
                c = ord(ch) + decalage
                if c > 122 :
                    c = c - 26
                encrypted.append(chr(c))
                i = i+1
            else :
                encrypted.append(ch)
        print(listToString(encrypted))
    

    您也可以考虑稍微简化一下代码。您可以使用 ord 函数将 ASCII 值转换为整数,并使用模运算符循环遍历 key 的值,而无需将其扩展为输入消息的大小。

    def chiffre_vigenere(message,key):
        key = key.lower()
        encrypted = ''
        i = 0
        for ch in message.lower():
            if 'a' <= ch <= 'z':
                a = ord(ch) + ord(key[i]) - ord('a')
                if a > ord('z'):
                    a -= 26
                encrypted += chr(a)
                i = (i + 1) % len(key)
            else:
                encrypted += ch
        print(encrypted)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多