返回文章列表

密碼輪加密技術詳解與Python實作

本文探討密碼輪加密技術,詳解其操作原理、加密解密步驟,並提供 Python 程式碼範例。同時,文章也介紹了 St. Cyr Slide 等其他加密工具,以及如何在紙筆上實作凱撒密碼。此外,文章也涵蓋了 Python 環境的安裝、IDLE 的使用、

資安 Web 開發

凱撒密碼是一種古老的加密技術,其原理是透過字母位移來混淆訊息。密碼輪是實作凱撒密碼的工具之一,透過旋轉內外圈來調整位移量,也就是加密金鑰。在數位時代,我們可以使用 Python 等程式語言來模擬密碼輪的運作,並實作更複雜的加密演算法。理解凱撒密碼的原理和實作,有助於我們瞭解現代密碼學的基礎概念,以及程式設計在資訊安全領域的應用。本文除了提供 Python 程式碼範例,也詳細說明瞭程式碼的運作邏輯,方便讀者理解和修改。此外,文章也介紹了 Python 開發環境的搭建,以及程式碼除錯的技巧,讓初學者也能輕鬆上手。

密碼輪加密技術詳解

密碼輪是一種簡單卻有效的加密工具,主要用於實作凱撒密碼(Caesar Cipher)。本文將詳細介紹如何使用密碼輪進行加密和解密操作,並探討其背後的原理。

密碼輪的基本結構

密碼輪由兩個同心圓組成,外圈包含26個英文字母,內圈同樣包含26個英文字母,但順序與外圈不同。內圈還標有數字0至25,用於表示加密金鑰。

如何使用密碼輪進行加密

  1. 準備明文訊息:首先,將需要加密的訊息寫在紙上。例如,我們要加密的訊息是「The secret password is Rosebud.」。
  2. 設定加密金鑰:轉動內圈,直到外圈的字母A對齊內圈的某個數字。這個數字就是加密金鑰。例如,如果A對齊的是數字8,那麼加密金鑰就是8。
  3. 進行加密:對於明文訊息中的每個字母,在外圈找到對應的字母,然後在內圈找到與之對齊的字母,用這個字母替換明文中的字母。例如,使用金鑰8,明文中的「T」會被替換成「B」,「H」會被替換成「P」,依此類別推。
  4. 完成加密:經過上述步驟,明文訊息「The secret password is Rosebud.」會被加密成「Bpm amkzmb xiaaewzl qa Zwamjcl.」。

程式碼範例:凱撒密碼實作

def caesar_encrypt(plaintext, key):
    ciphertext = ""
    for char in plaintext:
        if char.isalpha():
            shift = ord('A') if char.isupper() else ord('a')
            ciphertext += chr((ord(char) - shift + key) % 26 + shift)
        else:
            ciphertext += char
    return ciphertext

plaintext = "The secret password is Rosebud."
key = 8
ciphertext = caesar_encrypt(plaintext, key)
print(f"加密後的訊息:{ciphertext}")

內容解密:

此程式碼實作了凱撒密碼的加密功能。其中:

  • caesar_encrypt 函式接受明文和加密金鑰作為輸入。
  • 對於每個字母字元,它計算出在字母表中的新位置,並使用新的字元替換原來的字元。
  • 非字母字元保持不變。
  • 使用 ord 函式取得字元的ASCII值,chr 函式將ASCII值轉換回字符。
  • % 26 操作確保了字母表的迴圈移位。

如何使用密碼輪進行解密

解密過程與加密相反,需要使用相同的金鑰。具體步驟如下:

  1. 設定相同的加密金鑰:確保內圈的數字與外圈的A對齊,使用的金鑰與加密時相同。
  2. 進行解密:對於密鑰中的每個字母,在內圈找到對應的字母,然後在外圈找到與之對齊的字母,用這個字母替換密鑰中的字母。

程式碼範例:凱撒密碼解密實作

def caesar_decrypt(ciphertext, key):
    plaintext = ""
    for char in ciphertext:
        if char.isalpha():
            shift = ord('A') if char.isupper() else ord('a')
            plaintext += chr((ord(char) - shift - key) % 26 + shift)
        else:
            plaintext += char
    return plaintext

