python crypto

python crypto

python crypto

1. 介绍

在现代信息社会中,数据的安全问题尤为重要。而加密是一种常用的保护数据安全的方法之一。加密可以有效地防止第三方对数据的窃取、篡改和伪造。Python 提供了一系列强大的加密解密库,使得我们能够轻松地在应用程序中实现各种加密算法。本文将详细介绍 Python 中常用的加密解密技术和库。

2. 对称加密

2.1 概述

对称加密是一种使用同一密钥进行加密和解密的加密方法。简单来说,对称加密就是使用一把密钥将明文加密得到密文,再使用同一把密钥将密文解密回明文。

2.2 示例代码

import cryptography
from cryptography.fernet import Fernet

# 生成密钥
key = Fernet.generate_key()

# 创建 Fernet 对象
cipher = Fernet(key)

# 加密明文
plaintext = b"Hello, World!"
ciphertext = cipher.encrypt(plaintext)

# 解密密文
decrypted_text = cipher.decrypt(ciphertext)

print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

2.3 运行结果

明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

2.4 解析

在示例代码中,首先使用 Fernet.generate_key() 方法生成了一把密钥。然后,我们创建了一个 Fernet 对象 cipher,并将生成的密钥传入该对象进行初始化。接下来,我们使用 cipher.encrypt() 方法加密了明文 Hello, World!,并将加密后的结果存储在变量 ciphertext 中。最后,我们使用 cipher.decrypt() 方法将密文解密回明文,并将结果存储在 decrypted_text 变量中。

对称加密算法有很多种,例如 AESDESRC4 等。在示例代码中,我们使用了 Fernet 对称加密算法。Fernet 是一个高级、易用的对称加密算法,基于 AES 算法和 HMAC(加密哈希消息认证码)算法。

3. 非对称加密

3.1 概述

非对称加密也称为公钥加密,使用一对密钥进行加密和解密,其中一个密钥是公开的,称为公钥,另一个密钥是保密的,称为私钥。公钥用于加密数据,私钥用于解密数据。

3.2 示例代码

import cryptography
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

# 生成密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()

# 加密明文
plaintext = b"Hello, World!"
ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 解密密文
decrypted_text = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

3.3 运行结果

明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

3.4 解析

在示例代码中,首先,我们使用 rsa.generate_private_key() 方法生成了一对密钥,其中 public_exponent 表示公钥的指数,而 key_size 表示密钥的长度。接下来,我们通过私钥 private_key 可以获得公钥 public_key

使用公钥进行加密时,我们使用公钥的 encrypt() 方法,同时指定加密算法和填充方式。在示例代码中,我们使用了 OAEP(Optimal Asymmetric Encryption Padding)填充方式和 SHA256 哈希算法。解密时,我们使用私钥的 decrypt() 方法,并同样指定解密算法和填充方式。

非对称加密算法有很多种,例如 RSADSA。在示例代码中,我们使用了 RSA 非对称加密算法。

4. 消息摘要

4.1 概述

消息摘要(又称哈希函数)是一种将任意大小的数据映射为固定大小的数据的函数。它可以将输入的数据生成一段固定长度的唯一表示,用于校验数据的完整性和唯一性。

4.2 示例代码

import cryptography
from cryptography.hazmat.primitives import hashes

# 计算消息摘要
message = b"Hello, World!"
digest = hashes.Hash(hashes.SHA256())
digest.update(message)
hash_value = digest.finalize()

print("原始消息: ", message)
print("消息摘要: ", hash_value)

4.3 运行结果

原始消息:  b'Hello, World!'
消息摘要:  b'...'

4.4 解析

在示例代码中,我们首先创建了一个哈希函数对象 digest,并指定了哈希算法为 SHA256。然后,我们使用 digest.update() 方法向哈希函数对象中输入消息。

最后,我们使用 digest.finalize() 方法获取消息摘要,存储在 hash_value 变量中。

常用的消息摘要算法有 SHA256SHA512MD5 等。在示例代码中,我们使用了 SHA256 消息摘要算法。

5. 对称加密与非对称加密的对比

5.1 强度

对称加密算法具有较高的加密和解密速度,但对密钥的管理要求较高,也不利于密钥的分发。而非对称加密算法相对于对称加密算法而言,加密和解密的速度较慢,但其密钥的管理和分发相对较为容易。

5.2 密钥的数量

