py3實現維吉尼亞加解密
實 驗 目 的 |
1、 熟悉和掌握替代加密演算法的原理及其一般過程;
2、掌握對稱加密演算法的基本方法:維吉尼亞密碼
3、掌握使用一定的編碼開發工具(對具體的開發平臺和工具不作要求)。 |
實 驗 環 境 |
Python3+pycharm |
實 驗 步 驟 |
Vigenenre 密碼使用一個片語作為金鑰,金鑰中每一個字母用來確定一個代換表, 每一個金鑰字母被用來加密一個明文字母,第一個金鑰字母加密第一個明文字母, 第二個金鑰字母加密第二個明文字母,等所有金鑰字母使用完後,金鑰再次迴圈使用, 於是加解密前需先將明密文按照金鑰長度進行分組。
密碼演算法可表示如下: 設金鑰 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) 解密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("不存在該口令")