匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python实现数据加密和解密:cryptography库教程

Python实现数据加密和解密:cryptography库教程

在现代互联网时代,数据安全已经成为了一个非常重要的问题。如果你想安全地存储、传输和处理数据,那么加密就是一个必要的步骤。Python作为一种通用的编程语言,也提供了一些很好的加密库。其中,cryptography就是一个很好的选择。

在本篇文章中,我们将介绍如何使用Python的cryptography库实现数据加密和解密的步骤。我们将介绍Symmetric Encryption(对称加密)和Asymmetric Encryption(非对称加密)的差别,并给出两种不同类型的加密方法的示例代码。

1. Symmetric Encryption (对称加密)

在对称加密中,一个密钥被用于加密和解密数据。由于加密和解密使用同一个密钥,因此这种加密方式被称为对称加密。

在Python中,我们使用cryptography库来实现对称加密。下面是一个使用AES算法进行加密和解密的示例代码:

```
from cryptography.fernet import Fernet

def generate_key():
    key = Fernet.generate_key()
    with open("secret.key", "wb") as key_file:
        key_file.write(key)

def load_key():
    return open("secret.key", "rb").read()

def encrypt_message(message):
    key = load_key()
    encoded_message = message.encode()
    f = Fernet(key)
    encrypted_message = f.encrypt(encoded_message)
    return encrypted_message

def decrypt_message(encrypted_message):
    key = load_key()
    f = Fernet(key)
    decrypted_message = f.decrypt(encrypted_message)
    decoded_message = decrypted_message.decode()
    return decoded_message

generate_key()
message = input("Enter message to encrypt: ")
encrypted_message = encrypt_message(message)
print("Encrypted message: ", encrypted_message)
decrypted_message = decrypt_message(encrypted_message)
print("Decrypted message: ", decrypted_message)
```

首先,我们需要生成一个密钥并保存在一个文件中。在这个例子中,我们使用了Fernet算法来生成密钥。生成密钥之后,我们可以使用该密钥来加密和解密字符串数据。

在上述代码中,我们使用了input()函数来接收用户输入。然后,我们将用户输入的消息编码并使用Fernet密钥进行加密。加密后,我们将加密后的消息打印出来,并将其解密并打印。

2. Asymmetric Encryption (非对称加密)

在非对称加密中,两个不同的密钥被用于加密和解密数据。一个密钥被称为公钥,另一个密钥被称为私钥。公钥可以被公开传输,但私钥应该保持秘密。

在Python中,我们可以使用cryptography库来实现非对称加密。下面是一个使用RSA算法进行加密和解密的示例代码:

```
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes

def generate_key():
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
    )
    pem_private_key = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )
    public_key = private_key.public_key()
    pem_public_key = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )
    with open("private_key.pem", "wb") as private_key_file:
        private_key_file.write(pem_private_key)
    with open("public_key.pem", "wb") as public_key_file:
        public_key_file.write(pem_public_key)

def load_private_key():
    with open("private_key.pem", "rb") as key_file:
        private_key = serialization.load_pem_private_key(
            key_file.read(),
            password=None,
        )
    return private_key

def load_public_key():
    with open("public_key.pem", "rb") as key_file:
        public_key = serialization.load_pem_public_key(
            key_file.read(),
        )
    return public_key

def encrypt_message(message):
    public_key = load_public_key()
    encoded_message = message.encode()
    encrypted_message = public_key.encrypt(
        encoded_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    return encrypted_message

def decrypt_message(encrypted_message):
    private_key = load_private_key()
    decrypted_message = private_key.decrypt(
        encrypted_message,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    decoded_message = decrypted_message.decode()
    return decoded_message

generate_key()
message = input("Enter message to encrypt: ")
encrypted_message = encrypt_message(message)
print("Encrypted message: ", encrypted_message)
decrypted_message = decrypt_message(encrypted_message)
print("Decrypted message: ", decrypted_message)
```

首先,我们生成了一个私钥和公钥,并将它们分别保存在文件中。然后,我们可以使用公钥来加密字符串数据,即使公钥是公开的。加密后的消息可以被传输到其他人,但只有私钥持有者可以解密消息。

在上述代码中,我们使用input()函数来接收用户输入。然后,我们将用户输入的消息编码并使用公钥进行加密。加密后,我们将加密后的消息打印出来,并将其解密并打印。

总结

在本篇文章中,我们介绍了如何使用Python的cryptography库实现对称加密和非对称加密。对于对称加密,我们使用了Fernet算法,对于非对称加密,我们使用了RSA算法。这两种加密方式都是流行的加密方式,可以用于与数据安全相关的各种应用。