py3实现维吉尼亚加解密



1、  熟悉和掌握替代加密算法的原理及其一般过程;

2、掌握对称加密算法的基本方法:维吉尼亚密码

3、掌握使用一定的编码开发工具(对具体的开发平台和工具不作要求)。



 

Python3+pycharm


  1. 1.   维吉尼亚原理分析

Vigenenre 密码使用一个词组作为密钥,密钥中每一个字母用来确定一个代换表,

每一个密钥字母被用来加密一个明文字母,第一个密钥字母加密第一个明文字母,

第二个密钥字母加密第二个明文字母,等所有密钥字母使用完后,密钥再次循环使用,

于是加解密前需先将明密文按照密钥长度进行分组。

 

  1. 2.   算法分析

密码算法可表示如下:

设密钥 K = ( kl ; kZ kd )

明文 M = ( ml , mZ mn )

密文 C = ( cl ; cZ cn ) ;

加密变换为: ci = Ek(mi) = mi + k( mod 26 )

解密变换为: mi = Dk( ci ) = ci- ki ( mod 26 )

 


  1. 运行结果(程序清单见附录)

(1)    解密TSOGF MMEIS ZIDJH VVCBH ACLIE FQID

加密密钥key:COMPLETE

Recruit agents for ortopspy Secrets(招募奥拓间谍秘密的特工)

解密QWTBA RALXI JHKVB OR

加密密钥key:ESPIONAGE

(2)加密MEET ME AFTER SCHOOL 。单词“ESPIONAGE”做为密钥



 

 

先构思好算法和加解密原理,再进行代码的实现

附录

# -*- coding: utf-8 -*-

"""

Created on Nov 27 08:17:01 2018 at D704

@author: Kevil

"""

from string import ascii_lowercase as lowercase

# 加密

def VigenereEncrypto(p, key):

p = get_trim_text(p)

ptLen = len(p)

keyLen = len(key)

quotient = ptLen // keyLen  #

remainder = ptLen % keyLen  #

out = ""

for i in range(0, quotient):

for j in range(0, keyLen):

c = int((ord(p[i * keyLen +
j]) - ord(‘a‘) + ord(key[j]) - ord(‘a‘)) % 26 + ord(‘a‘))

# global output

out += chr(c)

for i in range(0, remainder):

c = int((ord(p[quotient *
keyLen + i]) - ord(‘a‘) + ord(key[i]) - ord(‘a‘)) % 26 + ord(‘a‘))

# global output

out += chr(c)

return out

# 解密

def VigenereDecrypto(output, key):

ptLen = len(output)

keyLen = len(key)

quotient = ptLen // keyLen

remainder = ptLen % keyLen

inp = ""

for i in range(0, quotient):

for j in range(0, keyLen):

c = int((ord(output[i *
keyLen + j]) - ord(‘a‘) - (ord(key[j]) - ord(‘a‘))) % 26 + ord(‘a‘))

# global input

inp += chr(c)

for i in range(0, remainder):

c = int((ord(output[quotient
* keyLen + i]) - ord(‘a‘) - (ord(key[i]) - ord(‘a‘))) % 26 + ord(‘a‘))

# global input

inp += chr(c)

return inp

def get_trim_text(text):

text = text.lower()

trim_text = ‘‘

for l in text:

if lowercase.find(l) >= 0:

trim_text += l

return trim_text

if __name__ == ‘__main__‘:

prompt = """

(1)加密

(2)解密        #解密时请勿输入空格键

(3)退出

请输入您要执行的口令: """

while (True):

choice = input(prompt)

if choice == ‘1‘:

p = input("请输入明文: ")

k = input("请输入密钥: ")

print("加密后的密文是: %s" % (VigenereEncrypto(p, k)))

elif choice == ‘2‘:

c = input("请输入密文: ")

k = input("请输入密钥: ")

print("解密后的明文是: %s" % (VigenereDecrypto(c, k)))

