Classic-crypto-system
古典密码加解密系统,置换密码+栅栏密码,python实现
置换密码
流程介绍
加密:
-
建立随机化的密文字符表(随机置换表)
-
逐个字符进行查表替代
-
输出明文、密文
解密:
-
输入密文字符表
-
逐个字符进行查表替代
-
输出密文、明文
流程图
执行结果截图
代码
import numpy as np
import string
#生成密码本和反密码本
def generate_table():
# 获取“a”到”z“的顺序字符表
pT = tuple(string.ascii_lowercase)
# 建立随机化的密文字符表
cT = []
temp = np.random.permutation(26)
for x in temp:
cT.append(pT[x])
# 建立密码本,即明文、密文对照表,这里使用了字典结构
keyTable = {}
for x, y in zip(pT, cT):
keyTable[x] = y
valueTable = {v: k for k, v in keyTable.items()}
return [keyTable,valueTable]
if __name__ == '__main__':
hasTable = False
keyTable = {}
valueTable = {}
while True:
print("*" * 30)
print('置换密码实验:1、生成随机密码本 2、加密 3、解密 4、退出:')
choose = input('请选择序号:')
if (choose == '1'):
[keyTable, valueTable] = generate_table()
hasTable = True
print('生成随机密码本成功!')
elif (choose == '2'): # encode
if hasTable == False:
print('请先生成随机密码本')
continue
plaintext = input('请输入要加密的消息(仅限英文字母): ')
result = ''
for c in plaintext:
result += keyTable[c]
print('加密结果: ' + result)
elif (choose == '3'): # decode
if hasTable == False:
print('请先生成随机密码本')
continue
ciphertext = input('请输入要解密的密文: ')
result = ''
for c in ciphertext:
result += valueTable[c]
print('解密结果: ' + result)
elif (choose == '4'):
print('退出成功')
break
else:
print('错误,请选择1、2或3中的一个!')
continue
栅栏密码
流程介绍
加密:
-
对待处理消息形成数组或列表
-
生成密文空间
-
读取 0、2、4、6…数据到密文空间的 0、1、2、3,…round(n/2)-1
-
读 取 1 、 3 、 5 、 7… 数 据 到 密 文 空 间 的 round(n/2) 、 round(n/2)+1 、round(n/2)+2…n-1
-
输出明文、密文
解密:
-
生成明文空间
-
读取密文的 0、1、2、3…round(n/2)-1 到明文空间的 0、2、4、6、…
-
读取密文的 round(n/2)、round(n/2)+1、round(n/2)+2…n-1 到明文空间的 1、 3、5、7…
-
输出密文、明文
流程图
执行结果截图
代码
if __name__ == '__main__':
while True:
print("*" * 30)
print('栅栏密码实验:1、加密 2、解密 3、退出:')
choose = input('请选择序号:')
if (choose == '1'): # encode
plaintext = input('请输入要加密的消息: ')
result = ''
n = len(plaintext)
i = 0
j = 0
while i < round(n / 2):
result += plaintext[j]
i += 1
j += 2
j = 1
while i < n:
result += plaintext[j]
i += 1
j += 2
print('加密结果: ' + result)
elif (choose == '2'): # decode
ciphertext = input('请输入要解密的密文: ')
n = len(ciphertext)
result = [None] * n
i = 0
j = 0
while i < round(n / 2):
result[j] = ciphertext[i]
i += 1
j += 2
j = 1
while i < n:
result[j] = ciphertext[i]
i += 1
j += 2
plaintext = ''
for item in result:
plaintext += item
print('解密结果: ' + plaintext)
elif (choose == '3'):
print('退出成功')
break
else:
print('错误,请选择1、2或3中的一个!')
continue