【信息安全技术】实验一(1)基础加密算法实践 | 信息(数据)加密技术

题目

基础加密算法实践   (小计  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)。这些超出范围的值会被转换为不可打印或特殊字符。