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实现的阳历转阴历(农历)算法
Apr 25 Python
python使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python 基础知识之字符串处理
Jan 06 Python
查找python项目依赖并生成requirements.txt的方法
Jul 10 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
python基础梳理(一)(推荐)
Apr 06 Python
python分割一个文本为多个文本的方法
Jul 22 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
简单了解python filter、map、reduce的区别
Jan 14 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python遍历路径破解表单的示例
Nov 21 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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
用php来限制每个ip每天浏览页面数量的实现思路
2015/02/24 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
PHP面向对象多态性实现方法简单示例
2017/09/27 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
php微信开发之图片回复功能
2018/06/14 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
javascript作用域问题实例分析
2015/07/13 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
微信小程序登录数据解密及状态维持实例详解
2019/05/06 Javascript
js实现转动骰子模型
2019/10/24 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Vue页面渲染中key的应用实例教程
2021/01/12 Vue.js
Python随机生成彩票号码的方法
2015/03/05 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python遍历pandas数据方法总结
2018/02/09 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python中正则表达式的用法总结
2019/02/22 Python
Python bytes string相互转换过程解析
2020/03/05 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
EJB发布WEB服务一般步骤
2012/10/31 面试题
购房协议书
2014/04/11 职场文书
暑期社会实践心得体会
2014/09/02 职场文书