大数据安全 | 【实验】RSA加密解密

📚关于RSA

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

📚实验目的

  • 编程实现RSA算法对下列数据实现加密与解密:
    • p=3; q=11, e=7; M=5
    • p=5; q=11, e=3; M=9
    • p=7; q=11, e=17; M=8
    • p=11; q=13, e=11; M=7
    • p=17; q=31; e=7; M=2

📚流程梳理

🐇Step1:求解乘法逆元

  • 因为已经给定了p、q、e,所以实际要求的就只剩下乘法逆元d,然后生成密钥函数,再依据算法流程求解即可。
    # 计算a在模m下的乘法逆元
    # 乘法逆元是指对于整数a和模数m,存在一个整数x,使得(a * x) % m = 1
    def modinv(a, m):
       m0, x0, x1 = m, 0, 1
       while a > 1:
          # 计算商q,a%m是余数
          q = a // m
          m, a = a % m, m
          x0, x1 = x1 - q * x0, x0
       return x1 + m0 if x1 < 0 else x1
    
  • modinv(a, m) 接收两个参数 a 和 m,分别代表乘法逆元的基数和模数。
  • 创建变量:m0, x0, x1 = m, 0, 1。这些变量用于存储中间结果和最终结果。m0 是传入的模数m,x0 和 x1 是扩展欧几里德算法中的辅助变量。
  • while 循环:使用除法算法进行迭代,直到 a 变为 1 。在每次循环中进行以下操作:
    • 计算商:q = a // m,将 a 除以 m 的商保存在变量 q 中。
    • 计算余数和更新变量:m, a = a % m, m。m 更新为 a 对 m 取余的结果,a 更新为之前的 m。
    • 更新辅助变量:x0, x1 = x1 - q * x0, x0。根据扩展欧几里德算法的公式更新 x0 和 x1。
  • 返回结果:返回计算得到的结果 x1 + m0(如果 x1 小于 0,则加上 m0),这是乘法逆元。

  1. 背后的理论是扩展的欧几里德算法。欧几里德算法用于计算两个整数的最大公约数,而扩展的欧几里德算法在计算最大公约数的同时,还计算了两个整数的线性组合,也就是计算了乘法逆元。
  2. 在每次循环中,通过除法算法计算出 a 对 m 的余数 q 和新的 a。然后根据扩展欧几里德算法的公式,更新辅助变量 x0 和 x1。
  3. 当 a 变为 1 或者更小时,循环结束,这时 x1 存储的即为乘法逆元。
  4. 最后的返回语句处理了 x1 小于 0 的情况,加上 m0 保证返回的结果是非负的乘法逆元。

🐇Step2:生成密钥

在这里插入图片描述

# 生成密钥函数
def generate_key(p, q, e):
    n = p * q
    fyn = (p - 1) * (q - 1)
    d = modinv(e, fyn)
    # print(d)
    return ((n, e), (n, d))

🐇Step3:加密解密

在这里插入图片描述

# 加密函数
def encrypt(public_key, plaintext):
    n, e = public_key
    # C = M^e mod n
    ciphertext = pow(plaintext, e, n)
    return ciphertext

# 解密函数
def decrypt(private_key, ciphertext):
    n, d = private_key
    # M = C^d mod n
    plaintext = pow(ciphertext, d, n)
    return plaintext

🐇Step4:最后数据导入

# 测试数据
data = [
    {'p': 3, 'q': 11, 'e': 7, 'M': 5},
    {'p': 5, 'q': 11, 'e': 3, 'M': 9},
    {'p': 7, 'q': 11, 'e': 17, 'M': 8},
    {'p': 11, 'q': 13, 'e': 11, 'M': 7},
    {'p': 17, 'q': 31, 'e': 7, 'M': 2}
]

# 对每组数据进行加密与解密
for d in data:
    p, q, e, M = d['p'], d['q'], d['e'], d['M']
    public_key, private_key = generate_key(p, q, e)
    encrypted_text = encrypt(public_key, M)
    decrypted_text = decrypt(private_key, encrypted_text)
    print(f"原始数据: {M}, 加密后: {encrypted_text}, 解密后: {decrypted_text}")

📚实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啦啦右一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值