密码学 - 转置密码解密



在上一章中,我们学习了转置密码加密。现在我们将学习转置密码的解密及其使用不同方法的实现。

解密过程只是反转加密算法的步骤。我们使用相同的密钥来查找读取列以恢复实际消息的正确顺序。

转置密码解密算法

以下是转置密码解密的算法:

输入

  • 密文 - 加密的消息。

  • 密钥 - 用于加密的相同密钥。

步骤

  • 首先,我们需要根据密钥长度将密文分成多行。这意味着我们将为密钥中的每个字符创建一个行。

  • 现在,我们将创建一个空的网格,其行数与密钥长度相同,列数等于密文长度除以密钥长度的结果。

  • 接下来,我们必须根据密钥填充网格。因此,迭代密文字符以确定其列索引。

  • 并将字符添加到网格中的相应单元格中。

  • 从第一列开始,向下读取字符,到达底部后移动到下一列。对所有列继续此过程。这会根据原始转置顺序重新排列字符。

  • 打印明文消息。

示例

输入

  • 密文:OLHEL LWRDO

  • 密钥:SECRET

例如,如果我们知道密钥是“SECRET”,并且原始消息是根据密钥中字母的顺序进行转置的。我们可以像下面这样重新排列列:

密钥 S E C R E T
5, 1, 2, 4, 6, 3

现在,我们将根据密钥重新排序转置消息“OLHEL LWRDO”的列,如下所示:

S O L
E H E
C L W
R H R
E E D
T L O

最后,我们逐行读取字符以获取原始消息:

原始消息:HELLO WORLD

因此,使用密钥“SECRET”对加密消息“OLHEL LWRDO”解密后的消息是“HELLO WORLD”。

太棒了!我们已经使用转置密码解密了我们的消息。

使用 Python 实现

可以使用不同的方法实现转置密码的解密:

  • 使用 Math 模块

  • 使用 Pyperclip 模块

因此,让我们在以下部分逐一查看这两种方法:

使用 Math 模块

此 Python 代码解密使用转置密码加密的消息。我们将使用 math 模块执行数学运算,主要是计算解密消息所需的列数。math.ceil() 用于将消息长度除以密钥的结果向上取整。因此,此代码有效地解密转置密码消息。

示例

以下是使用 Math 模块的转置密码解密算法的 Python 代码。请参见下面的程序:

import math

def transposition_decrypt(key, message):
   num_of_columns = math.ceil(len(message) / key)
   num_of_rows = key
   num_of_shaded_boxes = (num_of_columns * num_of_rows) - len(message)
   plaintext = [''] * num_of_columns
   col = 0
   row = 0

   for symbol in message:
      plaintext[col] += symbol
      col += 1
      if (col == num_of_columns) or (col == num_of_columns - 1 and row >= num_of_rows - num_of_shaded_boxes):
         col = 0
         row += 1

   return ''.join(plaintext)

ciphertext = 'Toners raiCntisippoh'
key = 6
plaintext = transposition_decrypt(key, ciphertext)
print("Cipher Text: ", ciphertext)
print("The plain text is: ", plaintext)

以下是上述示例的输出:

输入/输出
Cipher Text:  Toners raiCntisippoh
The plain text is:  Transposition Cipher

在上面的输出中,您可以看到密文消息是 Toners raiCntisippoh,解密后的消息是 Transposition Cipher。

使用 Pyperclip 模块

在此示例中,我们将使用 Python 的 pyperclip 模块,它用于复制和粘贴剪贴板功能。因此,我们将使用此模块将解密的消息复制到剪贴板。

此代码与上面的代码类似,但在本代码中,我们使用 pyperclip 模块将解密的消息复制到剪贴板。

示例

以下是使用 pyperclip 模块的转置密码解密算法的 Python 代码。请检查下面的代码:

import math
import pyperclip

def transposition_decrypt(key, message):
   num_of_columns = math.ceil(len(message) / key)
   num_of_rows = key
   num_of_shaded_boxes = (num_of_columns * num_of_rows) - len(message)
   plaintext = [''] * num_of_columns
   col = 0
   row = 0

   for symbol in message:
      plaintext[col] += symbol
      col += 1
      if (col == num_of_columns) or (col == num_of_columns - 1 and row >= num_of_rows - num_of_shaded_boxes):
         col = 0
         row += 1

   return ''.join(plaintext)

ciphertext = 'Toners raiCntisippoh'
key = 6
plaintext = transposition_decrypt(key, ciphertext)
print("Cipher Text:", ciphertext)
print("The plain text is:", plaintext)

# Copy the decrypted plaintext to the clipboard
pyperclip.copy(plaintext)
print("The Decrypted Message is Copied to the Clipboard")

以下是上述示例的输出:

输入/输出
Cipher Text: Toners raiCntisippoh
The plain text is: Transposition Cipher
The Decrypted Message is Copied to the Clipboard

在上面的输出中,我们可以看到明文已复制到剪贴板,并且显示消息“解密后的消息已复制到剪贴板”。

使用 Java 实现

我们将使用 Java 编程语言来实现转置密码的解密。基本上,我们将使用 Java 在此实现中反转加密过程。

请参见 Java 中的以下代码:

示例

public class TranspositionCipher {
   // Function to decrypt using transposition cipher
   public static String decrypt(String ciphertext, int key) {
      StringBuilder plaintext = new StringBuilder();
      int cols = (int) Math.ceil((double) ciphertext.length() / key);
      char[][] matrix = new char[cols][key];

      // Fill matrix with ciphertext characters
      int index = 0;
      for (int j = 0; j < key; ++j) {
         for (int i = 0; i < cols; ++i) {
            if (index < ciphertext.length())
               matrix[i][j] = ciphertext.charAt(index++);
            else
               matrix[i][j] = ' ';
         }
      }

      // Read matrix row-wise to get plaintext
      for (int i = 0; i < cols; ++i) {
         for (int j = 0; j < key; ++j) {
            plaintext.append(matrix[i][j]);
         }
      }

      return plaintext.toString();
   }

   public static void main(String[] args) {
      String ciphertext = "Hohiebtlre,isrei ll s yafwdlT v uuo ";
      int key = 4;
      System.out.println("The Encrypted text: " + ciphertext);
      String decryptedText = decrypt(ciphertext, key);
      System.out.println("Decrypted text: " + decryptedText);
   }
}

以下是上述示例的输出:

输入/输出

The Encrypted text: Hohiebtlre,isrei ll s yafwdlT v uuo 
Decrypted text: Hello, This is very beautiful world 

使用 C++ 实现

现在,我们将使用 C++ 编程语言来实现转置密码的解密算法。在其中,我们将通过 decrypt 函数反转加密过程。它通过计算密文长度和密钥来找到所需的列数。它将密文中的字符按列添加到矩阵中。之后,它使用矩阵的逐行读取来构建明文。

以下是使用 C++ 实现转置密码解密的代码:

示例

#include <iostream>
#include <string>
#include <cmath>

// Function to decrypt using transposition cipher
std::string decrypt(std::string ciphertext, int key) {
   std::string plaintext = "";
   int cols = (ciphertext.length() + key - 1) / key;
   char matrix[cols][key];

   // Fill matrix with ciphertext characters
   int index = 0;
   for (int j = 0; j < key; ++j) {
      for (int i = 0; i < cols; ++i) {
         if (index < ciphertext.length())
            matrix[i][j] = ciphertext[index++];
         else
            matrix[i][j] = ' ';
      }
   }

   // Read matrix row-wise to get plaintext
   for (int i = 0; i < cols; ++i) {
      for (int j = 0; j < key; ++j) {
         plaintext += matrix[i][j];
      }
   }

   return plaintext;
}

int main() {
   std::string ciphertext = "Houiptme,tao il oliFllTrsnay";
   int key = 4;
   std::cout << "The Encrypted text: " << ciphertext << std::endl;
   std::string decrypted_text = decrypt(ciphertext, key);
   std::cout << "The Decrypted text: " << decrypted_text << std::endl;

   return 0;
}

以下是上述示例的输出:

输入/输出

The Encrypted text: Houiptme,tao il oliFllTrsnay
The Decrypted text: Hello, Tutorialspoint Family

总结

在本章中,我们已经了解了如何使用 Python、C++ 和 Java 中的转置密码解密算法将密文解密回其原始形式。

广告