在第7行:如果我使用另一个数字而不是像%28那样26,为什么它必须是%26会发生什么?

时间:2018-05-08 08:40:44

标签: python python-3.x caesar-cipher

def encryption(message,skey):
    encryptedmessage=''
    for character in message:
        if character.isalpha()==True:
            if character==character.lower():
                newchar=ord(character)-97
                newchar=(newchar+skey)%26
                encryptedmessage+= chr(newchar +97)
            else:
                newchar=ord(character)-65
                newchar=(newchar+skey)%26
                encryptedmessage+= chr(newchar +65)
        else:
            encryptedmessage+= character
    return('Your Message is: {:s}'.format(encryptedmessage))

def decryption(message,skey):
    decryptedmessage=''
    for character in message:
        if character.isalpha()==True:
            if character==character.lower():
                newchar=ord(character)-97
                newchar=(newchar-skey)%26
                decryptedmessage+= chr(newchar +97)
            else:
                newchar=ord(character)-65
                newchar=(newchar-skey)%26
                decryptedmessage+= chr(newchar +65)
        else:
            decryptedmessage+= character
    return('Your Message is: {:s}'.format(decryptedmessage))

while True:
    u=str(input("To encrypt a messege enter 'E' or 'e',To dycrypt a message enter 'D' or 'd',To stop the program enter'quit': "))
    if u=='':
        print("")  
    elif (u in 'Ee'):
        Message1=str(input('Please enter your message: '))
        key=int(input('Please enter the shifting key: '))        
        print(encryption(Message1,key))
    elif (u in 'Dd'):
        Message1=str(input('Please enter your message: '))
        key=int(input('Please enter the shifting key: '))        
        print(decryption(Message1,key))        
    elif u=='quit':
        print('Program ended.')
        break;

2 个答案:

答案 0 :(得分:1)

它不一定是26,这样密文就会使用(英文)字母字符来表示(英文)字母字符。
如果您使用28,则您的密文将使用来自a ... z的26个字符,' {',' |'用于表示小写的范围,以及来自A ... Z的26个字符,' [',' \'大写范围。两个范围都有28个字符,但其中26个仅在使用中,因此每个字符间距会有2个字符,其位置取决于实际的"键"你用。这是你可以简单尝试的,没有什么不好的事情会发生*。

(*只要您的原始文本不包含编码字母表中引入的额外字符 - 但如果它包含,那么这些字符将在解码后变为字母)

答案 1 :(得分:0)

这条线 newchar=(newchar-skey)%26 将字母移动一个skey的值,然后返回一个模26 这样做是为了确保返回的值始终是英文字母中的字母。 在ASCII中,对于upper_case,它们的范围为65到90,对于较低的范围,它们的范围为97到122(这些值分别在第10行和第6行中移位到0-26的范围)。

更改该数字会增加(或减少)脚本可以使用的字符范围,请参阅:ASCII table