iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0
Security

資安小白的密碼學從0到1-CryptoHack平台解題紀錄系列 第 16

【Day 15】密碼學分類&凱薩解碼器實作

  • 分享至 

  • xImage
  •  

前言

此篇會先大致分類密碼類型,之後因為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)

  • Classic Ciphers 古典密碼
    • Caesar Cipher 凱薩密碼
    • Vigenère Cipher 維吉尼亞密碼
    • Rail-fence Cipher 籬笆密碼
  • 現代密碼
    • Symmetric Encryption 對稱式加密
      • DES
      • AES
    • Asymmetric Encryption 非對稱式加密
      • RSA
      • Diffie-Hellman

Caesar Cipher 凱薩密碼

  • 為替換式加密
  • https://ithelp.ithome.com.tw/upload/images/20230925/20162613ZhB7FoREvv.png

這張圖代表,位移量是3,所以
A向右移動3個英文字母,對應到D
B向右移動3個英文字母,對應到E
C向右移動3個英文字母,對應到F

如果向右3個發現沒得走了,就回到A開始,比如說

Y向右移動3個英文字母,會是Y -> Z -> A -> B
所以對應到B

大致了解後,嘗試利用python實現凱薩密碼的解碼器

  • 凱薩加密最最最最最核心code

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表可得知
https://ithelp.ithome.com.tw/upload/images/20230925/20162613WBg2ZRC8TF.png
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'
成功位移!

  • 完整核心code

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就是我們位移過後的密文

接下來我們就可以來製作凱薩加/解密器了!
流程大概是

  • 輸入要處理的字串 -> select 1 or 2
    • select = 1(代表字串右移) -> 輸入位移量 ->
      呼叫 Caesar(plaintext, shift) -> 輸出處理完後的字串
    • select = 2(代表字串左移) -> 輸入位移量 ->
      呼叫 Caesar(plaintext, shift*(-1)) -> 輸出處理完後的字串
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

  • select 1(右移)
    https://ithelp.ithome.com.tw/upload/images/20230925/20162613umPRkJ3sy4.png
  • 對照線上解碼器
    https://ithelp.ithome.com.tw/upload/images/20230925/20162613zpFWhq4AmD.png

結果相同

  • select 2(左移)
    https://ithelp.ithome.com.tw/upload/images/20230925/20162613y8ZKEycHEu.png
  • 對照線上解碼器
    https://ithelp.ithome.com.tw/upload/images/20230925/20162613EKHSQs8yY7.png

結果相同

統整

利用"%26"讓a~z / A~Z 達成循環

小結

今天寫了凱薩解碼器,明天會來寫下一個古典密碼-維吉尼亞密碼的解碼器,希望能成功XD(搞不好之後可以結合成一個可以解各種密碼的解碼器!?ˋwˊ)

參考資料


上一篇
【Day 14-2】Modular Arithmetic 07 - Modular Binomials
下一篇
【Day 16】Vigenère 密碼實作
系列文
資安小白的密碼學從0到1-CryptoHack平台解題紀錄31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言