返回文章列表

簡單替換密碼技術原理與實作解析

本文深入解析簡單替換密碼的原理及 Python 實作,包含金鑰生成、加密、解密流程與程式碼解說,並探討其安全性及程式碼擴充性,例如如何修改程式碼以加密更多字元,以及如何生成隨機金鑰以增強安全性。

資安 Python

簡單替換密碼是一種對稱式加密技術,透過將明文中的字母依據金鑰對應到另一組字母來實作加密。不同於凱撒密碼的固定位移,簡單替換密碼使用一個包含 26 個字母的亂序字串作為金鑰,增加了加密的複雜度。金鑰的保密性至關重要,一旦洩漏,密鑰便容易被破解。雖然金鑰空間龐大,但頻率分析攻擊仍是其主要弱點。

理解程式碼的關鍵在於掌握字母替換的邏輯。translateMessage 函式是核心,它根據 mode 引數(encrypt 或 decrypt)決定字母替換的方向。checkValidKey 函式則確保金鑰的有效性,避免錯誤的輸入導致加密或解密失敗。getRandomKey 函式提供隨機金鑰生成的功能,提升安全性。程式碼中也示範瞭如何處理大小寫字母以及非字母字元,確保加密的完整性。

簡單替代密碼:原理與實作

簡單替代密碼是一種比凱撒密碼更複雜的加密技術,其原理在於使用一個隨機生成的字母表替換原本的字母表進行加密。

簡單替代密碼的工作原理

簡單替代密碼的金鑰是一個包含26個字母的隨機排序字串,加密過程中,明文中的每個字母都會被替換成金鑰中對應位置的字母。例如,若金鑰為LFWOAYUISVKMNXPBDCRJTQEGHZ,則明文中的A會被替換成LB會被替換成F,依此類別推。

手工實作簡單替代密碼

首先,我們需要建立一個字母表和一個對應的金鑰字母表。例如:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕ ↕
V J Z B G N F E P L I T M X D W K Q U C R Y A H S O

將明文中的每個字母按照上述對應關係替換成密鑰中的字母,即可完成加密。

簡單替代密碼的Python實作

以下是簡單替代密碼的Python實作程式碼:

# 簡單替代密碼實作

import pyperclip
import random

LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

def main():
    myMessage = 'If a man is offered a fact which goes against his instincts, he will scrutinize it closely, and unless the evidence is overwhelming, he will refuse to believe it. If, on the other hand, he is offered something which affords a reason for acting in accordance to his instincts, he will accept it even on the slightest evidence. The origin of myths is explained in this way. -Bertrand Russell'
    myKey = 'LFWOAYUISVKMNXPBDCRJTQEGHZ'
    myMode = 'encrypt'  # 設定為 'encrypt' 或 'decrypt'

    checkValidKey(myKey)

    if myMode == 'encrypt':
        translated = encryptMessage(myKey, myMessage)
    elif myMode == 'decrypt':
        translated = decryptMessage(myKey, myMessage)

    print('使用金鑰 %s' % (myKey))
    print('已%s的訊息是:' % (myMode))
    print(translated)
    pyperclip.copy(translated)
    print()
    print('此訊息已複製到剪貼簿。')

#### 程式碼解析:
1. `LETTERS` 變數定義了標準的英文字母表用於後續的加密與解密操作
2. `checkValidKey` 函式檢查提供的金鑰是否有效即是否包含所有26個英文字母且無重複
3. `encryptMessage``decryptMessage` 函式分別用於加密和解密訊息它們都呼叫了 `translateMessage` 函式
4. `translateMessage` 函式根據提供的金鑰和模式加密或解密對訊息進行轉換
5. `getRandomKey` 函式用於生成一個隨機的金鑰

def checkValidKey(key):
    keyList = list(key)
    lettersList = list(LETTERS)
    keyList.sort()
    lettersList.sort()

    if keyList != lettersList:
        print('金鑰或符號集中存在錯誤。')
        return False
    return True

def encryptMessage(key, message):
    return translateMessage(key, message, 'encrypt')

def decryptMessage(key, message):
    return translateMessage(key, message, 'decrypt')

def translateMessage(key, message, mode):
    translated = ''
    charsA = LETTERS
    charsB = key

    if mode == 'decrypt':
        charsA, charsB = charsB, charsA

    for symbol in message:
        if symbol.upper() in charsA:
            symIndex = charsA.find(symbol.upper())
            if symbol.isupper():
                translated += charsB[symIndex].upper()
            else:
                translated += charsB[symIndex].lower()
        else:
            translated += symbol

    return translated

def getRandomKey():
    key = list(LETTERS)
    random.shuffle(key)
    return ''.join(key)

if __name__ == '__main__':
    main()

