简述

代换密码是古典密码中的典型例子,采用单表代换的方式进行加密。

单表代换即在原始顺序的26个字母表的基础上,通过改变字母位置而生成无序的26字母表,该字母表就是本次加密的密钥。

比如在下表中,大写字母即初始字母表,其对应的小写字母,就是变换顺序后的字母表,也就是密钥。
在这里插入图片描述
因为代换密码的密钥是26个字母的排列组合,因此该加密算法的密钥空间为26!,与凯撒密码相比,如果对代换密码进行穷举搜索的方式进行攻击,计算量会相当大。

加解密

  • 加密过程

作为古典密码,代换密码的加密过程很简单,当给出本次加密的密钥时,只需要将明文字母用其对应的密钥字母进行替代,就完成了加密。

比如置换表如下:
在这里插入图片描述
当明文是“ENCRYPT”时,其对应的密文就是“tfeknhz”。

  • 解密过程

由于代换密码的加密实质是形成明文与密文的一一映射关系,因此解密过程和加密相同,其实就是将密文对照其加密所用的置换表,得出明文。

由上述置换表得出其逆置换表:
在这里插入图片描述
再将刚才的密文“tfeknhz”逐一查找,即得出明文“ENCRYPT”。

代码实现

  • 思路

使用代码实现主要分一下三个步骤:

1、生成随机置换表(即:初始字母表和随机的密钥字母表);

2、将输入的明文进行处理,使其在置换表中找出对应的密文字母;

3、将输入的密文进行处理,将密文反向代入置换表中找出对应的明文字母。

  • 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import random, re

initialForm = [] # 初始字母表
resultForm = [] # 置换字母表
letterList = [] # 顺序字母列表

# 生成置换表
def creatForm():
# 生成初始表格(A-Z)
for i in range(ord("A"), ord("Z") + 1):
initialForm.append(chr(i))
letterList.append(chr(i + 32))

# 生成置换表格(随机顺序)
while len(resultForm) < 26:
letter = random.choice(letterList)
letterList.remove(letter)
resultForm.append(letter)

# 加密
def encrypt(massage):
ciphertext = ""
for i in massage:
ciphertext += resultForm[initialForm.index(i)]
return ciphertext

# 解密
def decrypt(massage):
print(massage)
plaintext = ""
for i in massage:
plaintext += initialForm[resultForm.index(i)]
return plaintext

if __name__ == "__main__":
creatForm()
while True:
print("1、Encrypt 2、Decrypt 3、Show Form")
choice = int(input("Please choose(Input number):"))
if choice == 1:
# 使用正则过滤非字母并转换为大写
plaintext = (re.sub("[^a-zA-Z]", "", input("Input plaintext:"))).upper()
ciphertext = encrypt(plaintext)
print("ciphertext:", ciphertext)
elif choice == 2:
# 使用正则过滤字母并转换为小写
ciphertext = (re.sub("[^a-zA-Z]", "", input("Input ciphertext:"))).lower()
plaintext = decrypt(ciphertext)
print("plaintext:", plaintext)
elif choice == 3:
print("The Form Of This Operation:\n", initialForm, "\n", resultForm)
else:
print("Input error!")

结果

1、输入明文“HELLOW”,对其加密:
在这里插入图片描述
2、再对加密后的密文进行解密:
在这里插入图片描述
3、查看本次置换表:
在这里插入图片描述