py3实现维吉尼亚加解密

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

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

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

 

Python3+pycharm

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

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

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

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

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

 

  1. 2.   算法分析

密码算法可表示如下:

设密钥 K = ( ki ; k2  kd )

明文 M = ( mi, m2  mn )

密文 C = ( ci; c2  cn ) ;

加密变换为: ci = Ek(mi) = mi + ki( 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