返回文章列表

仿射與替換密碼技術解析與程式實作

本文探討仿射密碼與簡單替換密碼的技術原理、實作方法與破解技巧。涵蓋模數運算、金鑰空間分析、程式碼實作、破解策略等導向,並提供 Python 程式碼範例,闡述如何運用詞彙模式匹配、字母頻率分析等技術進行密碼破解,以及程式設計中的效能最佳化和安全性考量。

資安 密碼學

仿射密碼結合凱撒密碼與乘法密碼,利用線性變換和模數運算實作加解密。其安全性建立在金鑰的選擇上,特別是乘法金鑰必須與模數互質。簡單替換密碼則根據字母替換,破解難度相對較低,但仍需結合字母頻率分析、詞彙模式匹配等技術。本文提供的 Python 程式碼示範了仿射密碼的加解密過程以及簡單替換密碼的破解方法,其中包含了金鑰管理、模逆元計算、詞彙模式匹配等關鍵技術。程式碼中也涵蓋了錯誤處理和效能最佳化等實務考量,有助於讀者理解密碼學的實際應用。

仿射密碼(Affine Cipher)技術深度解析與程式實作

仿射密碼簡介

仿射密碼是一種結合了凱撒密碼(Caesar Cipher)與乘法密碼(Multiplicative Cipher)的加密技術,透過線性變換實作加密與解密。該密碼系統根據模數運算(Modular Arithmetic),其安全性依賴於金鑰選擇的複雜度。

模數運算基礎

在深入仿射密碼之前,必須先理解模數運算的核心概念。模數運算是處理整數的一種方法,將數值限制在某個範圍內迴圈進行運算。最常見的例子是時鐘運算(Clock Arithmetic),當時間超過12點後會重新從1點開始計算。

模數運算的數學表示

給定兩個整數(a)和(b),以及一個正整數(n),模數運算可表示為: [ a \mod n = r ] 其中(r)是(a)除以(n)的餘數。

仿射密碼的數學原理

仿射密碼的加密過程使用以下公式: [ E(x) = (ax + b) \mod n ] 其中:

  • (x)是明文的數值表示
  • (a)和(b)是加密金鑰,且(a)必須與(n)互質(即最大公約數為1)
  • (n)是可能的明文字元數量

解密公式

解密過程使用以下公式: [ D(y) = a^{-1}(y - b) \mod n ] 其中(a^{-1})是(a)在模(n)下的乘法逆元。

程式實作:仿射密碼加解密

以下是一個完整的Python實作範例:

import cryptomath

def affine_encrypt(plain_text, key_a, key_b):
    """仿射密碼加密函式"""
    cipher_text = ""
    for char in plain_text:
        if char.isalpha():
            # 將字元轉換為數值(A=0, B=1, ...)
            num = ord(char.upper()) - ord('A')
            # 進行仿射加密
            encrypted_num = (key_a * num + key_b) % 26
            # 轉換回字元
            encrypted_char = chr(encrypted_num + ord('A'))
            cipher_text += encrypted_char
        else:
            cipher_text += char
    return cipher_text

def affine_decrypt(cipher_text, key_a, key_b):
    """仿射密碼解密函式"""
    # 計算a的模逆元
    mod_inverse_a = cryptomath.find_mod_inverse(key_a, 26)
    plain_text = ""
    for char in cipher_text:
        if char.isalpha():
            num = ord(char.upper()) - ord('A')
            # 進行仿射解密
            decrypted_num = (mod_inverse_a * (num - key_b)) % 26
            decrypted_char = chr(decrypted_num + ord('A'))
            plain_text += decrypted_char
        else:
            plain_text += char
    return plain_text

# 主程式執行範例
if __name__ == "__main__":
    plain_text = "ATTACKATDAWN"
    key_a = 5
    key_b = 8
    
    # 加密過程
    cipher_text = affine_encrypt(plain_text, key_a, key_b)
    print(f"加密結果: {cipher_text}")
    
    # 解密過程
    decrypted_text = affine_decrypt(cipher_text, key_a, key_b)
    print(f"解密結果: {decrypted_text}")

程式碼解析:

  1. 加密函式affine_encrypt函式將明文轉換為密鑰,使用仿射密碼公式進行加密。

    • 將每個字母轉換為對應的數值(A=0, B=1, …)。
    • 使用公式((ax + b) \mod 26)計算加密後的數值。
    • 將結果轉換回字母。
  2. 解密函式affine_decrypt函式將密鑰還原為明文。

    • 首先計算(a)的模逆元。
    • 使用公式(a^{-1}(y - b) \mod 26)進行解密。
  3. 主程式:展示瞭如何使用這兩個函式進行加解密操作。

金鑰管理與安全性分析

仿射密碼的安全性取決於金鑰(a)和(b)的選擇。特別是(a)必須與26(字母數量)互質,以確儲存在乘法逆元,進而保證解密的可行性。

金鑰空間分析

  • (a)的可能取值數量等於小於26且與26互質的正整數數量(即尤拉函式(\phi(26)))。
  • (b)的可能取值為0到25之間的任意整數。

第16章 - 破解仿射密碼

