返回

颠覆数据安全的魔术师—RSA加解密

后端

神秘的数学之舞——RSA 算法原理
RSA 算法于 1978 年由三位数学家 Rivest、Shamir 和 Adleman 提出,因三人姓氏的首字母命名。其基本思想是利用大整数的因数分解难度来构造加解密算法。

    1. 生成密钥
    2. 随机选择两个大素数p和q。
    3. 计算p和q的乘积n。
    4. 计算欧拉函数φ(n) = (p-1)*(q-1)。
    5. 选择一个与φ(n)互质的整数e。
    6. 计算e关于φ(n)的逆模d。
    1. 加密
    2. 将明文 M 表示为一个整数 m。
    3. 计算密文 c = m^e mod n。
    1. 解密
    2. 将密文 c 表示为一个整数 c。
    3. 计算明文 m = c^d mod n。

RSA 算法的安全性基于大整数因数分解的困难性。只要p和q足够大,那么分解n就非常困难,因此很难从密文中恢复明文。

算法实现——Python代码演示

现在,让我们用 Python 来实现 RSA 加解密算法。

import random

def generate_keys():
    p = get_prime_number()
    q = get_prime_number()
    n = p * q
    phi_n = (p-1) * (q-1)
    e = get_coprime(phi_n)
    d = modinv(e, phi_n)
    return (n, e, d)

def get_prime_number():
    while True:
        p = random.randint(2**1024, 2** 1025)
        if is_prime(p):
            return p

def is_prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True

def get_coprime(n):
    while True:
        e = random.randint(2, n)
        if gcd(e, n) == 1:
            return e

def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

def modinv(a, m):
    for x in range(1, m):
        if (a * x) % m == 1:
            return x
    return None

def encrypt(plaintext, n, e):
    m = int(plaintext.encode('utf-8').hex(), 16)
    c = pow(m, e, n)
    return c

def decrypt(ciphertext, n, d):
    m = pow(ciphertext, d, n)
    plaintext = bytes.fromhex(hex(m)[2:]).decode('utf-8')
    return plaintext

if __name__ == "__main__":
    plaintext = "Hello, world!"
    n, e, d = generate_keys()
    ciphertext = encrypt(plaintext, n, e)
    decryptedtext = decrypt(ciphertext, n, d)
    print("Plaintext:", plaintext)
    print("Encrypted:", ciphertext)
    print("Decrypted:", decryptedtext)

在这个脚本中,我们使用了 Python 自带的随机数生成器 random 来生成大素数,并使用 pow() 函数来计算模幂。

结语——无穷无尽的密码学王国

RSA 算法是密码学中的一个重要里程碑,它将密码学从理论提升到了实践。RSA 算法至今仍被广泛用于各种安全应用中,如电子邮件加密、数字签名和安全通信。