python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)
各位白嫖…漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础。总所周知,密码学学的好,头发掉的少。。。
直接进入正题,今天我就主要讲三个密码,而且都是古典密码,而且都比较简单:
他们是:凯撒密码,Play fair密码,维吉尼亚密码
不多说,先来凯撒:
咱先来加密:
C=[chr((ord(x.lower())-ord('a')+3)%26+ord('a')) for x in m if x.lower() in "abcdefghijklmnopqrstuvwxyz"]
???结束了??这可能是个意外,咱再来看看解密:
m=[chr((ord(x.lower())-ord('a')-3)%26+ord('a')) for x in C if x.lower() in "abcdefghijklmnopqrstuvwxyz"]
???兄弟呀,这就没意思了,男人不能这么快的!!!
(我觉得你在开车,但是我没有证据)
凯撒密码属于移位密码,移位的操作就是很简单的加三,所以,快是很正常的,毕竟对吧
凯撒密码这种垃圾东西,我都不在乎,垃圾东西。
别别别,大帝,我不是这个意思!
介绍完凯撒大帝,哦不,密码,咱们来看一下Playfair密码:
首先,我们要介绍一些前提:
print(“playfair 密码是一种古典多表代换密码”)
print(“指定字符,z”)
print(“预处理,1.Key变成矩阵”)
print(“5*5矩阵,i,j看作一个字符,字母只出现一次,密钥去重,按原有顺序排列,字母表掏空密钥字符,按原有加入排列”)
print(“明文两两结合,分开成为数组,以待加密”)
print(“加密规则:”)
print(“1.p1,p2同行,密文为其右边字符,每行首尾视作相连”)
print(“2.p1,p2同列,密文为其下边字符,每列首尾视作相连”)
print(“3.p1,p2相同,不做改变”)
print(“4.明文长度为奇数,加z变为偶数”)
print(“5.p1,p2不同行,列,p1,p2为顶点矩形字母,同行互换”)
class pfcode:def __init__(self):print("playfair 密码是一种古典多表代换密码")print("指定字符,z")def CreateKey(self,key):arr=''for i in key:if i=='j':i='i'if i not in arr:arr+=iarr_a=[x for x in 'abcdefghiklmnopqrstuvwxyz']for i in arr:if i in arr_a:arr_a.remove(i)key_str=arr+''.join(arr_a)self.keys={key_str[x]:((int)(x/5),x%5) for x in range(0,len(key_str))}#print(self.keys)def CreateMw(self,M):if len(M)%2!=0:M+='z'return [M[i:i+2] for i in range(0,len(M),2)]def Trans(self,x):def get(value):for i in self.keys.keys():if self.keys[i]==value:return ip1=self.keys[x[0]]p2=self.keys[x[1]]if x[0]==x[1]:return x[0]+x[1]if p1[0]==p2[0]:return get((p1[0],(p1[1]+1)%5))+get((p2[0],(p2[1]+1)%5))elif p1[1]==p2[1]:return get(((p1[0]+1)%5,p1[1]))+get(((p2[0]+1)%5,p2[1]))else:return get((p1[0],p2[1]))+get((p2[0],p1[1]))def Rtrans(self,x):def get(value):for i in self.keys.keys():if self.keys[i]==value:return ip1=self.keys[x[0]]p2=self.keys[x[1]]if x[0]==x[1]:return x[0]+x[1]if p1[0]==p2[0]:return get((p1[0],(p1[1]-1)%5))+get((p2[0],(p2[1]-1)%5))elif p1[1]==p2[1]:return get(((p1[0]-1)%5,p1[1]))+get(((p2[0]-1)%5,p2[1]))else:return get((p1[0],p2[1]))+get((p2[0],p1[1])) def Encode(self,M,Key):M=[x.lower() for x in M if x.lower() in "abcdefghiklmnopqrstuvwxyz"]Key=[x.lower() for x in Key if x.lower() in "abcdefghiklmnopqrstuvwxyz"]self.CreateKey(Key)mw=self.CreateMw(M)C=[self.Trans(x) for x in mw]return ''.join(C)def Decode(self,C,Key):C=[x.lower() for x in C if x.lower() in "abcdefghiklmnopqrstuvwxyz"]Key=[x.lower() for x in Key if x.lower() in "abcdefghiklmnopqrstuvwxyz"]self.CreateKey(Key)c=self.CreateMw(C)mw=[self.Rtrans(x) for x in c]return ''.join(mw)def Show(self):print("预处理,1.Key变成矩阵")print("5*5矩阵,i,j看作一个字符,字母只出现一次,密钥去重,按原有顺序排列,字母表掏空密钥字符,按原有加入排列")print("明文两两结合,分开成为数组,以待加密")print("加密规则:")print("1.p1,p2同行,密文为其右边字符,每行首尾视作相连")print("2.p1,p2同列,密文为其下边字符,每列首尾视作相连")print("3.p1,p2相同,不做改变")print("4.明文长度为奇数,加z变为偶数")print("5.p1,p2不同行,列,p1,p2为顶点矩形字母,同行互换")
我自认为这算是比较精简的了,(狗头保命)
解释一下,我的矩阵是个什么样子的:
‘字符’:(i,j) 这就是我的矩阵元素,位置有了,字符有了,还方便查询取出,不愧是我,我真聪明。
关于维多利亚这一款密码,我是很懂。。。的。。。
咳咳,顿时社会主义新青年的热血涌上心头,毛主席的教导,辅导员的关爱,老父老母的热泪盈眶的画面顿时在脑海中闪现,吓得我赶紧关掉电脑,回家打了把LOL(王者)、喝了口茶,跑了五千米,然后再次打开电脑,搜索:
老爸缓缓拿起来手中的狼牙棒,老妈也缓缓举起手中的菜刀,爸欸,爸,听我解释,。。。。
#author:dager
#time:2020/9/10
#description:维吉尼亚密码class vjnycode:def __init__(self):print("维吉尼亚密码,这是一种古典密码!!!")def Encode(self,m,key):m=''.join([x.lower() for x in m if x.lower() in "abcdefghijklmnopqrstuvwxyz"])key=''.join([x.lower() for x in key if x.lower() in "abcdefghijklmnopqrstuvwxyz"])m_len,k_len=len(m),len(key)if m_len<k_len:print("兄嘚,你是不是密码密钥弄反了?")else:keys=key*(int)(m_len/k_len)+key[0:(m_len%k_len)]C=[chr((ord(m[x])-2*ord('a')+ord(keys[x]))%26+ord('a')) for x in range(0,len(m))]return ''.join(C)def Decode(self,C,key):C=''.join([x.lower() for x in C if x.lower() in "abcdefghijklmnopqrstuvwxyz"])key=''.join([x.lower() for x in key if x.lower() in "abcdefghijklmnopqrstuvwxyz"])c_len,k_len=len(C),len(key)if c_len<k_len:print("兄嘚,你是不是密码密钥弄反了?")else:keys=key*(int)(c_len/k_len)+key[0:(c_len%k_len)]m=[chr((ord(C[x])-ord('a')-(ord(keys[x])-ord('a')))%26+ord('a')) for x in range(0,len(C))]return ''.join(m)def Show(self):print("维吉尼亚密码,核心加密方法,(mi+ki)%26 =>Ci")
果然,我还是最棒的!!!老爸看完我的代码,欣慰的放下了手中断掉的狼牙棒,老妈也卖掉了手中卷刃的菜刀。又是一个和谐的一天!!!
这些都属于比较基础的古典密码,所以就把代码发一下,咱才不是混子呢!!哼。
最后,给大家介绍一下莫斯密码:请听好:
荣耀下播,起飞!!!!
python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)相关推荐
- 维吉尼亚密码 php,python小脚本之维吉尼亚密码
维吉尼亚作为古典密码,本身的加解密并不是很难,因此也就有了这篇文章~ 下面初步解释下维吉尼亚密码的加密原理,假设现在有明文'a',加密密钥为'b',然后我们参照上面的维吉尼亚密码表进行加密,在a行的b ...
- 古典密码之“维吉尼亚密码”
简述 维吉尼亚密码是在代换密码(即单表代换)基础上,衍生出来的多表代换密码. 与单表代换相同,维吉尼亚密码也采用明文字母与密钥字母(即26字母表)间建立一一对应关系. 但是不同的是,单表代换密码中一旦 ...
- 维吉尼亚密码详解及C语言实现
维吉尼亚密码详解及C语言实现 文章目录 维吉尼亚密码详解及C语言实现 0x01 维吉尼亚密码 0x02 维吉尼亚密码原理 0x03 维吉尼亚密码CTF题目 0x04 C语言实现 图片地址:https: ...
- 几分钟学会密码学(一)——维吉尼亚密码
1.维吉尼亚密码加密原理: 26个英文字母(a-z)对应26个个自然数(0-25),也就是a对应0,b对应1,c对应2,以此类推. 2.维吉尼亚密码加密方法: 假设明文信息是abcd,密码是ab,那么 ...
- 实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...
题目: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码"BLOCKCIPHERDESIGNPRINCIPLE", 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过 ...
- Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密
文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...
- 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)
古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...
- 古典密码之维吉尼亚密码实验
学习目标: 维吉尼亚密码是古典密码中非常具有代表的例子.本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理. 预备知识: 人们在单一恺撒密码的基 ...
- python 维吉尼亚密码加密和解密
最近在学密码学,作业里面的加密解密看得脑壳疼,刚好寒假自学了一些python,第一反应就是用python帮我加解密. 菜菜的我写了好久,刚写完,然后同学告诉我维吉尼亚密码有专门的加密解密的库,我一下就 ...
最新文章
- php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)
- 基于Dijkstra算法的武汉地铁路径规划!
- 一文看懂BATH新基建:5G是基础,AI是内核
- Synchronize对象改变
- Angular routerLink指令的href属性生成逻辑
- python基础之内置异常对象
- C#调用SQL Server参数过程传参
- 如何创造具有竞争性的新品类?
- PAT乙:1009 说反话
- android 模仿uc标签页,android模仿UC首页天气效果
- er图用什么软件_太牛逼!一款软件几乎可以操作所有的数据库!
- window上安装fasttext
- springboot毕设项目作业查重系统i667s(java+VUE+Mybatis+Maven+Mysql)
- arctan查表法_DSP正弦波——查表法原理
- matlab设计理想高斯巴特沃斯低通滤波器_方程推导:二阶有源带通滤波器设计!(下载:教程+原理图+视频+代码)...
- 触摸式计算机屏幕,触控屏笔记本好不好 触摸屏笔记本优缺点分析【详细介绍】...
- 三轴加速度计计算俯仰角、横滚角、偏航角
- 微信小程序把阿里icon变为组件
- 解决pytorch官网下载慢ubuntu16.04+anaconda3(python3.6)+pytorch0.4.1+cuda9.0+cudnn7.1安装指南
- 51单片机检测温湿度并且上传到阿里云