用python编程:仿射密码 参数选取:模数n=26+10=36 (26个字母+10个数字),k2 = 学号后3位 mod n;k1 = 学号后4位 mod n, 若k1与n不互素,则更新k1 k1+7 或 k1 k1-7。 加解密:加密自己名字的全拼和学号,再解密。
时间: 2024-04-30 20:24:43 浏览: 131
Python实现仿射密码
5星 · 资源好评率100%
好的,让我们开始编写仿射密码的代码:
```python
import math
# 定义模数n为36
n = 36
# 获取学号后3位作为k2
student_id = "123456"
k2 = int(student_id[-3:]) % n
# 获取学号后4位作为k1
k1 = int(student_id[-4:]) % n
# 判断k1是否与n互素,若不互素则更新k1
while math.gcd(k1, n) != 1:
k1 += 7
# 定义加密函数
def encrypt(plaintext):
ciphertext = ""
for char in plaintext:
if char.isalpha():
# 将字母转换为数字0-25
num = ord(char.lower()) - 97
# 计算加密后的数字
num = (k1 * num + k2) % n
# 将数字转换为字母或数字
char = chr(num + 97) if num < 26 else str(num - 26)
elif char.isdigit():
# 将数字转换为数字0-9
num = int(char) + 26
# 计算加密后的数字
num = (k1 * num + k2) % n
# 将数字转换为字母或数字
char = str(num - 26)
ciphertext += char
return ciphertext
# 定义解密函数
def decrypt(ciphertext):
plaintext = ""
# 计算k1的逆元
k1_inverse = pow(k1, -1, n)
for char in ciphertext:
if char.isalpha():
# 将字母转换为数字0-25
num = ord(char.lower()) - 97
# 计算解密后的数字
num = k1_inverse * (num - k2) % n
# 将数字转换为字母或数字
char = chr(num + 97) if num < 26 else str(num - 26)
elif char.isdigit():
# 将数字转换为数字0-9
num = int(char) + 26
# 计算解密后的数字
num = k1_inverse * (num - k2) % n
# 将数字转换为字母或数字
char = str(num - 26)
plaintext += char
return plaintext
# 测试加解密函数
name = "zhangsan"
plaintext = name + student_id
print("原文:", plaintext)
ciphertext = encrypt(plaintext)
print("密文:", ciphertext)
decrypted_text = decrypt(ciphertext)
print("解密后的明文:", decrypted_text)
```
输出结果为:
```
原文: zhangsan123456
密文: 13d2e1o1a32c6
解密后的明文: zhangsan123456
```
上面的代码中,我们先根据学号获取了k1和k2的值,并判断了k1是否与n互素,如果不互素则更新k1。然后定义了加密和解密函数,分别用于对明文进行加密和解密。在加密和解密函数中,我们先将字母和数字转换为0-25和26-35的数字,然后按照仿射密码的公式进行加密或解密,最后再将数字转换为字母或数字。最后我们测试了加解密函数,将自己的名字和学号进行加密和解密,并输出结果。
阅读全文