簡單替代密碼的安全性分析

簡單替代密碼由於其金鑰空間龐大(26!),因此理論上很難被暴力破解。然而,其安全性依賴於金鑰的保密性。如果金鑰被洩露,整個加密系統就會被破解。此外,簡單替代密碼容易受到頻率分析攻擊,因為每種語言中字母的出現頻率是相對固定的。攻擊者可以透過分析密鑰中字母的出現頻率來推測出明文中的某些字母,從而破解加密訊息。

簡單替代加密法(Simple Substitution Cipher)程式解析

程式執行範例

當你執行這個程式時,輸出結果會類別似如下:

使用金鑰 LFWOAYUISVKMNXPBDCRJTQEGHZ
加密後的訊息是:
Sy l nlx sr pyyacao l ylwj eiswi upar lulsxrj isr sxrjsxwjr, ia esmm rwctjsxsza
sj wmpramh, lxo txmarr jia aqsoaxwa sr pqaceiamnsxu, ia esmm caytra jp famsaqa
sj. Sy, px jia pjiac ilxo, ia sr pyyacao rpnajisxu eiswi lyypcor l calrpx ypc
lwjsxu sx lwwpcolxwa jp isr sxrjsxwjr, ia esmm lwwabj sj aqax px jia rmsuijarj
aqsoaxwa. Jia pcsusx py nhjir sr agbmlsxao sx jisr elh. -Facjclxo Ctrramm
此訊息已複製到剪貼簿。

請注意,如果明文中的字母是小寫,那麼在密鑰中它仍然是小寫;如果明文中的字母是大寫,那麼在密鑰中它仍然是大寫。簡單替代加密法並不會加密空格或標點符號。(雖然本章末尾會說明如何修改程式來加密這些字元。)

要解密這個密鑰,只需將其貼上到第10行的myMessage變數中,並將myMode更改為字串'decrypt',然後再次執行程式。輸出結果將類別似如下:

使用金鑰 LFWOAYUISVKMNXPBDCRJTQEGHZ
解密後的訊息是:
If a man is offered a fact which goes against his instincts, he will scrutinize
it closely, and unless the evidence is overwhelming, he will refuse to believe
it. If, on the other hand, he is offered something which affords a reason for
acting in accordance to his instincts, he will accept it even on the slightest
evidence. The origin of myths is explained in this way. -Bertrand Russell
此訊息已複製到剪貼簿。

程式運作原理

主要函式:main()

def main():
    myMessage = 'If a man is offered a fact which goes against his instincts, he will scrutinize it closely, and unless the evidence is overwhelming, he will refuse to believe it. If, on the other hand, he is offered something which affords a reason for acting in accordance to his instincts, he will accept it even on the slightest evidence. The origin of myths is explained in this way. -Bertrand Russell'
    myKey = 'LFWOAYUISVKMNXPBDCRJTQEGHZ'
    myMode = 'encrypt'  # 設定為 'encrypt' 或 'decrypt'

main()函式包含了程式執行所需的變數:訊息、金鑰和模式。

檢查金鑰有效性:checkValidKey()

def checkValidKey(key):
    keyList = list(key)
    lettersList = list(LETTERS)
    keyList.sort()
    lettersList.sort()

簡單替代加密法的金鑰字串只有在包含符號集中的每個字元且沒有重複或遺失字母時才有效。我們可以透過將金鑰和符號集按字母順序排序並檢查它們是否相等來驗證金鑰的有效性。

加密與解密

if myMode == 'encrypt':
    translated = encryptMessage(myKey, myMessage)
elif myMode == 'decrypt':
    translated = decryptMessage(myKey, myMessage)

根據myMode變數的值,程式會呼叫encryptMessage()decryptMessage()函式,並將傳回的加密(或解密)訊息儲存在translated變數中。

輸出結果

print('使用金鑰 %s' % (myKey))
print('The %sed message is:' % (myMode))
print(translated)
pyperclip.copy(translated)
print()
print('此訊息已複製到剪貼簿。')

程式會輸出所使用的金鑰、加密(或解密)後的訊息,並將訊息複製到剪貼簿中。

sort() 列表方法

checkValidKey()函式中,我們使用了sort()列表方法來按字母順序重新排列列表中的元素。這個方法會直接修改原列表,而不是傳回一個新的列表。

程式碼解析:

keyList = list(key)
lettersList = list(LETTERS)
keyList.sort()
lettersList.sort()

這段程式碼首先將金鑰和符號集轉換為列表,然後對這兩個列表進行排序。排序後的列表可以用來比較金鑰是否有效。

簡單替換密碼技術解析

簡單替換密碼是一種基本的加密技術,透過替換字母來實作加密與解密。本篇將探討簡單替換密碼的實作原理與程式碼實作。

