仿射密码python_仿射密码加解密 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()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值