仿射密碼結合凱撒密碼與乘法密碼,利用線性變換和模數運算實作加解密。其安全性建立在金鑰的選擇上,特別是乘法金鑰必須與模數互質。簡單替換密碼則根據字母替換,破解難度相對較低,但仍需結合字母頻率分析、詞彙模式匹配等技術。本文提供的 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}")
程式碼解析:
加密函式:
affine_encrypt函式將明文轉換為密鑰,使用仿射密碼公式進行加密。- 將每個字母轉換為對應的數值(A=0, B=1, …)。
- 使用公式((ax + b) \mod 26)計算加密後的數值。
- 將結果轉換回字母。
解密函式:
affine_decrypt函式將密鑰還原為明文。- 首先計算(a)的模逆元。
- 使用公式(a^{-1}(y - b) \mod 26)進行解密。
主程式:展示瞭如何使用這兩個函式進行加解密操作。
金鑰管理與安全性分析
仿射密碼的安全性取決於金鑰(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()
內容解密:
hackAffineCipher函式:此函式用於暴力破解仿射密碼。它遍歷所有可能的金鑰組合 (keyA和keyB),並檢查每個金鑰是否有效(即keyA與符號集大小互質)。decryptMessage函式:用於使用給定的金鑰 (keyA,keyB) 解密訊息。該函式的實作未在此顯示,但它根據仿射密碼的解密公式進行解密。isEnglish函式:檢查解密後的訊息是否為合理的英文文字。如果是,則傳回True,表示解密成功。main函式:程式的主要入口點,用於測試hackAffineCipher函式。
程式執行範例
執行上述程式後,如果輸入的加密訊息能夠被成功解密,程式將輸出解密後的訊息和對應的金鑰。
程式運作原理
- 暴力破解:程式嘗試所有可能的金鑰組合,直到找到能夠成功解密出合理英文文字的金鑰。
- 金鑰驗證:檢查每個金鑰是否滿足仿射密碼的條件(即
keyA與符號集大小互質)。 - 解密與驗證:使用有效的金鑰解密訊息,並檢查解密結果是否為合理的英文文字。
次方運算元
在 Python 中,** 是次方運算元,用於計算一個數的冪。例如,2 ** 3 的結果是 8。
continue 陳述式
continue 陳述式用於跳過當前迴圈的剩餘部分,直接進入下一次迴圈迭代。在仿射密碼破解程式中,它可以用於跳過無效的金鑰組合。
練習題(第16章,A組)
- 修改
hackAffineCipher函式,使其能夠處理更大的符號集。 - 新增一個函式,用於自動檢測輸入訊息的語言,並據此調整解密策略。
簡單替換密碼破解技術深度解析
破解原理與實作挑戰
簡單替換密碼(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. **逐步迭代最佳化**:不斷最佳化字母對映關係,直到完全破解。