RSA加密算法详解及Python实现

RSA 加密算法

一、前言

RSA 加密算法是一种非对称加密算法。在公开密钥加密和电子商业中 RSA 被广泛使用。RSA 是 1977 年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。

二、准备工作

1、找出两个质数 和

2、=×

3、()=(−1)(−1)

4、公钥 :在 1<<() 中找一个整数

* 和 () 互质

5、私钥 :通过 ⋅≡1()得到

三、加密函数

给定 与公钥

加密函数为: y ≡ x e m o d    n y\equiv x^emod\;n yxemodn

四、解密函数

给定私钥 及密文 和

解密函数为: x ≡ y d m o d    n x\equiv y^dmod\;n xydmodn

五、算法流程

Alice 想发送一个加密后的信息给 Bob,Alice 想发送的消息是(=4 ),Alice 对其加密后生成密文 发送给 Bob,Bob 使用自己的私钥解密 y

RSA加密算法详解及Python实现_第1张图片

六、代码实现

# 求两个数字的最大公约数(欧几里得算法)
def gcd(a, b):
    if b == 0:
        return a
    else:
        return gcd(b, a % b)


# 拓展的欧几里得算法
def ext_gcd(a, b):

    if b == 0:
        x1 = 1
        y1 = 0
        x = x1
        y = y1
        r = a
        return r, x, y
    else:
        r, x1, y1 = ext_gcd(b, a % b)
        x = y1
        y = x1 - a // b * y1
        return r, x, y


# 生成公钥私钥
def get_key(p, q):
    n = p * q
    fyn = (p - 1) * (q - 1)

    # 此处抱着e与fyn互素,并且得到的x要大于0
    e = fyn      # 初始化e
    while e > 1 :
        e -= 1
        r, x, y, = ext_gcd(e, fyn)  # 传入fn和e到ext_gcd()中,得到d
        if (gcd(e, fyn) == 1) & (x > 0):
            break
    # d*e%
    d = x              # 扩展的欧几里得算法中得到的x就是e的逆元
    return (n, e), (n, d)


# 加密
def encryption(x, pubkey):
    n = pubkey[0]
    e = pubkey[1]
    y = x ** e % n   # 加密
    return y


# 解密
def decryption(y, prikey):
    n = prikey[0]
    d = prikey[1]
    x = y ** d % n      # 解密
    return x


if __name__ == '__main__':
    p = int(input("请给定第一个质数p的值:"))
    q = int(input("请给定第二个质数q的值:"))
    x = int(input("请给定要加密的消息x的值:"))
    # 生成公钥私钥
    pubkey, prikey = get_key(p, q)
    print("加密前的消息是:", x)
    y = encryption(x, pubkey)
    print("加密后的消息是:", y)
    after_x = decryption(y, prikey)
    print("解密后的消息是:", after_x)
  • 有一个小问题(大问题)如果加密的信息,或者算法选择到的(e) 的值过大时,可能会出现精度问题,导致结果错误= = 但至少按照算法的思路写出来的这个程序是能够按照算法的意思,解出答案来的 主要问题就是当指数太大数,精度发生了丢失(应该) 有时间再重新写一下这个程序8

运行截图
RSA加密算法详解及Python实现_第2张图片

你可能感兴趣的:(算法,算法,python,线性代数)