ciphertext = "Bpm amkzmb xiaaewzl qa Zwamjcl."
key = 8
plaintext = caesar_decrypt(ciphertext, key)
print(f"解密後的訊息:{plaintext}")

內容解密:

此程式碼實作了凱撒密碼的解密功能。其中:

  • caesar_decrypt 函式接受密鑰和解密金鑰作為輸入。
  • 解密過程是加密的逆過程,透過減去金鑰來還原原始字元。
  • 其他細節與加密函式相同。

St. Cyr Slide:另一種加密工具

除了密碼輪,St. Cyr Slide 也是一種用於加密和解密的紙質工具。它由三條紙帶組成,透過滑動紙帶來實作加密和解密。

手工加密技術:紙上實作凱撒密碼

在資訊安全的世界裡,加密技術一直扮演著至關重要的角色。早在電腦普及之前,人們就已經開始使用各種方法來保護資訊的安全。凱撒密碼(Caesar Cipher)便是其中一種簡單卻有效的加密技術。本文將探討如何使用紙筆實作凱撒密碼的加密與解密過程。

字母與數字的對應

要使用紙筆進行凱撒密碼的加密,首先需要建立字母與數字之間的對應關係。將26個英文字母從A到Z排列,並在每個字母下方標上對應的數字(0至25)。這樣,A對應0,B對應1,依此類別推,直到Z對應25。

A B C D E F G H I J K L M
0 1 2 3 4 5 6 7 8 9 10 11 12
N O P Q R S T U V W X Y Z
13 14 15 16 17 18 19 20 21 22 23 24 25

加密過程

有了字母與數字的對應表後,就可以開始進行加密。加密的步驟如下:

  1. 選擇金鑰:選擇一個1到25之間的數字作為加密金鑰,並將其保密。
  2. 查詢明文字母對應的數字:對於要加密的明文字母,查詢其對應的數字。
  3. 加上金鑰:將明文字母對應的數字加上金鑰。
  4. 處理溢位:如果加上金鑰後的結果大於或等於26,則減去26以得到正確的結果。
  5. 查詢密鑰字母:根據計算出的數字,查詢對應的字母,即為密鑰字母。

範例:加密 “Hello. How are you?”

假設選擇金鑰為13,以下是加密過程的範例:

明文字母明文數字加金鑰結果減26最終結果密鑰字母
H7+1320-20U
E4+1317-17R
L11+1324-24Y
L11+1324-24Y
O14+13271B

透過上述步驟,可以將 “Hello. How are you?” 加密為 “Uryyb. Ubj ner lbh?"。

解密過程

解密的過程與加密相反,主要步驟如下:

  1. 查詢密鑰字母對應的數字:對於要解密的密鑰字母,查詢其對應的數字。
  2. 減去金鑰:將密鑰字母對應的數字減去金鑰。
  3. 處理負數:如果減去金鑰後的結果小於0,則加上26以得到正確的結果。
  4. 查詢明文字母:根據計算出的數字,查詢對應的字母,即為明文字母。

範例:解密 “Uryyb. Ubj ner lbh?”

假設金鑰仍為13,以下是解密過程的範例:

密鑰字母密鑰數字減金鑰結果加26最終結果明文字母
U20-137-7H
R17-134-4E
Y24-1311-11L

透過上述步驟,可以將 “Uryyb. Ubj ner lbh?” 解密回 “Hello. How are you?"。

為何雙重加密無效

有些人可能會認為,對訊息進行雙重加密可以提高安全性。然而,對於凱撒密碼來說,這並不成立。因為兩次加密其實等同於一次使用不同金鑰的加密。例如,先使用金鑰3加密,再使用金鑰4加密,等同於直接使用金鑰7(3+4)進行一次加密。

程式碼範例(Python實作凱撒密碼):
def caesar_encrypt(plaintext, key):
    result = ""
    for char in plaintext:
        if char.isalpha():
            ascii_offset = ord('A') if char.isupper() else ord('a')
            result += chr((ord(char) - ascii_offset + key) % 26 + ascii_offset)
        else:
            result += char
    return result

