仿射密码加解密 python

参数选取:模数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()

 

你可能感兴趣的:(python)