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
变量中。
对称加密算法有很多种,例如 AES
、DES
、RC4
等。在示例代码中,我们使用了 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()
方法,并同样指定解密算法和填充方式。
非对称加密算法有很多种,例如 RSA
、DSA
。在示例代码中,我们使用了 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
变量中。
常用的消息摘要算法有 SHA256
、SHA512
、MD5
等。在示例代码中,我们使用了 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 内置的哈希函数库,提供了多种哈希算法,例如 MD5
、SHA1
、SHA256
等。该库使用简单方便,可以轻松地计算消息摘要。
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 小结
在本节中,我们介绍了三个常用的加密解密库:cryptography
、PyCryptodome
和 hashlib
。这些库提供了丰富的功能,使得我们能够轻松地实现各种加密解密算法和哈希函数。根据实际需求,选择适合的库进行开发。