欢迎访问宙启技术站
智能推送

Python中RSA算法实现数据加密和解密步骤详解

发布时间:2023-12-24 10:01:12

RSA算法是一种非对称加密算法,用于实现数据的加密和解密。下面我们将详细介绍RSA算法的实现步骤,并提供一个使用例子。

1. 选择两个质数p和q,并计算出它们的乘积n。

2. 计算n的欧拉函数φ(n) = (p-1)(q-1)。

3. 选择一个与φ(n)互质的整数e,作为加密指数。

4. 计算与e关于φ(n)的乘法逆元d,即满足ed≡1 (mod φ(n))的整数d,作为解密指数。

5. 将公钥公开,包括n和e;将私钥保密,包括n和d。

6. 加密:将待加密的数据m转换为整数,然后使用公钥(n, e)进行加密,得到加密后的数据c = m^e (mod n)。

7. 解密:使用私钥(n, d)对加密后的数据c进行解密,得到解密后的数据m = c^d (mod n)。

下面是一个使用RSA算法进行数据加密和解密的例子:

import random
import math

# 生成大素数
def generate_prime_number(min_value, max_value):
    prime_number = 0
    while True:
        prime_number = random.randint(min_value, max_value)
        if is_prime_number(prime_number):
            break
    return prime_number

# 判断是否为素数
def is_prime_number(number):
    if number < 2:
        return False
    for i in range(2, int(math.sqrt(number)) + 1):
        if number % i == 0:
            return False
    return True

# 计算乘法逆元
def multiplicative_inverse(e, phi_n):
    d = 0
    while (e * d) % phi_n != 1:
        d += 1
    return d

# 加密函数
def encrypt(data, public_key):
    n, e = public_key
    return pow(data, e, n)

# 解密函数
def decrypt(data, private_key):
    n, d = private_key
    return pow(data, d, n)

# 主函数
def main():
    # 选择两个质数p和q
    p = generate_prime_number(100, 1000)
    q = generate_prime_number(100, 1000)

    # 计算n和phi_n
    n = p * q
    phi_n = (p - 1) * (q - 1)

    # 选择加密指数e
    e = random.randint(2, phi_n)

    # 计算解密指数d
    d = multiplicative_inverse(e, phi_n)

    # 公钥和私钥
    public_key = (n, e)
    private_key = (n, d)

    # 待加密的数据
    data = 123456

    # 加密
    encrypted_data = encrypt(data, public_key)
    print('加密后的数据:', encrypted_data)

    # 解密
    decrypted_data = decrypt(encrypted_data, private_key)
    print('解密后的数据:', decrypted_data)

if __name__ == '__main__':
    main()

这个例子中,首先我们选择了两个质数p和q,然后根据公式计算出了n和phi_n。然后随机选择了一个加密指数e,并计算出了与e互质的乘法逆元d。将公钥和私钥分别保存,用于加密和解密。

接下来,我们选择一个待加密的数据123456,并将其转换为整数。然后使用公钥对数据进行加密,得到加密后的数据。最后使用私钥对加密后的数据进行解密,得到解密后的数据,与原始数据一致。

通过这个例子,我们可以看到RSA算法的具体实现步骤和效果。需要注意的是,实际环境中,选择的质数p和q要尽可能大,并且对数据进行分组加密以提高安全性。