此篇會先大致分類密碼類型,之後因為CryptoHack平台裡的course沒有古典密碼,只有現代密碼(對稱、非對稱),所以古典密碼的練習我會改成去實作一個解碼器,比如說凱薩密碼
就會實作出輸入一個字串,輸出凱薩加/解密後的解果
(順便練習python的語法,真的好不熟QQ)
(只有大致分,詳細可參考網址 : https://zh.wikipedia.org/zh-tw/%E5%AF%86%E7%A2%BC%E5%AD%B8%E4%B8%BB%E9%A1%8C%E5%88%97%E8%A1%A8)
這張圖代表,位移量是3,所以
A向右移動3個英文字母,對應到D
B向右移動3個英文字母,對應到E
C向右移動3個英文字母,對應到F
如果向右3個發現沒得走了,就回到A開始,比如說
Y向右移動3個英文字母,會是Y -> Z -> A -> B
所以對應到B
大致了解後,嘗試利用python實現凱薩密碼的解碼器
plaintext : 明文, encryptext : 密文, shift : 位移量
舉例為plaintext都為英文字母大寫的情況下
for i in plaintext:
encryptext_char = chr(( ord(i) - ord('A') + shift ) % 26 + ord('A'))
encryptext += encryptext_char
利用迴圈跑plaintext字串,之後( ord(i) - ord('A') + shift ) % 26 + ord('A')
用意為以防加到超出範圍,舉例來說
設shift = 3, 把X往右位移3
ord('X') + shift
這樣的話根據ASCII表可得知
88 + 3 = 91
chr(91) = '['
正常來講要回到'A',所以我們不能這樣寫
所以要這樣!
chr(( ord('X') - ord('A') + shift ) % 26 + ord('A'))
ord('X') - ord('A') + shift
88 - 65 + 3 = 26
% 26
26 % 26 = 0
+ord('A')
0 + 65 = 65
chr(65) = 'A'
成功位移!
i.isalpha() -> 判斷 i 是否為英文字母
i.isupper() -> 判斷 i 是否為大寫英文字母
補充 : i.islower -> 判斷 i 是否為小寫英文字母
for i in plaintext:
if i.isalpha():
if i.isupper():
encryptext_char = chr(( ord(i) - ord('A') +shift ) % 26 + ord('A'))
else:
encryptext_char = chr(( ord(i) - ord('a') +shift ) % 26 + ord('a'))
else :
encryptext_char = chr(ord(i) + shift)
encryptext += encryptext_char
最後encryptext就是我們位移過後的密文
接下來我們就可以來製作凱薩加/解密器了!
流程大概是
def Caesar(plaintext, shift):
encryptext = ""
for i in plaintext:
if i.isalpha():
if i.isupper():
encryptext_char = chr(( ord(i) - ord('A') +shift ) % 26 + ord('A'))
else:
encryptext_char = chr(( ord(i) - ord('a') +shift ) % 26 + ord('a'))
else :
encryptext_char = chr(ord(i) + shift)
encryptext += encryptext_char
return encryptext
def main():
plaintext = str(input('input string\n>>'))
select = int(input("input 1 or 2 (right shift / left shift)\n>>"))
shift = int(input("input shift\n>>"))
if select == 1 :
print("encryptext :", Caesar(plaintext, shift))
else :
print("encryptext :", Caesar(plaintext, shift*(-1)))
if __name__ == "__main__":
main()
output
plaintext = "XyZaBcD", shift = 3
結果相同
結果相同
利用"%26"讓a~z / A~Z 達成循環
今天寫了凱薩解碼器,明天會來寫下一個古典密碼-維吉尼亞密碼的解碼器,希望能成功XD(搞不好之後可以結合成一個可以解各種密碼的解碼器!?ˋwˊ)