python_cryptography_加密解密


安装

使用pip安装

pip install cryptography

加密与解密

有时会将一些数据发送到不受信任的环境。但是如何安全地做到这一点?诀窍就是签名。只要知道一个密钥,您就可以对数据进行加密签名并将其移交给其他人。当您取回数据时,可以轻松确保没有人篡改数据。使用cryptography可以实现此种方案。

from cryptography.fernet import Fernet


# =========生成密钥============
secret_key = Fernet.generate_key()  # 加密key
print("密钥", secret_key)

# =========加密数据============
msg = "hello python"

cipher = Fernet(secret_key)
ret = cipher.encrypt(msg.encode("utf-8"))
print("加密数据", ret.decode("utf-8"))

# =========解密数据============
msg = cipher.decrypt(ret)
print("解密数据", msg.decode("utf-8"))

执行结果

强调说明

只要你保管好你的密钥,并且密钥足够复杂,一切就OK的!

AES的ECB加密与解密

from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

import base64

block_size = 128


def aes_encrypt(secret_key, data):
    """加密数据
    :param secret_key: 加密秘钥
    :param data: 需要加密数据
    """
    # 将数据转换为byte类型
    data = data.encode("utf-8")
    secret_key = secret_key.encode("utf-8")

    # 填充数据采用pkcs7
    padder = padding.PKCS7(block_size).padder()
    pad_data = padder.update(data) + padder.finalize()

    # 创建密码器
    cipher = Cipher(
        algorithms.AES(secret_key),
        mode=modes.ECB(),
        backend=default_backend()
    )
    # 加密数据
    encryptor = cipher.encryptor()
    encrypted_data = encryptor.update(pad_data)
    return base64.b64encode(encrypted_data).decode()


def aes_decrypt(secret_key, data):
    """解密数据
    """
    secret_key = secret_key.encode("utf-8")
    data = base64.b64decode(data)

    # 创建密码器
    cipher = Cipher(
        algorithms.AES(secret_key),
        mode=modes.ECB(),
        backend=default_backend()
    )
    decryptor = cipher.decryptor()
    decrypt_data = decryptor.update(data)
    unpadder = padding.PKCS7(block_size).unpadder()
    unpad_decrypt_data = unpadder.update(decrypt_data) + unpadder.finalize()
    return unpad_decrypt_data.decode("utf-8")


if __name__ == '__main__':
    key = "22a1d4c4263e83d7f8c33a321eb19ae7"
    data = "asdASD73j8H9k6C1asvhBOK0PXOzJM7dsqXysssW"

    print("原始数据:%s" % data)
    r = aes_encrypt(key, data)
    print("加密数据:%s" % r)
    r = aes_decrypt("22a1d4c4263e83d7f8c33a321eb19ae7", r)
    print("解密数据:%s" % r)

执行结果

上面实现方式也可以用 pycrypto 实现,具体参考:

强调说明

注意block_size单位在cryptography是bit,pycrypto是byte