Python非对称加密的实现

非对称加密是一种加密方法,它使用一对密钥:公钥和私钥。公钥可公开,而私钥则需要保密。通过公钥加密的信息只能用私钥解密,这使得非对称加密在数据传输和存储中具有重要意义。

在这篇文章中,我们将探讨如何在Python中实现非对称加密,而不使用内置函数。我们将使用数论中的一些基本概念,例如大素数和欧几里得算法,来实现RSA加密法。

RSA加密的基本原理

RSA算法主要包括以下步骤:

  1. 选择两个大素数 ( p ) 和 ( q )。
  2. 计算 ( n = p \times q ) 和欧拉函数 ( \phi(n) = (p-1) \times (q-1) )。
  3. 选择一个与 ( \phi(n) ) 互质的整数 ( e ),作为公钥的一部分。
  4. 计算私钥 ( d ),使得 ( d \times e \mod \phi(n) = 1 )。
  5. 使用公钥 ((e, n)) 进行加密,私钥 ((d, n)) 进行解密。

代码示例

下面是一个简单的RSA非对称加密实现的示例:

import random

# 计算最大公约数
def gcd(a, b):
    while b != 0:
        a, b = b, a % b
    return a

# 生成大素数
def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True

def generate_prime():
    while True:
        num = random.randint(100, 500)
        if is_prime(num):
            return num

# 生成密钥
def generate_keys():
    p = generate_prime()
    q = generate_prime()
    n = p * q
    phi_n = (p - 1) * (q - 1)

    e = 65537  # 常用的公开指数
    while gcd(e, phi_n) != 1:
        e = random.randint(2, phi_n - 1)

    # 计算私钥
    d = pow(e, -1, phi_n)  # 计算与e互为的d

    return (e, n), (d, n)

# 加密
def encrypt(public_key, plaintext):
    e, n = public_key
    cipher = [pow(ord(char), e, n) for char in plaintext]
    return cipher

# 解密
def decrypt(private_key, ciphertext):
    d, n = private_key
    plain = "".join([chr(pow(char, d, n)) for char in ciphertext])
    return plain

# 示例运行
public_key, private_key = generate_keys()
message = "hello"
ciphertext = encrypt(public_key, message)
decrypted_message = decrypt(private_key, ciphertext)

print(f"原文: {message}")
print(f"密文: {ciphertext}")
print(f"解密后: {decrypted_message}")

序列图

下面是一个展示RSA加密和解密过程的序列图:

sequenceDiagram
    participant User
    participant PublicKey
    participant PrivateKey
    User->>PublicKey: 加密消息
    PublicKey->>User: 返回密文
    User->>PrivateKey: 解密密文
    PrivateKey->>User: 返回原文

关系图

以下是RSA加密中的各个元素关系图:

erDiagram
    USER {
        string message
    }
    PUBLIC_KEY {
        int e
        int n
    }
    PRIVATE_KEY {
        int d
        int n
    }
    USER ||--o{ PUBLIC_KEY : encrypts
    USER ||--o{ PRIVATE_KEY : decrypts

结尾

通过上述代码和图示,我们简单实现了RSA非对称加密的基本原理。这种加密方法在现代通信中具有重要的安全性与可靠性。虽然这里的实现较为基础,但它展现了非对称加密的核心思想。在实际应用中,建议使用成熟的库和工具,例如pycryptodome,以确保更高的安全性和性能。希望这篇文章能帮助你更好地理解非对称加密的基本概念与实现。