python实现维吉尼亚加密法


Posted in Python onMarch 20, 2019

本文实例为大家分享了python实现维吉尼亚加密法的具体代码,供大家参考,具体内容如下

Vigenere加密/解密时,把英文字母映射为0-25的数字再进行运算,并按n个字母为一组进行变换.算法定义如下:
设密钥 k =(k1,k2,k3…,kn),明文 m = (m1,m2,….mn),则加密算法为:
Ek(m) = (c1,c2,…cn)
其中:c1 = (mi+ki)(mod 26),i=1,2,3…..n
解密算法为:
mi = (ci - ki)(mod 26), i = 1,2,…..n。

import string,os

def   vigenereEncrypt(msg,key):
    size = len(key)
    result = []
    cnt = 0
    for i in msg:
      if i.upper() in string.uppercase:
        #offset相当于是 ki
        offset = string.uppercase.find(key[cnt%size])
        t = string.uppercase[(string.uppercase.find(i.upper())+offset)%26] #这里相当于是c1 = (mi+ki)(mod 26) ,t = c1
        if i.isupper():
          result.append(t)
        else:
          result.append(t.lower())
        cnt+=1
      else:
        result.append(i)
    return "".join(result)
def   main():

    msg = "Common sense is not so common"
    cipher = vigenereEncrypt(msg,"PIZZA")#key = "PIZZA:

    print cipher
if   __name__=="__main__":
    main()

python实现维吉尼亚加密法

小编再为大家分享一段Vigenere密码Python实现代码:

##########Vigenere密码############
 
letter_list='ABCDEFGHIJKLMNOPQRSTUVWXYZ' #字母表
 
#根据输入的key生成key列表
def Get_KeyList(key):
 key_list=[]
 for ch in key:
  key_list.append(ord(ch.upper())-65)
 return key_list
 
#加密函数
def Encrypt(plaintext,key_list):
 ciphertext=""
 
 i=0
 for ch in plaintext: #遍历明文
  if 0==i%len(key_list):
   i=0
  if ch.isalpha(): #明文是否为字母,如果是,则判断大小写,分别进行加密
   if ch.isupper(): 
    ciphertext+=letter_list[(ord(ch)-65+key_list[i]) % 26]
    i+=1
   else:
    ciphertext+=letter_list[(ord(ch)-97+key_list[i]) % 26].lower()
    i+=1
  else: #如果密文不为字母,直接添加到密文字符串里
   ciphertext+=ch
 return ciphertext
 
#解密函数
def Decrypt(ciphertext,key):
 plaintext=""
 
 i=0
 for ch in ciphertext: #遍历密文
  if 0==i%len(key_list):
   i=0
  if ch.isalpha(): #密文为否为字母,如果是,则判断大小写,分别进行解密
   if ch.isupper():
    plaintext+=letter_list[(ord(ch)-65-key_list[i]) % 26]
    i+=1
   else:
    plaintext+=letter_list[(ord(ch)-97-key_list[i]) % 26].lower()
    i+=1
  else: #如果密文不为字母,直接添加到明文字符串里
   plaintext+=ch
 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()
 while(False==key.isalpha()):#输入合法性判断
  print("输入有误!密钥为字母,请重新输入:")
  key=input()
 
 key_list=Get_KeyList(key)
 
 if user_input=='D':
  #加密
  print("请输入明文:")
  plaintext=input()
  ciphertext=Encrypt(plaintext,key_list)
  print("密文为:\n%s" % ciphertext)
 else:
  #解密
  print("请输入密文:")
  ciphertext=input()
  plaintext=Decrypt(ciphertext,key_list)
  print("明文为:\n%s" % plaintext)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
python使用fileinput模块实现逐行读取文件的方法
Apr 29 Python
深入理解 Python 中的多线程 新手必看
Nov 20 Python
Python中字符串的修改及传参详解
Nov 30 Python
Python中类型检查的详细介绍
Feb 13 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
浅谈numpy库的常用基本操作方法
Jan 09 Python
python视频按帧截取图片工具
Jul 23 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 #Python
python实现对输入的密文加密
Mar 20 #Python
python实现字符串加密成纯数字
Mar 19 #Python
python实现简单加密解密机制
Mar 19 #Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 #Python
python异步存储数据详解
Mar 19 #Python
利用Python半自动化生成Nessus报告的方法
Mar 19 #Python
You might like
php jq jquery getJSON跨域提交数据完整版
2013/09/13 PHP
php统计数组元素个数的方法
2015/07/02 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
2015/11/18 PHP
CI框架数据库查询缓存优化的方法
2016/11/21 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
vue中使用axios post上传头像/图片并实时显示到页面的方法
2018/09/27 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
用Python创建声明性迷你语言的教程
2015/04/13 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
为娇小女性量身打造:Petite Studio
2018/11/01 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
化工专业求职信
2014/07/01 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
村班子对照检查材料
2014/08/18 职场文书
承诺函格式模板
2015/01/21 职场文书
初中化学教学反思
2016/02/22 职场文书
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS
世界无敌的ICOM IC-R9500宽频接收机
2022/03/25 无线电