密碼學 - 凱撒密碼



下一個密碼演算法是凱撒密碼。本章我們將瞭解凱撒密碼究竟是什麼,它是如何工作的,以及它與不同技術的實現。讓我們深入研究一下。

什麼是凱撒密碼?

凱撒密碼演算法是一種簡單易用的加密技術。它是一種簡單的替換密碼,其中字母透過使用選定的位數來移動以建立編碼的訊息。使用位移為 2 的凱撒密碼,A 可以編碼為 C,M 為 O,Z 為 B,依此類推。此技術以羅馬領導人朱利葉斯·凱撒的名字命名。它用於他的私人信件中。它是加密訊息最簡單和最古老的方法之一。

Caesar cipher

演算法

以下是凱撒密碼的加密和解密演算法:

加密演算法

對於加密演算法,步驟如下:

  • 選擇一個數字作為你的“位移”值。此數字決定每個字母在字母表中移動多少。

  • 從你的訊息開始。檢視訊息中的每個字母。

  • 將每個字母在字母表中向前移動選擇的位移值。例如,如果位移值為 3,則“A”將變為“D”,“M”將變為“P”,依此類推。

  • 儲存新字母而不是舊字母。

  • 對訊息中的每個字母都這樣做。

解密演算法

對於解密演算法,請參見以下步驟:

  • 從加密的訊息開始。

  • 知道用於加密的位移值。

  • 檢視加密訊息中的每個字母。
  • 將每個字母在字母表中向後移動位移值以將其解密。例如,如果位移值為 3,則“D”將變為“A”,“P”將變為“M”,依此類推。

  • 儲存解密的字母而不是加密的字母。

  • 對加密訊息中的所有字母都這樣做。

使用 Python 實現

因此,使用各種 Python 模組和方法,我們可以透過多種方式實現此演算法。在下面的部分中,讓我們分別探討每種方法:

  • 使用字串模組

  • 使用列表推導式

使用字串模組

在這種方法中,我們將使用 Python 的字串模組。此模組用於處理字串。此模組具有一些常量、實用程式函式和用於字串操作的類。由於它是一個內建模組,因此我們必須在使用其任何常量和類之前匯入它。

因此,字串模組用於訪問小寫字母並執行建立凱撒密碼演算法所需的字串操作。

加密示例

以下是使用 Python 字串模組實現凱撒密碼的示例:

import string
def caesar_cipher(text, shift):
   letters = string.ascii_lowercase
   shifted_letters = letters[shift:] + letters[:shift]
   table = str.maketrans(letters, shifted_letters)
   return text.translate(table)
# function execution
message = "hello"
shift_value = 3
encrypted_msg = caesar_cipher(message, shift_value)
print("Encrypted message:", encrypted_msg)

以下是上述示例的輸出:

輸入/輸出
I/P -> Plain text : hello
O/P -> Encrypted message: khoor

解密示例

要解密上述文字訊息,我們可以在 Python 中使用以下程式碼:

def caesar_decipher(text, shift):
   # Decryption is just like encryption but with a negative shift
   return caesar_cipher(text, -shift)
# Decryption
encrypted_msg = khoor
decrypted_msg = caesar_decipher(encrypted_msg, shift_value)
print("Decrypted message:", decrypted_msg)

以下是上述示例的輸出:

輸入/輸出
I/P -> Cipher Text: khoor
O/P -> Decrypted message: hello

使用列表推導式

現在,我們將使用列表推導式透過迭代輸入文字中的每個人來建立一個新字串。在列表中,有一個條件表示式檢查每個字母是大寫、小寫還是非字母。我們將基本上加密輸入文字中的每個字母,並將非字母字元原樣保留。

加密示例

以下是使用 Python 中的列表推導式實現凱撒密碼演算法的示例:

def caesar_cipher(text, shift):
   encrypted_text = ''
   for char in text:
      if 'A' <= char <= 'Z':
         encrypted_text += chr((ord(char) - 65 + shift) % 26 + 65)
      elif 'a' <= char <= 'z':
         encrypted_text += chr((ord(char) - 97 + shift) % 26 + 97)
      else:
         encrypted_text += char
   return encrypted_text

# function execution 
message = "hello everyone"
shift_value = 3
encrypted_msg = caesar_cipher(message, shift_value)
print("Encrypted message:", encrypted_msg)

以下是上述示例的輸出:

輸入/輸出
I/P -> Plain text: hello everyone
O/P -> Encrypted message: khoor hyhubrqh

解密示例

要為凱撒密碼加密訊息建立解密程式,我們可以反轉加密過程。以下是使用列表推導式實現上述凱撒密碼加密函式的解密程式碼:

def caesar_decipher(text, shift):
   decrypted_text = ''
   for char in text:
      if 'A' <= char <= 'Z':
         decrypted_text += chr((ord(char) - 65 - shift) % 26 + 65)
      elif 'a' <= char <= 'z':
         decrypted_text += chr((ord(char) - 97 - shift) % 26 + 97)
      else:
         decrypted_text += char
   return decrypted_text

# Function execution
encrypted_msg = "khoor hyhubrqh"
shift_value = 3

# Decryption
decrypted_msg = caesar_decipher(encrypted_msg, shift_value)
print("Decrypted message:", decrypted_msg)

以下是上述示例的輸出:

輸入/輸出
I/P -> Cipher text: khoor hyhubrqh
O/P -> Decrypted message: hello everyone

使用 C++ 實現

此方法將訊息和位移值作為輸入。然後,它迭代訊息中的每個字元並將其按給定數量移動以建立凱撒密碼演算法。它將加密的訊息作為字串返回。因此,以下是使用 C++ 程式語言實現凱撒密碼的示例:

示例

#include <iostream>
#include <string>

using namespace std;

// Function to encrypt a message 
string encrypt(string message, int shift) {
   string encrypted = "";

   for (char& c : message) {
      // Shift each character by the given spaces
      if (isalpha(c)) {
         if (isupper(c)) {
            encrypted += char(int(c + shift - 65) % 26 + 65);
         } else {
            encrypted += char(int(c + shift - 97) % 26 + 97);
         }
      } else {
         encrypted += c;  // Keep non-alphabetic characters unchanged
      }
   }

   return encrypted;
}

int main() {
   string message = "Hello, Tutorialspoint!";
   int shift = 3;
   string encrypted_msg = encrypt(message, shift);

   cout << "The Original Message: " << message << endl;
   cout << "The Encrypted Message: " << encrypted_msg << endl;

   return 0;
}

以下是上述示例的輸出:

輸入/輸出

The Original Message: Hello, Tutorialspoint!
The Encrypted Message: Khoor, Wxwruldovsrlqw!

使用 Java 實現

此方法的輸入是位移值和明文訊息。然後,藉助凱撒密碼方法,我們將迭代地將訊息中的每個字元按給定數量移動。加密的訊息作為字串返回。因此,Java 中凱撒密碼的實現如下:

示例

public class CaesarCipherClass {
   // Method to encrypt a message 
   public static String encryptFunc(String message, int shift) {
      StringBuilder encrypted = new StringBuilder();

      for (char c : message.toCharArray()) {
         // Shift each character by the given amount
         if (Character.isLetter(c)) {
            char base = Character.isUpperCase(c) ? 'A' : 'a';
               encrypted.append((char) ((c - base + shift) % 26 + base));
         } else {
            encrypted.append(c);  // Keep non-alphabetic characters unchanged
         }
      }

      return encrypted.toString();
   }

   public static void main(String[] args) {
      String message = "Hello, Everyone there!";
      int shift = 3;
      String encryptedMsg = encryptFunc(message, shift);

      System.out.println("The Original Message: " + message);
      System.out.println("The Encrypted Message: " + encryptedMsg);
   }
}

以下是上述示例的輸出:

輸入/輸出

The Original Message: Hello, Everyone there!
The Encrypted Message: Khoor, Hyhubrqh wkhuh!

凱撒密碼的特性

  • 凱撒密碼是一種簡單且古老的加密方法。它使用一種技術,我們將明文中的每個字母按固定的位置數移動以生成密文。

  • 使用程式語言中的基本字串操作和模運算,很容易實現凱撒密碼。

  • 可以透過更改位移值輕鬆自定義它,並且它允許不同級別的加密。

  • 使用凱撒密碼的加密和解密速度快且效率高,但僅適用於短訊息。

  • 由於英語字母表中只有 26 個字母,因此凱撒密碼的金鑰大小很小,最多隻有 26 個可能的金鑰。

凱撒密碼的缺點

  • 凱撒密碼的安全性非常弱,因為它只有 26 個可能的金鑰。因此,這使得駭客很容易嘗試所有選項並解密訊息。

  • 固定的字母大小也使其容易受到頻率分析攻擊,在頻率分析攻擊中,駭客使用字母的常見性來猜測金鑰。

  • 對密文的修改也可能未被檢測到,因為它缺乏身份驗證。

由於這些弱點,它不適合現代加密要求。

總結

凱撒密碼是一種簡單的隱藏資訊的方法。它透過使用固定的位移數量來移動訊息中的每個字母。使用它時,我們可以選擇一個位移數字,並將每個字母移動該數字來加密訊息。但它並不安全,因為只有26個可能的金鑰,攻擊者很容易猜測出密碼。因為他們可以使用字母頻率來猜測實際的字母。因此,出於這個原因,它現在已經不再使用了。

廣告
© . All rights reserved.