仿射密碼破解程式原始碼

# 仿射密碼破解程式
def hackAffineCipher(message):
    # 暴力破解所有可能的金鑰
    for keyA in range(len(SYMBOLS)):
        for keyB in range(len(SYMBOLS)):
            # 檢查金鑰是否有效
            if gcd(keyA, len(SYMBOLS)) == 1:
                # 解密訊息
                decryptedMessage = decryptMessage(keyA, keyB, message)
                # 檢查解密結果是否合理
                if isEnglish(decryptedMessage):
                    return decryptedMessage, (keyA, keyB)
    return None, None

# 主要函式
def main():
    message = "your encrypted message here"
    decryptedMessage, key = hackAffineCipher(message)
    if decryptedMessage:
        print("解密成功!")
        print("金鑰:", key)
        print("解密訊息:", decryptedMessage)
    else:
        print("解密失敗!")

if __name__ == "__main__":
    main()

內容解密:

  1. hackAffineCipher 函式:此函式用於暴力破解仿射密碼。它遍歷所有可能的金鑰組合 (keyAkeyB),並檢查每個金鑰是否有效(即 keyA 與符號集大小互質)。
  2. decryptMessage 函式:用於使用給定的金鑰 (keyA, keyB) 解密訊息。該函式的實作未在此顯示,但它根據仿射密碼的解密公式進行解密。
  3. isEnglish 函式:檢查解密後的訊息是否為合理的英文文字。如果是,則傳回 True,表示解密成功。
  4. main 函式:程式的主要入口點,用於測試 hackAffineCipher 函式。

程式執行範例

執行上述程式後,如果輸入的加密訊息能夠被成功解密,程式將輸出解密後的訊息和對應的金鑰。

程式運作原理

  1. 暴力破解:程式嘗試所有可能的金鑰組合,直到找到能夠成功解密出合理英文文字的金鑰。
  2. 金鑰驗證:檢查每個金鑰是否滿足仿射密碼的條件(即 keyA 與符號集大小互質)。
  3. 解密與驗證:使用有效的金鑰解密訊息,並檢查解密結果是否為合理的英文文字。

次方運算元

在 Python 中,** 是次方運算元,用於計算一個數的冪。例如,2 ** 3 的結果是 8

continue 陳述式

continue 陳述式用於跳過當前迴圈的剩餘部分,直接進入下一次迴圈迭代。在仿射密碼破解程式中,它可以用於跳過無效的金鑰組合。

練習題(第16章,A組)

  1. 修改 hackAffineCipher 函式,使其能夠處理更大的符號集。
  2. 新增一個函式,用於自動檢測輸入訊息的語言,並據此調整解密策略。

簡單替換密碼破解技術深度解析

破解原理與實作挑戰

簡單替換密碼(Simple Substitution Cipher)是一種常見的古典加密技術,其核心原理是透過字母替換來隱藏原始訊息。儘管這種加密方式看似簡單,但要有效破解卻需要深入的技術分析與實作經驗。

程式實作與關鍵技術

以下是一個簡單替換密碼破解程式的實作範例:

import pprint
import re

def get_word_pattern(word):
    # 將單詞轉換為模式
    pattern = []
    letter_map = {}
    next_letter = 0
    
    for letter in word:
        if letter not in letter_map:
            letter_map[letter] = str(next_letter)
            next_letter += 1
        pattern.append(letter_map[letter])
    
    return '.'.join(pattern)

def main():
    # 建立詞彙模式字典
    word_patterns = {}
    with open('dictionary.txt') as f:
        for line in f:
            word = line.strip().lower()
            pattern = get_word_pattern(word)
            if pattern not in word_patterns:
                word_patterns[pattern] = [word]
            else:
                word_patterns[pattern].append(word)
    
    # 測試詞彙模式匹配
    test_word = 'hello'
    pattern = get_word_pattern(test_word)
    print(f'詞彙模式:{pattern}')
    print(f'可能的單詞:{word_patterns.get(pattern, [])}')

#### 內容解密:
1. **`get_word_pattern`函式實作**該函式負責將輸入的單詞轉換為對應的模式透過建立字母對映表來確保相同的字母對應相同的代號
2. **詞彙模式字典建立**程式讀取字典檔案並建立詞彙模式字典用於後續的密碼破解
3. **測試與驗證**透過測試單詞來驗證詞彙模式匹配的效果確保程式正確運作

### 技術選型與設計考量

在簡單替換密碼破解程式的設計中採用了以下關鍵技術
- **詞彙模式匹配**透過計算單詞的模式來進行比對有效縮小可能的明文範圍
- **正規表示式應用**利用正規表示式進行字串處理提升程式的靈活性
- **字典查詢最佳化**建立高效的詞彙模式字典加速破解過程

### 破解策略與實務挑戰

簡單替換密碼的破解依賴於對密鑰的深入分析主要挑戰包括
1. **密鑰字母頻率分析**透過分析字母出現頻率來推測可能的明文字母
2. **詞彙模式匹配**利用已知的詞彙模式來進行比對逐步還原明文
3. **逐步迭代最佳化**不斷最佳化字母對映關係直到完全破解