python playfair
#########################Playfair密码#########################
#约定1:若明文字母数量为奇数,在明文末尾添加一个'Z'
#约定2:'I'作为'J'来处理
#字母表
letter_list='ABCDEFGHJKLMNOPQRSTUVWXYZ'
#密码表
T_letter=['','','','','']
#根据密钥建立密码表
def Create_Matrix(key):
key=Remove_Duplicates(key) #移除密钥中的重复字母
key=key.replace(' ','') #去除密钥中的空格
for ch in letter_list: #根据密钥获取新组合的字母表
if ch not in key:
key+=ch
j=0
for i in range(len(key)): #将新的字母表里的字母逐个填入密码表中,组成5*5的矩阵
T_letter[j]+=key[i] #j用来定位字母表的行
if 0==(i+1)%5:
j+=1
#移除字符串中重复的字母
def Remove_Duplicates(key):
key=key.upper() #转成大写字母组成的字符串
_key=''
for ch in key:
if ch=='I':
ch='J'
if ch in _key:
continue
else:
_key+=ch
return _key
#获取字符在密码表中的位置
def Get_MatrixIndex(ch):
for i in range(len(T_letter)):
for j in range(len(T_letter)):
if ch==T_letter[i][j]:
return i,j #i为行,j为列
#加密
def Encrypt(plaintext,T_letter):
ciphertext=''
if len(plaintext) % 2 !=0: #如果新的明文长度为奇数,在其末尾添上'Z'
plaintext+='Z'
i=0
while i<len(plaintext): #对明文进行遍历
if True==plaintext[i].isalpha(): #如果是明文是字母的话,
j=i+1 #则开始对该字母之后的明文进行遍历,
while j<len(plaintext): #直到遍历到字母,进行加密
if True==plaintext[j].isalpha():
if 'I'==plaintext[i].upper(): #
x=Get_MatrixIndex('J') #
else: #
x=Get_MatrixIndex(plaintext[i].upper()) #对字符在密码表中的坐标
if 'I'==plaintext[j].upper(): #进行定位,同时将'I'作为
y=Get_MatrixIndex('J') #'J'来处理
else: #
y=Get_MatrixIndex(plaintext[j].upper()) #
if x[0]==y[0]: #如果在同一行
ciphertext+=T_letter[x[0]][(x[1]+1)%5]+T_letter[y[0]][(y[1]+1)%5]
elif x[1]==y[1]: #如果在同一列
ciphertext+=T_letter[(x[1]+1)%5][x[0]]+T_letter[(y[1]+1)%5][y[0]]
else: #如果不同行不同列
ciphertext+=T_letter[x[0]][y[1]]+T_letter[y[0]][x[1]]
break; #每组明文对加密完成后,结束本次对明文的遍历
j+=1
i=j+1 #每次对明文的遍历是从加密过后的明文的后一个明文开始的,结束本次循环
continue
else:
ciphertext+=plaintext[i] #如果明文不是字母,直接加到密文上
i+=1
return ciphertext
#解密
def Decrypt(ciphertext,T_letter):
plaintext=''
if len(ciphertext) % 2 !=0: #如果新的密文长度为奇数,在其末尾添上'Z'
ciphertext+='Z'
i=0
while i<len(ciphertext): #对密文进行遍历
if True==ciphertext[i].isalpha(): #如果是密文是字母的话,
j=i+1 #则开始对该字母之后的密文进行遍历,
while j<len(ciphertext): #直到遍历到字母,进行解密
if True==ciphertext[j].isalpha():
if 'I'==ciphertext[i].upper(): #
x=Get_MatrixIndex('J') #
else: #
x=Get_MatrixIndex(ciphertext[i].upper()) #对字符在密码表中的坐标
if 'I'==ciphertext[j].upper(): #进行定位,同时将'I'作为
y=Get_MatrixIndex('J') #'J'来处理
else: #
y=Get_MatrixIndex(ciphertext[j].upper()) #
if x[0]==y[0]: #如果在同一行
plaintext+=T_letter[x[0]][(x[1]-1)%5]+T_letter[y[0]][(y[1]-1)%5]
elif x[1]==y[1]: #如果在同一列
plaintext+=T_letter[(x[1]-1)%5][x[0]]+T_letter[(y[1]-1)%5][y[0]]
else: #如果不同行不同列
plaintext+=T_letter[x[0]][y[1]]+T_letter[y[0]][x[1]]
break; #每组密文对解密完成后,结束本次对密文的遍历
j+=1
i=j+1 #每次对密文的遍历是从解密过后的密文的后一个密文开始的,结束本次循环
continue
else:
plaintext+=ciphertext[i] #如果密文不是字母,直接加到明文上
i+=1
return plaintext
#主函数
if __name__=='__main__':
print("加密请按D,解密请按E:")
user_input=input();
while(user_input!='D' and user_input!='E'):#输入合法性检测
print("输入有误!请重新输入:")
user_input=input()
print('请输入密钥,密钥由英文字母组成:')
key=input()
Create_Matrix(key) #建立密码表
if user_input=='D': #加密
print('请输入明文:')
plaintext=input()
print("密文为:\n%s" % Encrypt(plaintext,T_letter))
else: #解密
print('请输入密文:')
ciphertext=input()
print('明文为:\n%s' % Decrypt(ciphertext,T_letter))
python playfair的更多相关文章
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- Playfair加密
前面讲的不管是单码加密还是多码加密都属于单图加密,什么是单图加密和多图加密呢,简单来说单图加密就是一个字母加密一个字母,而多图加密就是一个字符组加密一个字符组.比如双图加密就是两个字母加密两个字母,这 ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
随机推荐
- CentOS安装Erlang
1.首先要安装编译源码用的编译器gcc&g++,安装方式很简单,先用yum search gcc搜索出包,然后选择适合自己的版本复制全名,用yum intall gcc_XXX来进行安装即可. ...
- IOS6学习笔记(一)
一.ARC 1.ARC环境下可以使用-(void)dealloc{};处理一些事情(比如移除KVO观察),但不要调用[super dealloc]; 2.ARC与非ARC混编要注意符合Cocoa命名约 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- 2015年第8本(英文第7本):the city of ember 微光城市
书名:the City of Ember(中文名:微光城市) 作者:Jeanne DuPrau 单词数:6.2万 不重复单词数:未知 首万词不重复单词数:未知 蓝思值:未知 阅读时间:2015年4月2 ...
- 浅谈RSA加密算法
一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥 公钥:可以对外给任何人的加密和解密的密码,是公开的 私钥:通过私钥可以生成公钥,但从 ...
- IOS开发中如何实现自动检测更新APP
自动检测更新实现逻辑: 先上github地址:https://github.com/wolfhous/HSUpdateApp 1,获取当前项目APP版本号 2,拿到AppStore项目版本号 3,对比 ...
- 谷歌的网页排序算法(PageRank Algorithm)
本文将介绍谷歌的网页排序算法(PageRank Algorithm),以及它如何从250亿份网页中捞到与你的搜索条件匹配的结果.它的匹配效果如此之好,以至于“谷歌”(google)今天已经成为一个被广 ...
- Struts2(十一)OGNL标签三与Struts2标签
一.UI标签 二.简单例子 <h1>添加信息</h1> <!--通过指定theme的属性改变主题 --> <s:form action="" ...
- Windows下HG服务器的搭建
1.环境和所需工具安装 1. 安装python-2.7.9.exe 2. 安装mercurial-3.2.3.win32-py2.7.exe 3. 安装mercurial-3.2.3-x86.msi ...
- angularjs flask跨域问题 XMLHttpRequest cannot load. No 'Access-Control-Allow-Origin'
场景,我要来我的server(A)上用api来访问另一个server(B)的问题,如果直接在A上调用B的api,那么就会出现XMLHttpRequest cannot load. No 'Access ...