因为事情繁多没有得好好写文章了,记下这两天课上写的密码学脚本~~~
反向密码
# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm
mingwen = input("请输入反向加密的密文:\n")
print("反向加密后的密文:" + mingwen[::-1])
miwen = mingwen[::-1]
print("解密后的明文:" + miwen[::-1])
凯撒密码
# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm
from sympy import *
def Ksencrypt(m,key) : #加密函数
re = ''
for i in m:
if i in b: #如果该字符在字符串b中就返回相应的下标
num = b.find(i)
re +=b[Mod(num+key,26)] #加相应的key再mod26
return re #返回加密后的密文
def Ksdecrypt(m,key) : #解密函数,过程同加密,只是相应的key+3变成-3
re = ''
for i in m:
if i in b:
num = b.find(i)
re +=b[Mod(num-key,26)]
return re
if __name__ == '__main__':
m, key = input("请输入明文和密钥,明文和密钥中间用空格分开:").split(' ')
m = m.lower()
b = "abcdefghijklmnopqrstuvwxyz"
key = int(key)
c = Ksencrypt(m,key)
print("加密后密文为:" + c)
m = Ksdecrypt(c,key)
print("解密后明文为:" + m)
仿射密码
# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm
from sympy import *
import gmpy2
def FsFsencrypt(m, a, b):
re = ''
for i in m:
if i in dictstr: # 如果该字符在字符串b中就返回相应的下标
num = dictstr.find(i)
re += dictstr[Mod(num * a + b, 26)] # 乘以相应的a加上偏移量再mod26
return re # 返回加密后的密文
def Qiua_ni(a, n): #求逆元函数
a_ni = gmpy2.invert(a, n)
return a_ni
def Fsdecrypt(c, a_ni, b):
re = ''
for i in c:
if i in dictstr: # 如果该字符在字符串b中就返回相应的下标
num = dictstr.find(i)
re += dictstr[Mod(a_ni * (num - b), 26)] # 逆元乘以减去偏移量的密文再mod26
return re
if __name__ == '__main__':
print("-----------加密方程为a*x + b(mod 26)--------------")
m = input("---请输入待加密的明文---:")
a = int(input("---请输入a,a的范围是a ∈{1,3,5,7,9,11,15,17,19,21,23,25}---:"))
b = int(input("---请输入b,b的范围是b<26---:"))
m = m.lower()
dictstr = "abcdefghijklmnopqrstuvwxyz"
c = FsFsencrypt(m, a, b)
print("---加密后密文为---:" + c)
print("---a的逆元为----:" + str(Qiua_ni(5, 26)))
a_ni = Qiua_ni(5, 26)
m = Fsdecrypt(c, a_ni, b)
print("---解密后明文为---:" + m)
维吉尼亚密码
# -*- coding: utf-8 -*-
# @Time : 2020-12-01 9:26
# @File : 22.py
# @Author : mirror
# @Software: PyCharm
from sympy import *
def Wnencrypt(keylen,ptlen) :
ciphertext = ''
i = 0
while i < ptlen:
j = i % keylen #通过求余的方式来控制密钥的循环
k = dictstr.find(key[j])
m = dictstr.find(plaintext[i])
ciphertext += dictstr[Mod(k + m,26)] #位置下标相加再mod26
i += 1
return ciphertext
def Wndecrypt(keylen,ctlen) :
plaintext = ""
i=0
while i < ctlen:
j = i % keylen
k = dictstr.find(key[j])
m = dictstr.find(ciphertext[i])
if m < k:
m += 26
plaintext += dictstr[m-k]
i += 1
return plaintext
if __name__ == '__main__':
key = input("---请输入key---:")
plaintext = input("---请输入待加密的明文(单词之间去掉空格再输入)---:")
dictstr = 'abcdefghijklmnopqrstuvwxyz'
keylen = len(key)
ptlen = len(plaintext)
print("---加密后密文为---:" + Wnencrypt(keylen,ptlen))
ciphertext = Wnencrypt(keylen,ptlen)
keylen = len(key)
ctlen = len(ciphertext)
print("---解密后明文为---:" + Wndecrypt(keylen,ctlen))