古典密码算法 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()

古典密码算法(凯撒密码,矩阵换位密码) python实现相关推荐

  1. 古典密码算法 凯撒(Caesar)密码,又叫循环移位密码

    古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密.它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密.下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密 ...

  2. 【Java代码】古典密码算法——凯撒密码(CaesarCipher)

    贴代码记录一下,也欢迎学习参考~ 一.算法背景 · 替代密码        替代密码算法的原理是使用替代法进行加密,就是对明文中的字符用其他字符替代后形成密文.例如,明文字母a, b, c, d, 用 ...

  3. 有趣的密码学介绍~古典密码之凯撒密码来咯~

    游说万乘苦不早,著鞭跨马涉远道.仰天大笑出门去,我辈岂是蓬蒿人! 文章目录 前言 正文 古典密码 一.古典密码概述介绍 1.置换密码 2.代换密码 二.古典密码分类介绍 1.置换密码 2.编辑本段代换 ...

  4. python中凯撒密码_python实现凯撒密码、凯撒加解密算法

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...

  5. 凯撒加密的python语言程序_python实现凯撒密码、凯撒加解密算法

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...

  6. python实现凯撒密码、凯撒加解密算法

    python实现凯撒密码.凯撒加解密算法 更多python视频教程请到菜鸟教程https://www.piaodoo.com/ 凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字 ...

  7. python密码学凯撒密码_凯撒密码在Python

    python密码学凯撒密码 Hello everyone, in this tutorial you'll learn about Caesar cipher in Python. If you ha ...

  8. 历史著名密码(凯撒密码、简单替换密码、Enigma)

    凯撒密码 公元前100多年凯撒发明的一种密码,简单来说是平移密码,也就是将字母位置向后移动一定位数. 如原文是ABCDEFG,密钥为3,加密后就是DEFGHIJ. 以密钥的数字向后平移了三位,如果密钥 ...

  9. 【每日一题】| (古典加密)凯撒密码(一)简单的凯撒加密

    文章目录 前言 一.凯撒加密是什么 举个例子 扩展:ROT-13(回转13位) 二.密码破解 总结 前言 今天的每日一题,由我向来大家来介绍预备知识.今天就跟大家聊一聊CTF密码学中古典加密的经典加密 ...

最新文章

  1. java retentionpolicy_Java注解之如何利用RetentionPolicy.SOURCE生存周期
  2. 简单的JS统计静态网站访问次数
  3. 8.2 matlab曲线对象和曲面对象(曲线对象、曲面对象、光照处理、图形对象的反射特性)
  4. ppct各代表什么_半导体50指数_股票大盘分时图中白线和黄线各代表什么?
  5. Web前端行业的机遇与自我规划,如果你对未来没有方向 不如看一看,或许就是一道曙光!
  6. [html] 如何禁止input输入的历史记录
  7. 诗与远方:无题(三十三)
  8. 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
  9. 开源java诊断工具,阿里开源Java 线上诊断工具 Arthas 实践
  10. 当前只读状态:是_DM数据库的启停以及数据库状态检查
  11. DHT,种子转磁力算法 种子info_hash 代码亲测
  12. 网贷魔爪再次伸向大学生,欠款账号真的能注销吗?
  13. 亚声速-超声速等熵喷管拟一维流动的CFD解法(附完整代码)
  14. C中Ascii码对照
  15. 记一次惨痛的安装教训RegisterAddon
  16. 噪声为什么是高频信号_人类是信号,但科技将我们视为噪音
  17. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)
  18. 不可不知的“电子邮件”趣味历史!
  19. x264参数介绍(帧类型和码率控制,分析和视频可用性信息)
  20. python生产者消费者 掘金_帮助中心--掘金量化Python API文档

热门文章

  1. 使用python语言实现简单的学生试卷批阅
  2. 求两个数的m和n的最大公约数和最小公倍数。
  3. vue项目启动webpack打包sass报错
  4. 好人好当,坏人难当。
  5. MobaXterm 使用 rz/sz
  6. 神奇的 SQL 之扑朔迷离 → ON 和 WHERE,好多细节
  7. linux vim的使用
  8. 思科推NCS4200家族 与Ciena竞争Verizon城域订单
  9. QT24A01单端口变压器Base-T TNK
  10. 带你轻松玩转C语言scanf和getchar