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("不存在该口令")

  • 相关阅读:
    Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
    关于Delphi中的字符串的浅析(瓢虫大作,里面有内存错误的举例)
    String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
    了解JVM加载实例化类的原理
    轻量级 Material Design 前端框架 MDUI (纯html,css,与css框架跟react vue不冲突)
    只学一点点:我的技术学习策略(虽然不赞同,但可以参考一下,针对不常用的技术可以这样,同时可以:寻找遁去的一,不用管别人怎么想;有学习的时间,不如自己写、自己实践,否则学完了都不知道是什么东西)
    clientdataset<---->json
    完全自定义窗体风格的实现
    监控其它进程
    用JSP+JavaBean开发模式实现一个销售额的查询
  • 原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10045659.html
Copyright © 2011-2022 走看看