密码学 - 维吉尼亚密码的实现



在上一章中,我们看到了维吉尼亚密码,它的方法、优点和缺点。现在我们将使用不同的编程语言(如 Python、Java 和 C++)来实现维吉尼亚密码。

使用 Python 实现

这段 Python 代码实现了维吉尼亚密码,这是一种用于加密和解密文本消息的技术。generate_key() 函数以关键字作为输入,基于该关键字生成密钥,然后根据需要重复单词以确保密钥与文本长度匹配。encrypt_text() 函数使用维吉尼亚密码算法对文本进行加密,该算法根据密钥中匹配的字符对每个字符进行移位。同样,decrypt_text() 方法通过反转加密过程来解密密文并显示原始文本。

示例

以下是使用 Python 实现维吉尼亚密码的示例:

def generate_key(text, keyword):
   key = list(keyword)
   if len(text) == len(keyword):
      return key
   else:
      for i in range(len(text) - len(keyword)):
         key.append(key[i % len(keyword)])
   return "".join(key)

def encrypt_text(text, key):
   cipher_text = []
   for i in range(len(text)):
      x = (ord(text[i]) + ord(key[i])) % 26
      x += ord('A')
      cipher_text.append(chr(x))
   return "".join(cipher_text)

def decrypt_text(cipher_text, key):
   original_text = []
   for i in range(len(cipher_text)):
      x = (ord(cipher_text[i]) - ord(key[i]) + 26) % 26
      x += ord('A')
      original_text.append(chr(x))
   return "".join(original_text)

# Driver code
text = "TUTORIALSPOINT"
keyword = "KEY"
key = generate_key(text, keyword)
cipher_text = encrypt_text(text, key)
print("The Encrypted text:", cipher_text)
print("The Original/Decrypted Text:", decrypt_text(cipher_text, key))

以下是上述示例的输出:

输入/输出

The Encrypted text: DYRYVGKPQZSGXX
The Original/Decrypted Text: TUTORIALSPOINT

使用 Java 实现

维吉尼亚密码是一种用于加密和解密消息的方法。代码使用文本消息的长度和一个关键字来生成密钥。然后,使用此密钥通过将字母表中的每个字符移位到密钥中其正确的位置来加密文本消息。为了解密消息,使用相同的密钥反转加密过程并将每个字符移回其原始字母位置。拥有密钥的各方可以彼此私下通信,结果是原始消息。

示例

请参阅以下维吉尼亚密码的 Java 实现:

public class VigenereCipher {
   static String generateKey(String text, String keyword) {
     int textLength = text.length();
     for (int i = 0; ; i++) {
         if (textLength == i)
            i = 0;
         if (keyword.length() == textLength)
            break;
         keyword += (keyword.charAt(i));
      }
      return keyword;
   }

   static String encryptText(String text, String keyword) {
      String ciphertext = "";

      for (int i = 0; i < text.length(); i++) {
         // converting in range 0-25
         int x = (text.charAt(i) + keyword.charAt(i)) % 26;

         // convert into alphabets(ASCII)
         x += 'A';

         ciphertext += (char)(x);
      }
      return ciphertext;
   }

   // Decrypt the encrypted text and return the original text
   static String decryptText(String ciphertext, String keyword) {
     String originalText = "";

      for (int i = 0 ; i < ciphertext.length() && i < keyword.length(); i++) {
         // converting in range 0-25
         int x = (ciphertext.charAt(i) - keyword.charAt(i) + 26) % 26;

         // convert into alphabets(ASCII)
         x += 'A';
         originalText += (char)(x);
      }
      return originalText;
   }

   // Driver code
   public static void main(String[] args) {
      String message = "Hello everyone";
      String keyword = "Best";

      String text = message.toUpperCase();
      String key = keyword.toUpperCase();

      String generatedKey = generateKey(text, key);
      String encryptedText = encryptText(text, generatedKey);

      System.out.println("The Encrypted Text : " + encryptedText);

      System.out.println("The Original/Decrypted Text : " + decryptText(encryptedText, generatedKey));
   }
}

以下是上述示例的输出:

输入/输出

The Encrypted Text : IIDEPXWOFVQHOI
The Original/Decrypted Text : HELLOTEVERYONE

使用 C++ 实现

在本代码中,我们将使用 C++ 编程语言来实现维吉尼亚密码。在这个密码中,我们将对明文消息的字符应用一系列凯撒移位,使用一个密钥。密钥中的每个字母对应一个不同的移位值,密钥定义了对每个字符应用的移位量。在加密中,明文中的每个字符都根据密钥中给出的相应数字在字母表中向前移位。

同样,在解密中,通过将密文的字符向后移位相同数量(密钥中显示的数量),使原始明文可见。

示例

以下是使用 C++ 编程语言实现维吉尼亚密码的简单示例:

#include <iostream>  
#include <string>  
using namespace std;  
 
class VigenereCipher {  
   public:  
      string key;  

   VigenereCipher(string key) {  
      for (int i = 0; i < key.size(); ++i) {  
         if (key[i] >= 'A' && key[i] <= 'Z')  
            this -> key += key[i];  
         else if (key[i] >= 'a' && key[i] <= 'z')  
            this -> key += key[i] + 'A' - 'a';  
      }  
   }  
   
   string encryptFunc(string text) {  
      string out;  
      for (int i = 0, j = 0; i < text.length(); ++i) {  
         char c = text[i];  
         if (c >= 'a' && c <= 'z')  
            c += 'A' - 'a';  
         else if (c < 'A' || c > 'Z')  
            continue;  
         out += (c + key[j] - 2 * 'A') % 26 + 'A';  
         j = (j + 1) % key.length();  
      }  
      return out;  
   }  
   
   string decryptFunc(string text) {  
      string out;  
      for (int i = 0, j = 0; i < text.length(); ++i) {  
         char c = text[i];  
         if (c >= 'a' && c <= 'z')  
            c += 'A' - 'a';  
         else if (c < 'A' || c > 'Z')  
            continue;  
         out += (c - key[j] + 26) % 26 + 'A';  
         j = (j + 1) % key.length();  
      }  
      return out;  
   }  
}; 

int main() {  
   VigenereCipher cipher("VigenereCipher");   
   string plaintext = "Cyber Security";  
   string et = cipher.encryptFunc(plaintext);  
   string dt = cipher.decryptFunc(et);  

   cout << "The Plaintext: " << plaintext << endl;  
   cout << "The Encrypted Text: " << et << endl;  
   cout << "The Decrypted Text: " << dt << endl;  
}  

以下是上述示例的输出:

输入/输出

The Plaintext: Cyber Security
The Encrypted Text: XGHIEWVGWZXAC
The Decrypted Text: CYBERSECURITY
广告