python实现维吉尼亚加密法

本文实例为大家分享了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()

小编再为大家分享一段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)

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

(0)

相关推荐

  • python实现Virginia无密钥解密

    本文实例为大家分享了Virginia无密钥解密的具体代码,供大家参考,具体内容如下 加密 virginia加密是一种多表替换加密方法,通过这种方法,可以有效的解决单表替换中无法应对的字母频度攻击.这种加密方法最重要的就是选取合适的密钥,一旦密钥被公开,保密性也就无从谈起.结合virginia加密原理,给出使用python实现的代码 plainText = "whenigotthethemeithoughtofgooglesartificialintelligencealphagothisprog

  • python实现维吉尼亚算法

    本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下 1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigenenre发明的.Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,于是加解密前需先将明密文按照密钥长度进行分组. 密码算法

  • python实现维吉尼亚加密法

    本文实例为大家分享了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,-..

  • JS维吉尼亚密码算法实现代码

    复制代码 代码如下: var Vigenere = { _strCpr: 'abcdefghijklmnopqrstuvwxyz_12345 67890.ABCDEFGHIJKLMNOPQRSTUVWXYZ',//可以将此字符串的顺序打乱点,或者添加更多字符 _strKey: function(strK,str){//生成密钥字符串,strK为密钥,str为明文或者密文 var lenStrK = strK.length; var lenStr = str.length; if(lenStrK

  • JavaScript实现维吉尼亚(Vigenere)密码算法实例

    传统加密技术对于当今的网络安全发挥不了大作用,但每一本讲述密码学的书的开头都会率先介绍它们,因为它们是密码学的基础,是密码学的历史.几乎每一本密码学的书在讲述Vigenere密码的章节都会有这么一个<Vigenere代换表>用户讲解Vigenere密码机制: 加密过程很简单,就是给定密钥字母x和明文字母y,密文字母是位于x行和y列的那个字母.这样就决定了加密一条消息需要与消息一样长的密钥字符串,通常,密钥字符串是密钥词的重复.以<密码编码学与网络安全--原理与实践>中的例子来作为本

  • Python多维/嵌套字典数据无限遍历的实现

    最近拾回Django学习,实例练习中遇到了对多维字典类型数据的遍历操作问题,Google查询没有相关资料-毕竟是新手,到自己动手时发现并非想象中简单,颇有两次曲折才最终实现效果,将过程记录下来希望对大家有用. 实例数据(多重嵌套): person = {"male":{"name":"Shawn"}, "female":{"name":"Betty","age":23

  • python中二维阵列的变换实例

    本文实例讲述了python中二维阵列的变换方法.分享给大家供大家参考.具体方法如下: 先看如下代码: arr = [ [1, 2, 3], [4, 5, 6], [7, 8,9], [10, 11, 12]] print map(list, zip(*arr)) print '_-------------------------------------------------' print [[r[col] for r in arr] for col in range(len(arr[0]))]

  • python多维数组切片方法

    1.数组a第0个元素(二维数组)下的所有子元素(一维数组)的第一列 import numpy as np b=np.arange(24) a=b.reshape(2,3,4) print a print a[0,:,0] 2.取所有二维数组下的每个二维数组的第0个元素(一维数组) b=np.arange(24) a=b.reshape(2,3,4) print a print '--------------------' print a[:,0] 结果: [[ 0 1 2 3] [12 13 1

  • 基于python 二维数组及画图的实例详解

    1.二维数组取值 注:不管是二维数组,还是一维数组,数组里的数据类型要一模一样,即若是数值型,全为数值型 #二维数组 import numpy as np list1=[[1.73,1.68,1.71,1.89,1.78], [54.4,59.2,63.6,88.4,68.7]] list3=[1.73,1.68,1.71,1.89,1.78] list4=[54.4,59.2,63.6,88.4,68.7] list5=np.array([1.73,1.68,1.71,1.89,1.78])

  • Python运维自动化之nginx配置文件对比操作示例

    本文实例讲述了Python运维自动化之nginx配置文件对比操作.分享给大家供大家参考,具体如下: 文件差异对比diff.py #!/usr/bin/env python # import difflib import sys try: textfile1=sys.argv[1] textfile2=sys.argv[2] except exception,e: print "Error:"+str(2) print "Usge: difflib.py file1 file2

  • Python运维之获取系统CPU信息的实现方法

    使用Python进行运维工作的时候有时候需要获取CPU的信息,这在psutil模块库的帮助下非常容易实现. 常见的CPU信息有以下几种: 1,用户时间以及百分比: 2,系统时间以及百分比: 3,空闲时间以及百分比: 4,CPU的硬件信息: 前3个中的时间可以采用cpu_times方法获取,百分比可以使用cpu_times_pcercent获得. 简单的示范如下: In [9]: importpsutil In [10]:psutil.cpu_times() Out[10]: scputimes(

随机推荐