用 Python 实现列置换加密

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个项目中,你将学习如何用Python实现列置换加密算法。列置换加密是一种基于关键词对由输入文本构成的矩阵的列进行重新排列来加密明文的方法。

👀 预览

## 示例1
text = "welcometolq"; encryption_text = "ct,emlwooleq"
## 示例2
text = "welcometolq "; encryption_text = "ct emlwooleq"
## 示例3
text = "w"; encryption_text = ",,w,"
## 示例4
text = None; encryption_text = None

🎯 任务

在这个项目中,你将学习:

  • 列置换加密的基本概念
  • 如何用Python实现列置换加密算法
  • 如何用示例输入测试加密算法

🏆 成果

完成这个项目后,你将能够:

  • 理解列置换加密的原理
  • 用Python实现列置换加密算法
  • 使用列置换加密方法对文本进行加密和解密

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/BasicConceptsGroup(["Basic Concepts"]) python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/DataStructuresGroup(["Data Structures"]) python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/BasicConceptsGroup -.-> python/strings("Strings") python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/DataStructuresGroup -.-> python/lists("Lists") python/FunctionsGroup -.-> python/function_definition("Function Definition") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/strings -.-> lab-302705{{"用 Python 实现列置换加密"}} python/conditional_statements -.-> lab-302705{{"用 Python 实现列置换加密"}} python/lists -.-> lab-302705{{"用 Python 实现列置换加密"}} python/function_definition -.-> lab-302705{{"用 Python 实现列置换加密"}} python/standard_libraries -.-> lab-302705{{"用 Python 实现列置换加密"}} python/file_operations -.-> lab-302705{{"用 Python 实现列置换加密"}} end

理解列置换加密

在这一步中,你将学习列置换加密的基本概念及其工作原理。

列置换加密是一种加密明文的方法,具体做法是将明文逐行写下,每行包含固定数量的字符(密钥中唯一字母的数量,密钥通常是一个没有重复字母的单词)。如果最后一行的字符数少于每行的固定字符数,则使用特殊符号填充该行,从而形成一个矩阵。然后,根据密钥中字母的字母顺序重新排列矩阵的列。最后,按顺序逐个读出重新排列后的列,得到密文。

例如,考虑以下明文、密钥和填充字符:

明文:welcometolq

密钥:qiao

填充字符:,

  1. 密钥qiao的长度为4。然后按照26个英文字母的字母顺序为密钥中的字母分配数字,字母在字母顺序中出现越早,分配的数字越小。qiao分配的数字是4 - 2 - 1 - 3。
  2. 将明文分成行,每行由4个(密钥的长度)字母组成,形成4列:
1 2 3 4
w e l c
o m e t
o l q ,
  1. 由于最后一行缺少一个字母,因此使用填充字符来填充。
  2. 根据密钥的字母顺序重新排列矩阵中的列:
4 2 1 3
c e w l
t m o e
, l o q
  1. 然后一次读出一列内容,得到密文:ct,emlwooleq

实现列置换加密

在这一步中,你将用Python实现列置换加密算法。

打开column_permutation.py文件,找到column_permutation_encryption(text)函数。该函数以一段文本作为输入,使用密钥qiao和填充字符,(逗号)对内容进行列置换加密,并返回密文。

以下是你需要实现的代码:

def column_permutation_encryption(text: str) -> str:
    if not text:
        return None

    key = "qiao"
    padding_char = ","
    key_order = []
    sorted_key = sorted(key)
    for i in range(0, len(key)):
        key_order.append(sorted_key.index(key[i]))
    padded_text = text.ljust(len(key) * ((len(text) - 1) // len(key) + 1), padding_char)
    matrix = [
        padded_text[i : i + len(key)] for i in range(0, len(padded_text), len(key))
    ]
    encrypted_matrix = [[row[i] for i in key_order] for row in matrix]

    encryption_text: str = "".join(
        ["".join(column) for column in zip(*encrypted_matrix)]
    )
    return encryption_text

让我们逐步分析这段代码:

  1. 首先,我们检查输入的text是否为空。如果为空,我们返回None
  2. 我们将key定义为"qiao",将padding_char定义为","
  3. 我们创建一个key_order列表来存储密钥中字母的字母顺序。我们通过先对密钥进行排序,然后找到每个字母在排序后的密钥中的索引来实现这一点。
  4. 我们用padding_char对输入的text进行填充,以确保文本的长度是密钥长度的倍数。
  5. 我们从填充后的文本创建一个矩阵,其中每一行代表文本的一行,每一列代表该行中的一个字符。
  6. 我们根据之前计算的key_order重新排列矩阵的列。
  7. 最后,我们逐个读取重新排列后的列,并将它们连接起来形成密文。

测试列置换加密

既然你已经实现了列置换加密算法,那就让我们用一些示例输入来测试它。

column_permutation.py文件的末尾添加以下代码:

if __name__ == "__main__":
    txt = input()
    print(column_permutation_encryption(txt))

这段代码会提示用户输入一段文本,然后使用输入的文本调用column_permutation_encryption()函数,并打印生成的密文。

保存文件并在终端中运行以下命令:

python3 column_permutation.py

输入一些示例文本并观察生成的密文。你可以将原始挑战中提供的示例用作参考:

## 示例1
text = "welcometolq"
encryption_text = "ct,emlwooleq"
## 示例2
text = "welcometolq "
encryption_text = "ct emlwooleq"
## 示例3
text = "w"
encryption_text = ",,w,"
## 示例4
text = None
encryption_text = None

恭喜你!你已经成功地用Python实现了列置换加密算法。

✨ 查看解决方案并练习

总结

恭喜你!你已经完成了这个项目。你可以在LabEx中练习更多实验来提升你的技能。