zoukankan      html  css  js  c++  java
  • 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("不存在该口令")

  • 相关阅读:
    php 投票系统
    PHP 单例模式和工厂模式
    php面向对象的三大特性——封装、继承、多态
    springmvc web.xml配置之 -- SpringMVC IOC容器初始化
    springmvc web.xml配置之 -- ContextLoaderListener
    非root用户使用1024以下端口
    nginx部署(普通用户)
    观察者模式之--事件监听模式
    设计模式之--观察者模式
    cglib动态代理
  • 原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10045659.html
Copyright © 2011-2022 走看看