1. 程式人生 > >py3實現維吉尼亞加解密

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