凱撒密碼問題分析


原題:

愷撒密碼


愷撒密碼是古羅馬愷撒大帝用來對軍事情報進行加解密的算法,它采用了替換方法對信息中的每一個英文字符循環替換為字母表序列中該字符后面的第三個字符,即,字母表的對應關系如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

對於原文字符P,其密文字符C滿足如下條件:C=(P+3) mod 26‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

上述是凱撒密碼的加密方法,解密方法反之,即:P=(C-3) mod 26‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

假設用戶可能使用的輸入包含大小寫字母azAZ、空格和特殊符號,請編寫一個程序,對輸入字符串進行愷撒密碼加密,直接輸出結果,其中空格不用進行加密處理。使用input()獲得輸入。



輸入示例‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

python is good

輸出示例‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

sbwkrq lv jrrg

答案:

【參考代碼】

s = input()
t = ""
for c in s:
   if 'a' <= c <= 'z': 
       t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )
   elif 'A' <= c <= 'Z':
       t += chr( ord('A') + ((ord(c)-ord('A')) + 3 )%26 )
   else:
       t += c
print(t)

愷撒密碼加密算法由很多種編寫方法,這是一種很直接的方法。

分析:

總體思路是利用ord()將字符轉換為整數Unicode碼,+3后用chr()返回Unicode字符,但是如果x,y,z的Unicode碼簡單加上3並不會回到a,b,c,而是溢出到下面的字符。
所以我們要將一個凱撒密碼的區間限定好,在這個區間內回環。

首先,這里用到了if 'a' <= c <= 'z':這種字符判斷,本質上也是利用Unicode編碼a-z與A-Z是連續區間這個性質進行判斷

其次,t += chr( ord('a') + ((ord(c)-ord('a')) + 3 )%26 )中的t +=用到了字符串可以用+的連接

ord(c)-ord('a')判斷c"a"Unicode編碼的差值

(差值+3)對26取模很巧妙的限定在了"a"-"z"這個區間內.如果"a"-"w"字母加3后,差值在0-25內,取模就是原值;如果"x"-"z"字母差值加3后會大於26,取模會減去26,剩下的值即為到"a"新差值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM