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 相关文章推荐
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
python集合类型用法分析
Apr 08 Python
Windows下python2.7.8安装图文教程
May 26 Python
利用信号如何监控Django模型对象字段值的变化详解
Nov 27 Python
Python线性回归实战分析
Feb 01 Python
python 按照固定长度分割字符串的方法小结
Apr 30 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
python文字转语音的实例代码分析
Nov 12 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 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整合PayPal支付
2015/06/11 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
jQuery实现区域打印功能代码详解
2016/06/17 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
详解百度百科目录导航树小插件
2017/01/08 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
详解Typescript里的This的使用方法
2021/01/08 Javascript
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
Python中遍历字典过程中更改元素导致异常的解决方法
2016/05/12 Python
如何利用python进行时间序列分析
2020/08/04 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
英国网上购买门:Direct Doors
2018/06/07 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
介绍一下JNDI的基本概念
2013/07/26 面试题
入党申请自荐书范文
2014/02/11 职场文书
岗位廉洁从政承诺书
2014/03/27 职场文书
结婚保证书范文
2014/04/29 职场文书
社区服务活动总结
2014/05/07 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
go语言使用Casbin实现角色的权限控制
2021/06/26 Golang
React列表栏及购物车组件使用详解
2021/06/28 Javascript
Python字典的基础操作
2021/11/01 Python
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA