题目
基础加密算法实践 (小计 40分)
本任务程序不允许使用封装函数,即不直接调用编程语言或相关包提供的方法,需要自行完成,但可以使用如封装的求最大公约数,乘法逆元等封装的方法。
(1)请采用编程语言实现仿射加密与解密算法。
(2)加密公式,E(x)=(a*x + b) mod m;要求a与m互为素数;
(3)解密方程,D(x) = a^-1(x - b) mod m;要求 1 = (a*a^-1) mod m,即 a^-1指 a关于mod m的乘法逆元。
(4)编写对应的加密函数(方法)与解密函数(方法),接受a(或a^-1)与b为参数,及要加密的字符串,加密明文字符串,依据密文串还原明文字符串。
(5)要求代码具备良好的注释和结构,便于理解和维护。
(6)加密信息为个人学号及个人姓名的全拼,如以李明(202211672100)为例,加密的字符串为“202211672100LiMing"。
(评分参考:本任务编程语言不限。(1)关键代码片段,并对代码进行必要的注释和解释,说明代码的功能和实现思路,此项评分20分。(2)展示实验的运行结果,包括加密前后的数据对比、文件加密和解密的验证结果,此项评分20分。(3)未使用个人信息做为待处理字符串的,减5分。(4)直接使用大封装函数或方法实现的,减10分。本实验任务小计40分)
实验环境
操作系统:Windows 11
编程语言:Python 3.11
开发工具:PyCharm
代码实现
# 计算最大公约数
def gcd(a, b):
while b:
a, b = b, a % b
return a
# 计算乘法逆元
def mod_inverse(a, m):
for x in range(1, m):
if (a * x) % m == 1:
return x
return None
# 仿射加密函数
def affine_encrypt(plaintext, a, b, m=256):
# 检查 a 和 m 是否互质
if gcd(a, m) != 1:
raise ValueError("a 和 m 必须互质")
ciphertext = ""
for char in plaintext:
# 将字符转换为 ASCII 码
x = ord(char)
# 应用加密公式
encrypted_char = (a * x + b) % m
# 将加密后的 ASCII 码转换回字符
ciphertext += chr(encrypted_char)
return ciphertext
# 仿射解密函数
def affine_decrypt(ciphertext, a, b, m=256):
# 计算 a 的乘法逆元
a_inv = mod_inverse(a, m)
if a_inv is None:
raise ValueError("a 没有关于 m 的乘法逆元")
plaintext = ""
for char in ciphertext:
# 将字符转换为 ASCII 码
y = ord(char)
# 应用解密公式
decrypted_char = (a_inv * (y - b)) % m
# 将解密后的 ASCII 码转换回字符
plaintext += chr(decrypted_char)
return plaintext
# 示例数据
a = 7
b = 3
plaintext = "20221167"
# 加密
ciphertext = affine_encrypt(plaintext, a, b)
print("明文:", plaintext)
print("密文:", ciphertext)
# 解密
decrypted_text = affine_decrypt(ciphertext, a, b)
print("解密后的明文:", decrypted_text)
运行截图
如上图所示解密成功,解密过程正确还原了原始明文,说明加密和解密算法逻辑无误。
密文中可能会出现不明字符,是由于加密过程中某些字符的 ASCII 值超出了可打印字符的范围(32-126)。这些超出范围的值会被转换为不可打印或特殊字符。