密碼學中的凱撒密碼


凱撒密碼是一種簡單的替換密碼,以羅馬統治者朱利葉斯·凱撒的名字命名,據說他曾用它與他的官員進行通訊。這種技術涉及將訊息中的每個字母在字母表中移動固定數量的位置。例如,如果移動3個位置,A 將被替換為 D,B 將變為 E,依此類推。

凱撒密碼相對容易破解,被認為是一種非常弱的加密形式,但它對朱利葉斯·凱撒來說已經足夠了。它仍然用於教育和娛樂目的。

凱撒密碼演算法

以下是用凱撒密碼對訊息進行編碼的基本演算法,移位量為 k −

  • 將變數 shift 初始化為 k 的值。

  • 遍歷訊息中的每個字元 c −

    • 如果 c 是字母(大寫或小寫),則在字母表中將其移動 shift 個位置。

      • 要移動大寫字母,請從字母中減去 'A',加上 shift 值,並取模 26。然後新增 'A' 以獲得移動後的字母。

      • 要移動小寫字母,請從字母中減去 'a',加上 shift 值,並取模 26。然後新增 'a' 以獲得移動後的字母。

    • b. 將移動後的字母附加到編碼後的訊息中。

  • 返回編碼後的訊息。

要解碼編碼後的訊息,可以使用移位量為 -k 的相同演算法。

示例

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

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

請注意,此演算法是有限的,並且可以被密碼分析師輕鬆破解。不建議在任何實際應用中使用它,它通常用作密碼學領域中的學習工具。

示例

以下是用移位量為 3 的凱撒密碼對訊息進行編碼和解碼的示例 −

plaintext = "HELLO WORLD"
shift = 3

ciphertext = caesar_cipher_encrypt(plaintext, shift)
print("Encrypted message:", ciphertext) # Encrypted message: KHOOR ZRUOG

decrypted_text = caesar_cipher_decrypt(ciphertext, shift)
print("Decrypted message:", decrypted_text) # Decrypted message: HELLO WORLD

可以看到,在第一步中,明文“HELLO WORLD”與移位值 3 一起傳遞給 caesar_cipher_encrypt 函式,從而產生密文“KHOOR ZRUOG”。

在第二步中,先前獲得的密文與相同的移位值一起傳遞給 caesar_cipher_decrypt 函式,並獲得原始明文訊息。

示例

plaintext = "hello world"
shift = 2
ciphertext = caesar_cipher_encrypt(plaintext, shift)
print("Encrypted message:", ciphertext) # Encrypted message: jgnnq ytqng
decrypted_text = caesar_cipher_decrypt(ciphertext, shift)
print("Decrypted message:", decrypted_text) # Decrypted message: hello world

可以看到,加密和解密過程中使用了移位量 2,從而得到相同的明文訊息“hello world”。

請注意,這只是一個示例,凱撒密碼不安全,不應在實際應用中使用。

如何解密?

凱撒密碼是一種簡單的替換密碼,因此解密編碼訊息最直接的方法是嘗試不同的移位值,直到解密後的訊息有意義為止。這稱為“暴力破解”攻擊。

以下是用暴力破解攻擊解碼編碼訊息的基本演算法 −

  • 遍歷所有可能的移位值,從 0 到 25(因為字母表中有 26 個字母)。

  • 對於每個移位值,建立一個新的空字串來儲存解碼後的訊息。

  • 遍歷編碼訊息中的每個字元 c −

    • 如果 c 是字母(大寫或小寫),則在字母表中將其向後移動當前移位值個位置。

      • 要將大寫字母向後移動,請從字母中減去當前移位值,加上 26 並取模 26。然後新增 'A' 以獲得原始字母。

      • 要將小寫字母向後移動,請從字母中減去當前移位值,加上 26 並取模 26。然後新增 'a' 以獲得原始字母。

    • 將移動後的字母附加到解碼後的訊息中。

  • 列印解碼後的訊息以及使用的移位值。

  • 重複此過程,直到訊息有意義為止。

值得一提的是,更高階的方法(如頻率分析、模式識別)可以比暴力破解方法更快地破解密文。

需要注意的是,凱撒密碼非常弱,在現代密碼學中不被認為是安全的。它通常用作學習工具,以介紹替換密碼的概念。

更新於: 2023年2月8日

4K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告