古典密碼學 (一)

ZapcoMan發表於2024-10-13

古典密碼學 (一)

凱撒密碼

  • 愷撒密碼 (Caesar Cipher) 又被稱為 凱撒變換或者叫做變換密碼。該密碼是以凱撒大帝的名字命名的。 凱撒密碼是一種替換加密,透過該明文中的所有字母都在字母表上向後或者向前移動固定數目替換為密文 例如 當偏移量為3的時候,字母A就會變成D,字母B就會被替換成E
  • 凱撒密碼不僅本身是一種加密方式,同樣也是作為很多加密演算法的重要過程,例如凱撒密碼通常會被作為維吉尼亞密碼中的一個步驟。
# 示例程式碼
def caesar_cipher(text, shift, mode='encrypt'):
    """
    實現凱撒密碼的加密或解密。

    引數:
    text : str
        需要加密或解密的文字。
    shift : int
        字元移動的位置數。
    mode : str, 可選
        操作模式,'encrypt' 為加密,'decrypt' 為解密,預設為 'encrypt'。

    返回:
    str
        加密或解密後的文字。
    """
    result = ""
    # 根據模式調整偏移量
    if mode == 'decrypt':
        shift = -shift
    for char in text:
        # 處理字母字元
        if char.isalpha():
            start = ord('a') if char.islower() else ord('A')
            offset = (ord(char) - start + shift) % 26
            result += chr(start + offset)
        else:
            # 非字母字元直接新增
            result += char
    return result


# 輸入原文
text = input("")
# 輸入偏移量
shift = int(input(""))

# 執行加密操作
encrypted_text = caesar_cipher(text, shift)
print("Encrypted:", encrypted_text)

# 執行解密操作
decrypted_text = caesar_cipher(encrypted_text, shift, mode='decrypt')
print("Decrypted:", decrypted_text)

Atbash 密碼

  • 埃特巴什碼 (Atbash Cipher)是一種簡單的替換密碼,與凱撒密碼型別,區別在於替換的規則不透過 一般 埃特巴什碼使用下面的碼錶
明文:ABCDEFGHIJKLMNOPRSTUVWXYZ
密文:ZYXWVUTSRPONMLKJIHGEFDCBA
  • 這是使用一種將字母表前後倒轉進行替換 同樣可以直接按照碼錶轉回進行解密或者使用詞頻分析進行破解
# 示例程式碼
def atbash_cipher(text):
    """
    實現Atbash密碼的加密和解密。

    引數:
    text : str
        需要加密或解密的文字。

    返回:
    str
        加密或解密後的文字。
    """
    result = ""
    for char in text:
        if char.isalpha():
            # 判斷字母大小寫並進行轉換
            start = ord('a') if char.islower() else ord('A')
            # 使用25 - (ord(char) - start)實現Atbash密碼邏輯
            result += chr(start + (25 - (ord(char) - start)))
        else:
            # 非字母字元直接新增
            result += char
    return result


# 輸入原文
text = input("Enter the text: ")
# 輸入要執行的操作 輸入 1 執行加密 輸入2 執行解密
choice = int(input("Enter 1 for encryption or 2 for decryption: "))
if choice == 1:
    # 執行加密操作
    encrypted_text = atbash_cipher(text)
    print("Encrypted:", encrypted_text)
elif choice == 2:
    # 再次執行Atbash密碼將加密文字轉換回原文
    decrypted_text = atbash_cipher(text)
    print("Decrypted:", decrypted_text)
else:
    print("Invalid choice. Exiting.")
    exit()

將兩種 加密方式進行混合 中間再插一次 字串反轉

def caesar_cipher(text, shift, mode='encrypt'):
    """
    實現凱撒密碼的加密或解密。

    引數:
    text : str
        需要加密或解密的文字。
    shift : int
        字元移動的位置數。
    mode : str, 可選
        操作模式,'encrypt' 為加密,'decrypt' 為解密,預設為 'encrypt'。

    返回:
    str
        加密或解密後的文字。
    """
    result = ""
    # 根據模式調整偏移量
    if mode == 'decrypt':
        shift = -shift
    for char in text:
        # 處理字母字元
        if char.isalpha():
            start = ord('a') if char.islower() else ord('A')
            offset = (ord(char) - start + shift) % 26
            result += chr(start + offset)
        else:
            # 非字母字元直接新增
            result += char
    return result

def atbash_cipher(text):
    """
    實現Atbash密碼的加密和解密。

    引數:
    text : str
        需要加密或解密的文字。

    返回:
    str
        加密或解密後的文字。
    """
    result = ""
    for char in text:
        if char.isalpha():
            # 判斷字母大小寫並進行轉換
            start = ord('a') if char.islower() else ord('A')
            # 使用25 - (ord(char) - start)實現Atbash密碼邏輯
            result += chr(start + (25 - (ord(char) - start)))
        else:
            # 非字母字元直接新增
            result += char
    return result

# 字串反轉
def reverse_string(text):
    return text[::-1]

# 加密的文字
text = input()
# 偏移量
shift = int(input())
# 使用凱撒密碼加密後,再使用Atbash密碼加密,並將結果反轉
print("加密:"+atbash_cipher(reverse_string(caesar_cipher(text, shift))))
加密之後的密文 = atbash_cipher(reverse_string(caesar_cipher(text, shift)))
print("解密:"+atbash_cipher(reverse_string(caesar_cipher(加密之後的密文, shift, mode='decrypt'))))

相關文章