【RAS非对称加密算法】DEMO原理与示例

from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP



# 生成 RSA 密钥对
def generate_rsa_keys():
    """
        公钥是通过特定算法从私钥导出的,可以安全地公开。
        公钥用于加密数据或验证签名。
        私钥用于解密数据或生成签名。
    """
    key = RSA.generate(2048)        # 生成 2048 位的 RSA 密钥
    private_key = key.export_key()  # 导出私钥
    public_key = key.publickey().export_key()  # 导出公钥
    return private_key, public_key


# 加密
def encrypt_message(message, public_key):
    """
        在加密时,公钥用于将明文信息转换为密文,只有与公钥对应的私钥才能解密密文。
        使用加密算法(如 PKCS1_OAEP)对明文进行加密,自动处理填充和转换为密文。
    """
    public_key = RSA.import_key(public_key)  # 导入公钥
    cipher = PKCS1_OAEP.new(public_key)      # 使用 PKCS1_OAEP 进行加密
    encrypted_message = cipher.encrypt(message.encode('utf-8'))
    return encrypted_message

# 解密
def decrypt_message(encrypted_message, private_key):
    """
        解密过程涉及使用私钥对通过公钥加密的密文进行还原。私钥与公钥在 RSA 加密过程中有明确的数学关系,确保只有私钥能解密由公钥加密的数据。
    """
    private_key = RSA.import_key(private_key)  # 导入私钥
    cipher = PKCS1_OAEP.new(private_key)       # 使用 PKCS1_OAEP 进行解密
    decrypted_message = cipher.decrypt(encrypted_message).decode('utf-8')
    return decrypted_message




# 测试
if __name__ == "__main__":
    # 生成密钥
    private_key, public_key = generate_rsa_keys()
    print("私钥:")
    print(private_key.decode())
    print("公钥:")
    print(public_key.decode())

    # 加密和解密
    message = "Hello, PyCryptodome!"
    print(f"\n原始消息: {message}")

    encrypted = encrypt_message(message, public_key)
    print(f"加密后的消息: {encrypted}")

    decrypted = decrypt_message(encrypted, private_key)
    print(f"解密后的消息: {decrypted}")
posted @ 2024-12-05 16:27  PythonNew_Mr.Wang  Views(10)  Comments(0Edit  收藏  举报