Skip to content

Latest commit

 

History

History
108 lines (68 loc) · 3.13 KB

Mid.md

File metadata and controls

108 lines (68 loc) · 3.13 KB

Caesar cipher 實作

此程式碼非原創,參考過後進行思考與嘗試,思路與部分程式碼參考自 https://iter01.com/570152.html`11

初步處理 : 先拿到所輸入字串的ASCII碼,與使用者輸入位移量  

接著ASCII碼加上位移量 

strr = input("Enter your input: ")  # 先輸入字串
theKey = int(input("Enter a Number: ")) # 輸入數字 當位移量
#ord(strr) ord只收字元 並將她轉成ASCII碼

for getNum in strr:  # 遍歷剛剛輸入的字串
        num = ord(getNum)  # 拿到每個字母的ASCII碼
        num2 = num
        num2 += theKey  # 針對位移量進行移動
        
        #mystring = str(num2)
        print("原本的asicc為: " + f'{num}')
        print("經過位移的數字為: ",f'{num2}')

print("接收到的input是 : ", strr )
print("")

結果: 

  image

將位移後結果轉換

print("經過位移的數字為: " , f'{num2}' , " 轉換後為" + chr(num2))

會出現其他非英文字母的符號

image

對照ASCII轉換的圖可知,加上位移量轉換後會超出英文字母範圍

image

所以接著要對超出英文字母範圍的碼進行進行加減

    if getNum.isupper():     # 先判斷大小寫
        if num2 > ord('Z'):    # 如果加上位移量後比Z的ASCII還大 就-
            num2 -=26         
        elif num2 < ord('A'):    # 如果加上位移量後比A的ASCII還小 就+
            num2 +=26
    elif getNum.islower():
        if num2 > ord('z'):           # 如果加上位移量後比z的ASCII還大 就-
            num2 -=26
        elif num2 < ord('a'):         # 如果加上位移量後比a的ASCII還小 就+
            num2 +=26
    
    after += chr(num2)

結果:

image

雖然解決超出英文ASCII碼的問題,但仍然可見有奇怪的字混入  

這是因為空白鍵也被進行運算了   

所以下一個步驟是將非英文的字元抓出來  

 if getNum.isalpha():
   才進行位移運算  
 else: 
      after += getNum 否則將他放回去

結果:

image

字串已經可以正確的加密了

解密

在已知位移量的情況下可以直接推回去

theKey = -theKey       (將剛剛的位移量推回去)

image

簡易的Caesar cipher實作已經完成

其他解密的方法還有窮舉法、頻率分析或者樣式單詞分析等等

參考資料