elif choice == ‘3‘:

break

else:

print("不存在该口令")

原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10045659.html

时间: 2024-11-13 04:29:24

py3实现维吉尼亚加解密的相关文章

Vigenère Cipher 维吉尼亚加解密算法

维吉尼亚的加解密有两种方法. 第一种是查表:第一行为明文,第一列为密钥,剩余的为对应的密文 第二种方法是转化计算法:逐个将字符转化为从零开始的数字,对数字进行加密/解密后,再转化为字符. 本文要用c++实现第二种方法,并且为了操作方便,使用了MFC框架(附工程下载) 核心代码如下: //cipher.h 额外添加的文件,用来放置相关算法,此文件独立于MFC外,可直接移植到支持CString的项目中 int* CStringToInt(CString str){ //将CString转换为zero

python编写的维吉尼亚密码加解密程序

维吉尼亚密码表 ============================================= #维吉尼亚密码  加密 key='helloworld' plaintext='whereisthekey' #key='relations' #plaintext='tobeornottobeth' ascii='abcdefghijklmnopqrstuvwxyz' keylen=len(key) ptlen=len(plaintext) ciphertext = '' i = 0 w

维吉尼亚密码的Python实现

代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间.C为密文空间.K为密钥空间.Z26为26个整数(对应26个英文字母)组成的空间:要求26个字母与模26的剩余类集合{0,1,2,-,25}建立一一对应的关系. 1.移位密码 移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为: c=Ek(m)=m+k(mod 26) m=Dk(c)=c-k(mod 26) 其中,m.c.k是满足0≤m,c,k≤25的整数. 2.维吉尼亚密码 Vigenenre密码是最著名的

python实现维吉尼亚解密

# -*-coding:UTF-8-*- from sys import stdout miwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUD DKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLV

维吉尼亚密码加密、解密算法(破解还不会);

#include <iostream> #include<cstdio> using namespace std; void init_pass_table(char (&code_table)[27][27]){//制密码对照表;(不能当做一维数组来看会有别的问题) code_table[0][0]='0'; for(int i=0;i<26;i++){ code_table[0][1+i]='a'+i; } for(int i=0;i<26;i++){ co

在线加解密工具

推荐一个在线加解密的网站:http://tool.bugku.com/ 支持以下功能: 代码着色 凯撒栅栏维吉尼亚等密码 摩斯密码在线加解密 Brainfuck和Ook加解密 在线密码攻击器 XSS平台 JSFuck在线加解密工具 HTTPHeader信息检测 个人JS加解密 CSS压缩/格式化 Javascript工具 Javascript加密/解密 html代码在线调试 HTML/JS转换工具 base64加密 脚本密钥加密 散列/哈希加密解密 MD5网页加密 XXTEA网页加密 字串符脚本

栅栏加解密python实现(支持密钥加密)

栅栏加解密是对较短字符串的一种处理方式.给定行数Row,依据字符串长度计算出列数Column,构成一个方阵. 加密过程:就是按列依次从上到下对明文进行排列,然后依照密钥对各行进行打乱.最后以行顺序从左至右进行合并形成密文. 解密过程:将上述过程进行逆推,对每一行依据密钥的顺序回复到原始的方阵的顺序,并从密文回复原始的方阵,最后按列的顺序从上到下从左至右解密. 详细实现例如以下:全部实现封装到一个类RailFence中,初始化时能够指定列数和密钥,默认列数为2,无密钥.初始化函数例如以下: def

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

超强php加解密扩展:cryptopp

cryptopp是一个用c++编写的超强加解密扩展.性能优异可靠.完全可以替换所有PHP编写的加解密类.不仅如此,它的提供的编程接口非常简明易用,可说是PHP程序员必备扩展. cryptopp扩展的接口如下: class cryptopp { public function __construct($param); public function setkey($param); public function encode($param); public function decode($par