def caesar_decrypt(ciphertext, key):
    return caesar_encrypt(ciphertext, -key)

# 使用範例
plaintext = "Hello. How are you?"
key = 13
ciphertext = caesar_encrypt(plaintext, key)
print(f"密鑰: {ciphertext}")
decrypted_text = caesar_decrypt(ciphertext, key)
print(f"解密後: {decrypted_text}")

程式碼解析:

此Python程式碼實作了凱撒密碼的加密和解密功能。主要包含兩個函式:caesar_encryptcaesar_decryptcaesar_encrypt 將明文根據指定的金鑰進行加密,而 caesar_decrypt 利用相同的金鑰進行解密。程式碼中透過ASCII值的運算實作字母的位移,並處理非字母字元保持不變。最終輸出加密後的密鑰和解密後的明文,以驗證加解密過程的正確性。

程式碼作用詳解:

  1. caesar_encrypt函式:接受明文和金鑰作為輸入,遍歷每個字元。如果是字母,則根據其大小寫狀態計算新的字元;否則,保持原字元不變。
  2. caesar_decrypt函式:直接呼叫 caesar_encrypt,傳入負的金鑰值,以實作解密。
  3. 使用範例:展示如何使用這兩個函式進行加解密操作,並輸出結果以驗證功能正確性。

安裝Python與相關工具

在開始程式設計之前,我們需要安裝稱為Python直譯器的軟體。這個直譯器是一個能夠理解你用Python語言寫的指令的程式。沒有這個直譯器,你的電腦將無法理解這些指令。由於我們將使用Python語言編寫程式,因此需要從Python程式語言的官方網站http://www.python.org下載Python。

下載與安裝Python

根據你的電腦作業系統是Windows、OS X還是Linux發行版(如Ubuntu),安裝過程會有所不同。你也可以在http://invpy.com/installing找到安裝Python軟體的線上影片。

重要注意事項!

請務必安裝Python 3,而不是Python 2。本文中的程式使用Python 3,如果你嘗試使用Python 2執行它們,將會出現錯誤。再次強調,請安裝Python 3。

Windows安裝

  1. 前往http://www.python.org,在網頁左側找到下載連結並點選進入下載頁面。
  2. 尋找名為Python 3.x.x Windows Installer的檔案(x代表版本號),點選連結下載。
  3. 下載完成後,雙擊python-3.x.x.msi檔案啟動安裝程式。
  4. 按照安裝程式的指示進行安裝,無需更改任何預設選項。

OS X安裝

  1. 在Python官網下載.dmg Mac Installer Disk Image檔案。
  2. 下載完成後,開啟.dmg檔案並按照指示進行安裝。

Ubuntu和Linux安裝

  1. 開啟終端機視窗(點選Applications ► Accessories ► Terminal)。
  2. 輸入sudo apt-get install python3.x(x代表版本號)並按下Enter鍵。
  3. 需要輸入root密碼來完成安裝。

下載pyperclip.py

本文中的大多數程式都會使用一個名為pyperclip.py的自定義模組。這個模組提供了複製和貼上文字到剪貼簿的功能。你可以從http://invpy.com/pyperclip.py下載這個檔案。

注意:

pyperclip.py檔案必須與你編寫的Python程式檔案放在同一個資料夾中,否則在執行程式時會出現ImportError: No module named pyperclip的錯誤訊息。

啟動IDLE

我們將使用IDLE軟體來編寫和執行程式。IDLE是Interactive DeveLopment Environment的縮寫。

  • 在Windows XP中,點選Start按鈕,選擇Programs ► Python 3.3 ► IDLE (Python GUI)。
  • 在Windows Vista或Windows 7中,點選左下角的Windows按鈕,輸入“IDLE”並選擇“IDLE (Python GUI)”。
  • 在Mac OS X中,開啟Finder視窗,點選Applications,然後點選Python 3.3,最後點選IDLE圖示。

