Python实现单表替代密码(凯撒)密码和矩阵换位密码
1、替代密码
替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形成密文。例如,明文字母 a, b, c, d, 用 d, e, f , g 做对应替换后形成密文。
2、置换密码
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码也叫换位密码。
具体实现代码如下:
import math
class Ciper:
"""
凯撒密码和矩阵换位密码
by xk
"""
def caesar_coder(self):
"""
凯撒密码加密函数
"""
self.plaintext = input("请输入明文:")
self.key = int(input("请输入密钥:"))
self.ciphertext = ''
# ord()和chr()函数分别用来将字符转换为ASCII码和将ASCII码转为字符
for alp in self.plaintext:
if ord(alp) + self.key > ord('z'):
self.ciphertext = self.ciphertext + chr(ord('a') - 1 + (ord(alp) + self.key) % ord('z'))
else:
self.ciphertext = self.ciphertext + chr(ord(alp) + self.key)
print("凯撒密码密文为:",self.ciphertext)
return 0
def caesar_decoder(self):
"""
凯撒密码解密函数
"""
self.plaintext = ''
self.ciphertext = input("请输入密文:")
self.key = int(input("请输入密钥:"))
for alp in self.ciphertext:
if ord(alp) - self.key < ord('a'):
self.plaintext = self.plaintext + chr(ord('z') + 1 - (self.key - (ord(alp)-ord('a'))))
else:
self.plaintext = self.plaintext + chr(ord(alp) - self.key)
#roeuha
print("解码明文为:",self.plaintext)
return 0
def matrix_coder(self):
"""
矩阵置换密码加密函数
"""
self.plaintext = list(input("请输入你的明文:").replace(" ", ""))
self.key = list(input("请输入你的密钥(字母不能重复):").replace(" ", ""))
# 计算层数
hang = math.ceil(len(self.plaintext)/len(self.key))
#密钥的长度
key_length = len(self.key)
#需要补充的长度
tianchong = (len(self.key) - len(self.plaintext) % len(self.key)) % len(self.key)
for i in range(tianchong):
self.plaintext.append('a')
plain_list = [] #明文数组(填充a)
print("明文矩阵如下:")
for i in range(hang):
start_i = i*key_length
stop_i = i*key_length + key_length
plain_list.append(self.plaintext[start_i:stop_i])
print(self.plaintext[start_i:stop_i])
key_list = sorted(self.key)
cipher_list = [[0 for i in range(key_length)] for j in range(hang)]
#加密处理
for i in range(hang):
for j,key_value in enumerate(self.key):
cipher_list[i][j] = plain_list[i][key_list.index(key_value)]
print("加密矩阵为:")
for i in range(hang):
print(cipher_list[i])
return 0
def matrix_decoder(self):
"""
矩阵置换密码解密函数
"""
self.ciphertext = list(input("请输入你的密文:").replace(" ", ""))
self.key = list(input("请输入你的密钥(字母不能重复):").replace(" ", ""))
#计算层数
hang = math.ceil(len(self.ciphertext) / len(self.key))
#密钥排序
key_list = sorted(self.key)
# 密钥的长度
key_length = len(self.key)
plain_list = [[0 for i in range(len(self.key))] for j in range(hang)]
cipher_list = []
print("密文矩阵为:")
for i in range(hang):
start_i = i*key_length
stop_i = i*key_length + key_length
cipher_list.append(self.ciphertext[start_i:stop_i])
print(self.ciphertext[start_i:stop_i])
#解密处理
for i in range(hang):
for j, key_value in enumerate(key_list):
plain_list[i][j] = cipher_list[i][self.key.index(key_value)]
print("明文矩阵为:")
for i in range(hang):
print(plain_list[i])
return 0
if __name__ == '__main__':
caesar = Ciper()
matrix = Ciper()
print("凯撒密码加密和解密:")
print("执行加密")
caesar.caesar_coder()
print("执行解密")
caesar.caesar_decoder()
print("矩阵置换密码加密和解密:")
print("执行加密")
matrix.matrix_coder()
print("执行解密")
matrix.matrix_decoder()
运行结果如下所示:
希望能帮到你!