900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 古典密码算法(凯撒密码 矩阵换位密码) python实现

古典密码算法(凯撒密码 矩阵换位密码) python实现

时间:2019-08-22 07:32:52

相关推荐

古典密码算法(凯撒密码 矩阵换位密码) python实现

古典密码算法 python实现

通过编程实现替代密码和置换密码算法,在这里通过python实现了对凯撒密码的加密与解密,以及对矩阵换位密码的加密与解密。

凯撒密码的相关算法是O(n)O(n)O(n)的时间复杂度,矩阵换位密码的加密解密算法是O(n2)O(n^2)O(n2)的时间复杂度

古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密

1、替代密码 替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形 成密文。例如,明文字母 a, b, c, d, 用 d, e, f , g 做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码,多表替代密码,多字母替代密码等。试编程 实现一种典型的单表替代密码—凯撒(Caesar)密码。它的加密方法是将明文中的每个字母 用此字符在字母表中后面的第 k 个字母替代。它的加密过程可以表示为下面的函数:

E(k)=(m+k)modnE(k)=(m+k)modnE(k)=(m+k)modn

其中,m 为明文字母在字母表中的位置数,n 为字母表中的字母个数,k 为密钥,E(k) 为密文字母在字母表中对应的位置数。 解密过程类推。

2、置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现 明文信息的加密。置换密码也叫换位密码。 试编程实现矩阵换位密码。它的加密方法是将明文中的字母按照给定的顺序安排在一个 矩阵中,然后用根据密钥提供的顺序重新组合矩阵中的字母,形成密文。

# 矩阵换位加密与解密import math# 凯撒密码加密函数def caesar_encrypt():string = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u','v', 'w', 'x', 'y', 'z']# 密文列表cipher_text_list = []cipher = int(input("请输入你的密钥:"))plain_text = input("请输入你的明文:")length = len(plain_text)print("加密后的密文是:")for i in range(0,length):cipher_text_list.append(string[string.index(plain_text[i])+cipher])print(cipher_text_list[i],end="")# 凯撒密码解密函数def caesar_decrypt():string = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u','v', 'w', 'x', 'y', 'z']# 明文列表plain_text_list = []cipher = int(input("请输入你的密钥:"))ciphertext = input("请输入你的密文:")length = len(ciphertext)print("解密后的明文是:")for i in range(0,length):plain_text_list.append(string[string.index(ciphertext[i])-cipher])print(plain_text_list[i],end="")def permutation_cipher_encrypt():cipher_list = list(input("请输入你的密钥"))plain_text_list = list(input("请输入你的明文").replace(" ",""))# 密钥ASCII码列表cipher_ord_list = []# 密钥顺序列表,储存每个字母在整个密钥中的排序cipher_sort_list = []# 密文列表,存放明文加密后的密文cipher_text_list = plain_text_list[:]# 密钥长度cipher_length = len(cipher_list)# 明文长度plain_text_length = len(plain_text_list)# 要补齐的'x'字母数目l =(cipher_length - plain_text_length % cipher_length) % cipher_length# 矩阵的行数row = math.floor(plain_text_length / cipher_length)print("明文矩阵为:",end="")# 不足补 Xfor j in range(0,l):plain_text_list.append('x')# 输出明文矩阵for i in range(0,plain_text_length):if i%cipher_length ==0:print("")print(plain_text_list[i],end="")print("\n加密后的密文矩阵为",end="")for i in range(0,cipher_length):cipher_ord_list.append(ord(cipher_list[i]))for i in range(0,cipher_length):sum = 0for j in range(0,cipher_length):if cipher_ord_list[i] < cipher_ord_list[j]:sum +=1cipher_sort_list.append(cipher_length-sum-1)# 矩阵换位加密for i in range(0,cipher_length):for k in range(0,row):cipher_text_list[k*cipher_length+i] = \plain_text_list[k*cipher_length+cipher_sort_list[i]]for i in range(0,plain_text_length):if i % cipher_length == 0:print("")print(cipher_text_list[i], end="")def permutation_cipher_decrypt():cipher_list = list(input("请输入你的密钥"))cipher_text_list = list(input("请输入你的密文").replace(" ", ""))# 密钥ASCII码列表cipher_ord_list = []# 密钥顺序列表,储存每个字母在整个密钥中的排序cipher_sort_list = []# 明文列表,存放密文解密后的明文plain_text_list = cipher_text_list[:]# 密钥长度cipher_length = len(cipher_list)# 密文长度cipher_text_length = len(cipher_text_list)# 矩阵的行数row = math.floor(cipher_text_length / cipher_length)# 输出密文矩阵print("密文矩阵为:",end="")for i in range(0, cipher_text_length):if i % cipher_length == 0:print("")print(cipher_text_list[i], end="")print("\n解密后的明文矩阵为", end="")for i in range(0, cipher_length):cipher_ord_list.append(ord(cipher_list[i]))for i in range(0, cipher_length):sum = 0for j in range(0, cipher_length):if cipher_ord_list[i] < cipher_ord_list[j]:sum += 1cipher_sort_list.append(cipher_length - sum - 1)# 矩阵换位解密for i in range(0, cipher_length):for k in range(0, row):plain_text_list[k * cipher_length + cipher_sort_list[i]] = \cipher_text_list[k * cipher_length + i]for i in range(0,cipher_text_length):if i % cipher_length == 0:print("")print(plain_text_list[i], end="")def main():print("###################################")print("| 古典密码算法 |")print("-----------------------------------")print("| 0. 退出程序 |")print("| 1. 凯撒密码加密|")print("| 2. 凯撒密码解密|")print("| 3. 换位密码加密|")print("| 4. 换位密码解密|")print("-----------------------------------")while True:choice = int(input("\n请输入数字进行选择:"))if choice == 0:breakelif choice == 1 :caesar_encrypt()elif choice == 2:caesar_decrypt()elif choice == 3:permutation_cipher_encrypt()elif choice == 4:permutation_cipher_decrypt()else:print("输入错误,请重新进行输入")if __name__ == '__main__':main()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。