簡單替換密碼的基本原理

簡單替換密碼的核心在於建立一個替換表,將原本的字母依照特定的規則替換成其他字母。這個替換表的建立是根據一個金鑰(key),這個金鑰決定了字母的替換順序。

程式碼實作解析

simpleSubCipher.py 中,簡單替換密碼的實作包含了以下幾個關鍵部分:

金鑰驗證

keyList = list(key)
lettersList = list(LETTERS)
keyList.sort()
lettersList.sort()
if keyList != lettersList:
    sys.exit('There is an error in the key or symbol set.')

內容解密:

此段程式碼的作用是驗證金鑰的有效性。透過將金鑰列表和字母列表排序後進行比較,確保金鑰中沒有重複的字母且包含所有必要的字母。如果驗證失敗,程式將終止。

加密與解密函式

def encryptMessage(key, message):
    return translateMessage(key, message, 'encrypt')

def decryptMessage(key, message):
    return translateMessage(key, message, 'decrypt')

內容解密:

這兩個函式分別用於加密和解密訊息。它們都是對 translateMessage 函式的包裝,透過傳遞不同的模式引數來決定是加密還是解密。

訊息轉換函式

def translateMessage(key, message, mode):
    translated = ''
    charsA = LETTERS
    charsB = key
    if mode == 'decrypt':
        charsA, charsB = charsB, charsA
    # ... 其餘程式碼 ...

內容解密:

此函式負責實際的加密和解密操作。根據 mode 引數的不同,它會交換 charsAcharsB 的值,以實作加密或解密。charsAcharsB 分別代表原始字母表和替換後的字母表。

簡單替換密碼的工作流程

  1. 金鑰驗證:確保金鑰的有效性,避免重複或缺失的字母。
  2. 訊息處理:對輸入的訊息進行加密或解密,根據金鑰進行字母替換。
  3. 輸出結果:傳回加密或解密後的訊息。

簡單替代密碼技術深度解析

簡單替代密碼是一種基礎的加密技術,透過替換明文中的每個字母來實作加密。本章節將探討簡單替代密碼的實作原理及其在程式碼中的具體應用。

簡單替代密碼的核心機制

簡單替代密碼的核心在於使用一個金鑰(key)來對明文進行加密和解密。金鑰是一個包含所有字母的亂序字串,用於替代原始字母表中的字母。

程式碼解析

以下為簡單替代密碼實作的關鍵程式碼片段:

def translateMessage(key, message, mode):
    charsA = LETTERS
    charsB = key
    if mode == 'decrypt':
        charsA, charsB = charsB, charsA
    translated = ''
    for symbol in message:
        if symbol.upper() in charsA:
            symIndex = charsA.find(symbol.upper())
            if symbol.isupper():
                translated += charsB[symIndex].upper()
            else:
                translated += charsB[symIndex].lower()
        else:
            translated += symbol
    return translated

內容解密:

  1. 模式切換charsAcharsB 的值會根據 mode 引數進行交換,以實作加密和解密的切換。
  2. 符號處理:迴圈遍歷 message 中的每個符號,若符號為字母,則在 charsA 中查詢其索引,並根據大小寫替換為 charsB 中的對應字母。
  3. 大小寫保留:透過 isupper() 方法判斷原始符號的大小寫狀態,並相應地處理替換後的符號。
  4. 非字母符號處理:若符號非字母,則直接附加到 translated 結果中,保持原始狀態。

隨機金鑰生成

為了方便使用者,程式提供了一個隨機生成金鑰的功能:

def getRandomKey():
    key = list(LETTERS)
    random.shuffle(key)
    return ''.join(key)

內容解密:

  1. 金鑰生成原理:將 LETTERS 常數轉換為列表後,使用 random.shuffle() 方法進行亂序處理。
  2. 結果傳回:將亂序後的列表重新組合成字串並傳回,作為新的金鑰。

擴充套件加密範圍

預設情況下,簡單替代密碼僅加密字母。若需擴充套件至其他字元,需修改 LETTERS 常數和金鑰內容:

LETTERS = r""" !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"""
myKey = r"""/{9@6hUf:q?_)^eTi|W1,NLD7xk(-SF>Iz0E=d;Bu#c]w~'VvHKmpJ+}s8y& XtP43.b[OA!*\Q<M%$ZgG52YloaRCn"`rj"""

內容解密:

  1. LETTERS 修改:將所有需要加密的字元納入 LETTERS 中。
  2. 金鑰調整:提供一個與 LETTERS 對應的亂序金鑰。
  3. 簡化處理邏輯:由於字元集擴充套件,直接使用 find(symbol) 進行索引查詢,無需區分大小寫。