內容解密:

  1. IDLE的作用:IDLE是一個開發環境,用於編寫、執行和測試Python程式。
  2. 啟動IDLE的方法:根據不同的作業系統,有不同的啟動IDLE的方法,但最終都是為了能夠開啟IDLE介面來進行程式設計。
  3. pyperclip.py的重要性:這個模組讓程式能夠與剪貼簿互動,對於需要複製或貼上文字的程式來說非常重要。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 密碼輪加密技術詳解與Python實作

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

此圖示展示了根據不同作業系統安裝Python的流程,以及後續步驟。

Python 的下載與安裝

在 Ubuntu 或 Linux 系統上,可以透過點選「應用程式」>「附件」>「終端機」,然後輸入 idle3 來啟動 IDLE。也可以點選螢幕頂部的「應用程式」,然後選擇「程式設計」>「IDLE 3」。

IDLE 的介面

啟動 IDLE 後,會出現一個幾乎空白的視窗,除了類別似以下的文字:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>>

這個視窗稱為互動式 Shell。Shell 是一種讓使用者輸入指令的程式,Python Shell 可以讓使用者輸入 Python 指令,並將這些指令傳送給 Python 直譯器軟體執行。

本文的特色

本文「用 Python 破解秘密密碼」與其他程式設計書籍不同,它專注於完整的程式原始碼。本文不僅教導程式設計概念,還會詳細解釋完整的程式如何運作。

下載原始碼

讀者可以在閱讀本文的同時,將原始碼輸入 IDLE 中,也可以從本文的網站下載原始碼檔案。網站網址為 http://invpy.com/hackingsource

程式碼輸入注意事項

輸入原始碼時,請勿輸入每行開頭的行號。例如:

number = random.randint(1, 20)
spam = 42
print('Hello world!')

行號僅用於本文參考特定的程式碼行,不是程式的一部分。請確保輸入的程式碼與書中所示完全相同,包括字母大小寫。

縮排的重要性

某些程式碼行會縮排四個或八個空格,請確保在每行開頭輸入正確的空格數。在 IDLE 中,由於每個字元的寬度相同,可以透過計算上方的字元來確定空格數。

程式碼範例

while spam < 10:
    if number == 42:
        print('Hello')

內容解密:

  1. while 迴圈會持續執行,直到 spam 不小於 10 為止。
  2. if 條件判斷 number 是否等於 42,如果是,則執行 print('Hello')
  3. 縮排是用來表示程式碼區塊的歸屬,上方的 if 條件屬於 while 迴圈內。

文字換行處理

本文中的某些程式碼行太長,無法在一行中完整顯示,會自動換行。在輸入這些程式碼時,請將其全部輸入在一行中,不要按下 Enter 鍵。

程式碼範例

print('This is the first line! xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')
print('This is the second line!')

內容解密:

  1. print 函式用於輸出字串。
  2. 即使第一行程式碼太長,換行顯示,但仍應將其輸入在一行中。

線上追蹤程式

讀者可以造訪 http://invpy.com/hackingtrace 線上追蹤本文中的每個程式。這個網頁提供了每一步的註解和提醒,有助於讀者瞭解程式的工作原理。

線上 Diff 工具檢查程式碼

雖然透過手動輸入原始碼來學習 Python 是非常有用的,但可能會出現打字錯誤,導致程式當機。讀者可以將自己輸入的原始碼複製並貼上到本文網站上的線上 Diff 工具中,以檢查與書中原始碼的差異。

複製和貼上文字

複製和貼上文字是一項非常有用的電腦技能,尤其是在處理需要加密或解密的長文字時。讀者可以從本文網站上的電子文字中複製文字,然後貼上到 IDLE 中。

操作步驟

  1. 使用滑鼠拖曳選取要複製的文字,使其高亮顯示。
  2. 在 Windows 上,按下 Ctrl-C,或在 Mac 上按下 Command-C,將選取的文字複製到剪貼簿。
  3. 將剪貼簿中的文字貼上到 IDLE 中。

內容解密:

  1. 正確選取要複製的文字非常重要。
  2. 使用正確的鍵盤快捷鍵來複製和貼上文字,可以提高效率。