簡體   English   中英

Vigenere 加密問題 python 上的“空格”

[英]vigenere encryption probleme with 'spaces' on python

我無法確定在“空格”之后加密出錯的原因是代碼:

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 第一個單詞是正確加密的,但是在空格之后加密是錯誤的,任何幫助都提前感謝

問題是您使用相同的計數器變量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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM