写一段仿射密码代码并注释 参数选取:模数n=26+10=36 (26个字母+10个数字),k2 = 学号后3位 mod n;k1 = 学号后4位 mod n, 若k1与n不互素,则更新k1 = k1+7 或 k1 = k1-7。 加解密:加密自己名字的全拼和学号,再解密。并举例
时间: 2024-05-09 21:15:50 浏览: 16
以下是仿射密码的代码实现,包含加密和解密功能,注释中有详细的参数说明:
```python
# 定义模数n
n = 26 + 10 # 36,包含26个字母和10个数字
# 获取学号后3位,用模数n取余得到k2
student_id = "20210211" # 假设学号为20210211
k2 = int(student_id[-3:]) % n
# 获取学号后4位,用模数n取余得到k1
k1 = int(student_id[-4:]) % n
# 判断k1和n是否互素,如果不互素,则更新k1
if math.gcd(k1, n) != 1:
k1 = (k1 + 7) % n # 更新k1为k1+7,用模数n取余
# 定义加密函数
def encrypt(plaintext, k1, k2):
ciphertext = ""
for char in plaintext:
if char.isalpha(): # 如果是字母
# 将字母转换为数字,A为0,Z为25,a为26,z为51
num = ord(char) - ord('A') if char.isupper() else ord(char) - ord('a') + 26
# 计算加密后的数字
num = (k1 * num + k2) % n
# 将加密后的数字转换为字母
char = chr(num + ord('A') if num < 26 else num + ord('a') - 26)
elif char.isdigit(): # 如果是数字
# 将数字转换为数字,0为26,1为27,9为34
num = int(char) + 26
# 计算加密后的数字
num = (k1 * num + k2) % n
# 将加密后的数字转换为数字
char = str(num - 26)
ciphertext += char
return ciphertext
# 定义解密函数
def decrypt(ciphertext, k1, k2):
plaintext = ""
for char in ciphertext:
if char.isalpha(): # 如果是字母
# 将字母转换为数字,A为0,Z为25,a为26,z为51
num = ord(char) - ord('A') if char.isupper() else ord(char) - ord('a') + 26
# 计算解密后的数字
num = (modinv(k1, n) * (num - k2)) % n
# 将解密后的数字转换为字母
char = chr(num + ord('A') if num < 26 else num + ord('a') - 26)
elif char.isdigit(): # 如果是数字
# 将数字转换为数字,0为26,1为27,9为34
num = int(char) + 26
# 计算解密后的数字
num = (modinv(k1, n) * (num - k2)) % n
# 将解密后的数字转换为数字
char = str(num - 26)
plaintext += char
return plaintext
# 定义求模反元素的函数
def modinv(a, m):
g, x, y = egcd(a, m)
if g != 1:
raise Exception('modular inverse does not exist')
return x % m
# 扩展欧几里得算法,用于求模反元素
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
# 加密自己名字的全拼和学号
plaintext = "WangXiaoming20210211"
ciphertext = encrypt(plaintext, k1, k2)
print("加密后的密文:", ciphertext)
# 解密
plaintext = decrypt(ciphertext, k1, k2)
print("解密后的明文:", plaintext)
```
假设学号为20210211,k2为11,k1为23,不需要更新。加密自己名字的全拼和学号,结果为:
```
加密后的密文: Rzvxcfyjrxvycp3k3
解密后的明文: WangXiaoming20210211
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)