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

以下是一个基于Python实现的仿射密码加密和解密的代码: ```python # 仿射密码加密和解密的Python代码 # 定义加密函数 def affine_encrypt(text, key): ''' text: 明文 key: 仿射密码的密钥 ''' # 将明文转换为大写字母 text = text.upper() # 初始化密文 cipher = '' # 遍历明文中的每一个字符,并对其进行加密 for char in text: # 如果字符是字母,则对其进行加密 if char.isalpha(): # 将字符转换为对应的数字 char_num = ord(char) - 65 # 使用仿射密码进行加密 cipher_num = (key[0] * char_num + key[1]) % 26 # 将加密后的数字转换为对应的字母 cipher_char = chr(cipher_num + 65) # 将加密后的字符添加到密文中 cipher += cipher_char # 如果字符不是字母,则直接添加到密文中 else: cipher += char # 返回加密后的密文 return cipher # 定义解密函数 def affine_decrypt(cipher, key): ''' cipher: 密文 key: 仿射密码的密钥 ''' # 初始化明文 text = '' # 计算密钥的逆元 key_inverse = 0 for i in range(26): if (key[0] * i) % 26 == 1: key_inverse = i break # 遍历密文中的每一个字符,并对其进行解密 for char in cipher: # 如果字符是字母,则对其进行解密 if char.isalpha(): # 将字符转换为对应的数字 char_num = ord(char) - 65 # 使用仿射密码进行解密 text_num = (key_inverse * (char_num - key[1])) % 26 # 将解密后的数字转换为对应的字母 text_char = chr(text_num + 65) # 将解密后的字符添加到明文中 text += text_char # 如果字符不是字母,则直接添加到明文中 else: text += char # 返回解密后的明文 return text # 测试代码 if __name__ == '__main__': # 定义仿射密码的密钥 key = (3, 5) # 加密明文 plaintext = 'hello, world!' ciphertext = affine_encrypt(plaintext, key) print('明文:', plaintext) print('密文:', ciphertext) # 解密密文 decryptedtext = affine_decrypt(ciphertext, key) print('解密后的明文:', decryptedtext) ``` 请注意,这段代码仅用于教学和学术研究目的。在实际使用中,我们建议使用更加安全和可靠的加密算法,例如AES、RSA等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值