参数选取:模数n=26+10=36,k2为学号后2位;k1为与学号后2位最近的素数。
加解密:加密自己名字的全拼,再解密。
密钥 k = (k1 , k2)
仿射密码加解密算法是: m:是输入的明文
C= Ek(m)=(k1m+k2) mod n
M= Dk(c)=k3(c- k2) mod n (其中(k3 ×k1)mod26 = 1,即k3是k1的逆元)
求取逆元的过程代码如下:
def get_gcd(a, b):
k = a // b
remainder = a % b
while remainder != 0:
a = b
b = remainder
k = a // b
remainder = a % b
return b
#改进欧几里得算法求线性方程的x与y
def get_(a, b):
if b == 0:
return 1, 0
else:
k = a // b
remainder = a % b
x1, y1 = get_(b, remainder)
x, y = y1, x1 - k * y1
return x, y
a = int(input('请输入: '))
b = int(input('请输入: '))
#将初始b的绝对值进行保存
if b < 0:
m = abs(b)
else:
m = b
flag = get_gcd(a, b)
#判断最大公约数是否为1,若不是则没有逆元
if flag == 1:
x, y = get_(a, b)
x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'
print(x0) #x0就是所求的逆元
else:
print("Do not have!")
整个加解密过程如下:
import random
import os
a=int(input("输入k1:"))
c=int(input("输入k2:"))
def get_gcd(a, b):
k = a // b
remainder = a % b
while remainder != 0:
a = b
b = remainder
k = a // b
remainder = a % b
return b
#改进欧几里得算法求线性方程的x与y
def get_(a,b):
if b == 0:
return 1, 0
else:
k = a // b
remainder = a % b
x1, y1 = get_(b, remainder)
x, y = y1, x1 - k * y1
return x, y
b = int(input('请输入n: '))
#将初始b的绝对值进行保存
if b < 0:
m = abs(b)
else:
m = b
flag = get_gcd(a, b)
#判断最大公约数是否为1,若不是则没有逆元
if flag == 1:
x, y = get_(a, b)
x0 = x % m #对于Python '%'就是求模运算,因此不需要'+m'
print('逆元是:'+str(x0)) #x0就是所求的逆元
else:
print('Do not have!')
def Encrypt():
m=input("请输入明文:")
k=m.lower()
l=list(k)
s=l
for i in range(len(l)):
s[i]=chr(((ord(l[i])-97)*a+c)%b+97)
print(s[i],end='')
print('')
#print("结果为:"+"".join(s))
def Decrypt():
m=input("请输入密文:")
k=m.lower()
l=list(k)
s=l
for i in range(len(l)):
s[i]=chr((((ord(l[i])-97)-c)*x0)%b+97)
print(s[i],end='')
print('')
while True:
Encrypt()
Decrypt()