实 验 目 的 |
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("不存在该口令")
原文地址:https://www.cnblogs.com/WhiteHatKevil/p/10045659.html