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

RSA非对称加密算法在Python中的原理和应用介绍

发布时间:2023-12-17 17:01:43

RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,它由三位计算机科学家:Ron Rivest、Adi Shamir和Leonard Adleman 在1977年共同发明。RSA算法利用了两个不同的密钥:一个公钥和一个私钥。公钥用于加密数据,私钥用于解密数据。

RSA算法的原理如下:

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

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

3. 选择一个与φ(n)互质的整数e,e要大于1且小于φ(n)。

4. 计算与e关于模φ(n)的模逆d,即(d * e) % φ(n) = 1。

5. 公钥就是(n, e),私钥就是(n, d)。

6. 加密时,将消息m用公钥加密得到密文c:c = (m^e) % n。

7. 解密时,将密文c用私钥解密得到原始消息m:m = (c^d) % n。

RSA算法的应用有很多,主要包括以下几个方面:

1. 安全通信:RSA算法可以用于安全地传输数据。发送方使用接收方的公钥进行加密,接收方使用自己的私钥进行解密,确保只有接收方能够解密数据。

2. 数字签名:RSA算法也可以用于数字签名,在数据传输过程中验证数据的完整性和真实性。发送方使用自己的私钥对数据进行签名,接收方使用发送方的公钥验证签名是否有效。

3. 密码学协议:RSA算法被广泛应用于各种密码学协议中,例如TLS、SSH等,用于建立和保护网络通信的安全性。

下面以一个具体的例子来说明RSA算法的使用。

首先,生成公钥和私钥:

import random
import math

def generate_key():
    # 选择两个大质数p和q
    p = generate_prime()
    q = generate_prime()
    
    # 计算n = p * q
    n = p * q
    
    # 计算欧拉函数φ(n)
    phi = (p - 1) * (q - 1)
    
    # 选择与φ(n)互质的公钥e
    e = generate_coprime(phi)
    
    # 计算私钥d
    d = modular_inverse(e, phi)
    
    # 返回公钥和私钥
    return (n, e), (n, d)

def generate_prime():
    # 生成一个大质数
    while True:
        num = random.randint(2**15, 2**16)
        if is_prime(num):
            return num

def is_prime(num):
    # 判断一个数是否是质数
    if num < 2:
        return False
    for i in range(2, int(math.sqrt(num)) + 1):
        if num % i == 0:
            return False
    return True

def generate_coprime(phi):
    # 生成与phi互质的数
    while True:
        num = random.randint(2, phi - 1)
        if math.gcd(num, phi) == 1:
            return num

def modular_inverse(a, m):
    # 计算a关于模m的模逆
    _, x, _ = extended_gcd(a, m)
    return x % m

def extended_gcd(a, b):
    if a == 0:
        return b, 0, 1
    else:
        g, x, y = extended_gcd(b % a, a)
        return g, y - (b // a) * x, x

public_key, private_key = generate_key()

使用公钥进行加密:

def encrypt(message, public_key):
    n, e = public_key
    return pow(message, e, n)

message = 123456789
encrypted_message = encrypt(message, public_key)

使用私钥进行解密:

def decrypt(encrypted_message, private_key):
    n, d = private_key
    return pow(encrypted_message, d, n)

decrypted_message = decrypt(encrypted_message, private_key)