对称加密算法只有一个密钥用于加密和解密,这意味着所有的参与者都需要共享同一个密钥。而非对称加密算法则需要一对密钥,一个公钥用于加密,私钥用于解密。公钥可以公开,私钥必须保密。

5.3 安全性

在对称加密算法中,由于加密和解密使用的是同一密钥,密钥的安全性尤为重要。一旦密钥被泄露,所有的加密数据都会暴露在黑客面前。而非对称加密算法则更安全,因为即使公钥被泄露,也无法推导出私钥。

5.4 应用场景

对称加密算法适用于大量数据传输时,例如在网络通信中保护数据的传输安全。非对称加密算法适用于提供数字签名、身份验证等应用场景。

6. 加密解密库

6.1 cryptography

cryptography 是一个功能强大的加密解密库,它支持对称加密、非对称加密、哈希函数、消息摘要等功能。该库提供了简洁的 API 接口,使用起来非常方便。

6.1.1 安装

使用 pip 安装 cryptography 库:

pip install cryptography

6.1.2 示例代码

import cryptography
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

# 对称加密示例
key = Fernet.generate_key()
cipher = Fernet(key)
plaintext = b"Hello, World!"
ciphertext = cipher.encrypt(plaintext)
decrypted_text = cipher.decrypt(ciphertext)
print("对称加密示例:")
print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

# 非对称加密示例
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
public_key = private_key.public_key()
ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
decrypted_text = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
print("非对称加密示例:")
print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

# 消息摘要示例
message = b"Hello, World!"
digest = hashes.Hash(hashes.SHA256())
digest.update(message)
hash_value = digest.finalize()
print("消息摘要示例:")
print("原始消息: ", message)
print("消息摘要: ", hash_value)

6.1.3 运行结果

对称加密示例:
明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

非对称加密示例:
明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

消息摘要示例:
原始消息:  b'Hello, World!'
消息摘要:  b'...'

6.2 PyCryptodome

PyCryptodome 是一个强大的加密解密库,支持对称加密、非对称加密、哈希函数等功能。该库是基于 pycrypto 开发的,提供了更好的性能和更多的功能。

6.2.1 安装

使用 pip 安装 PyCryptodome 库:

pip install pycryptodome

6.2.2 示例代码

import Crypto
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES, PKCS1_OAEP
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA256

# 对称加密示例
key = Crypto.Random.get_random_bytes(16)
cipher = AES.new(key, AES.MODE_ECB)
plaintext = b"Hello, World!"
data = pad(plaintext, AES.block_size)
ciphertext = cipher.encrypt(data)
decrypted_text = unpad(cipher.decrypt(ciphertext), AES.block_size)
print("对称加密示例:")
print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

# 非对称加密示例
private_key = RSA.generate(2048)
public_key = private_key.publickey()
cipher = PKCS1_OAEP.new(public_key)
ciphertext = cipher.encrypt(plaintext)
cipher = PKCS1_OAEP.new(private_key)
decrypted_text = cipher.decrypt(ciphertext)
print("非对称加密示例:")
print("明文: ", plaintext)
print("密文: ", ciphertext)
print("解密后的明文: ", decrypted_text)

# 消息摘要示例
message = b"Hello, World!"
hash_object = SHA256.new(message)
hash_value = hash_object.digest()
print("消息摘要示例:")
print("原始消息: ", message)
print("消息摘要: ", hash_value)

6.2.3 运行结果

对称加密示例:
明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

非对称加密示例:
明文:  b'Hello, World!'
密文:  b'...'
解密后的明文:  b'Hello, World!'

消息摘要示例:
原始消息:  b'Hello, World!'
消息摘要:  b'...'

6.3 hashlib

hashlib 是 Python 内置的哈希函数库,提供了多种哈希算法,例如 MD5SHA1SHA256 等。该库使用简单方便,可以轻松地计算消息摘要。

6.3.1 示例代码

import hashlib

# 计算消息摘要
message = b"Hello, World!"
hash_object = hashlib.sha256(message)
hash_value = hash_object.digest()
print("原始消息: ", message)
print("消息摘要: ", hash_value)

6.3.2 运行结果

原始消息:  b'Hello, World!'
消息摘要:  b'...'

6.4 小结

在本节中,我们介绍了三个常用的加密解密库:cryptographyPyCryptodomehashlib。这些库提供了丰富的功能,使得我们能够轻松地实现各种加密解密算法和哈希函数。根据实际需求,选择适合的库进行开发。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程