在Python中,实现常见的加密算法可以通过多种方式完成,包括使用内置模块和第三方库。以下是一些常见的加密算法及其Python实现方法:
1. 对称加密
对称加密使用相同的密钥进行加密和解密。常见的对称加密算法包括AES、DES和3DES。
AES加密
AES(高级加密标准)是一种广泛使用的对称加密算法,支持128位、192位和256位密钥长度。在Python中,可以使用PyCryptodome库来实现AES加密。
from Crypto.Cipher import AES
import binascii
# 密钥和初始化向量
key = b'this is a 16 key'
iv = Random.new().read(AES.block_size)
# 创建AES对象
cipher = AES.new(key, AES.MODE_CFB, iv)
# 要加密的数据
data = '南来北往'
# 加密数据
encrypted_data = cipher.encrypt(data.encode())
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
运行
DES加密
DES(数据加密标准)是一种较老的对称加密算法,密钥长度为56位。在Python中,可以使用PyCryptodome库来实现DES加密。
from Crypto.Cipher import DES
import binascii
# 密钥
key = b'abcdefgh'
# 创建DES对象
cipher = DES.new(key, DES.MODE_ECB)
# 要加密的数据
data = 'python spider!'
# 加密数据
encrypted_data = cipher.encrypt(data.encode())
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
3DES加密
3DES(三重数据加密算法)是对DES的改进,通过三次DES加密提高安全性。在Python中,可以使用PyCryptodome库来实现3DES加密。
from Crypto.Cipher import DES3
import binascii
# 密钥
key = b'this is a 16 key'
# 创建3DES对象
cipher = DES3.new(key, DES3.MODE_ECB)
# 要加密的数据
data = '南来北往'
# 加密数据
encrypted_data = cipher.encrypt(data.encode())
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
运行
2. 非对称加密
非对称加密使用一对密钥,公钥用于加密,私钥用于解密。常见的非对称加密算法包括RSA和ECC。
RSA加密
RSA是一种广泛使用的非对称加密算法,基于大素数乘积的难分解性。在Python中,可以使用rsa库来实现RSA加密。
import rsa
# 生成公钥和私钥
(pubkey, privkey) = rsa.generate_keypair(n_length=1024)
# 要加密的数据
data = '南北今天很忙'
# 加密数据
encrypted_data = rsa.encrypt(data.encode(), pubkey)
# 解密数据
decrypted_data = rsa.decrypt(encrypted_data, privkey)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
运行
ECC加密
ECC(椭圆曲线密码学)是一种基于椭圆曲线数学的非对称加密算法,具有更高的安全性和效率。在Python中,可以使用cryptography库来实现ECC加密。
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import serialization
# 生成ECC密钥对
private_key = ec.generate_private_key(ec.SECP256R1())
public_key = private_key.public_key()
# 要加密的数据
data = '南北今天很忙'
# 加密数据
encrypted_data = public_key.encrypt(
data.encode(),
padding.PKCS1v15()
)
# 解密数据
decrypted_data = private_key.decrypt(
encrypted_data,
padding.PKCS1v15()
)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
运行
3. 单向哈希函数
单向哈希函数将任意长度的数据映射为固定长度的哈希值,常用于数据完整性检查和密码存储。常见的哈希算法包括MD5、SHA1、SHA256等。
MD5哈希
MD5是一种较老的哈希算法,生成128位的哈希值。在Python中,可以使用hashlib库来实现MD5哈希。
import hashlib
# 要哈希的数据
data = '这是一个测试'
# 计算MD5哈希
hash_object = hashlib.md5(data.encode())
hex_dig = hash_object.hexdigest()
print('MD5哈希值:', hex_dig)
运行
SHA256哈希
SHA256是一种更安全的哈希算法,生成256位的哈希值。在Python中,可以使用hashlib库来实现SHA256哈希。
import hashlib
# 要哈希的数据
data = '这是一个测试'
# 计算SHA256哈希
hash_object = hashlib.sha256(data.encode())
hex_dig = hash_object.hexdigest()
print('SHA256哈希值:', hex_dig)
运行
4. Base64编码
Base64是一种将二进制数据转换为文本的编码方式,常用于数据传输和存储。在Python中,可以使用base64模块来实现Base64编码和解码。
import base64
# 要编码的数据
data = 'hello world'
# 编码数据
encoded_data = base64.b64encode(data.encode())
# 解码数据
decoded_data = base64.b64decode(encoded_data).decode()
print('Base64编码后的数据:', encoded_data)
print('Base64解码后的数据:', decoded_data)
运行
5. URL编码
URL编码是一种将超出ASCII范围的字符转换为带%的十六进制格式的编码方式。在Python中,可以使用urllib.parse模块来实现URL编码和解码。
from urllib.parse import quote, unquote
# 要编码的数据
data = '南北今天很忙'
# 编码数据
encoded_data = quote(data)
# 解码数据
decoded_data = unquote(encoded_data)
print('URL编码后的数据:', encoded_data)
print('URL解码后的数据:', decoded_data)
运行
6. HMAC加密
HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的认证码,用于验证数据的完整性和真实性。在Python中,可以使用hmac库来实现HMAC加密。
import hmac
import hashlib
# 要加密的数据
data = '这是一个测试'
# 密钥
key = b'123456'
# 计算HMAC
hmac_object = hmac.new(key, data.encode(), digestmod='sha256')
hex_dig = hmac_object.hexdigest()
print('HMAC值:', hex_dig)
运行
7. CBC模式
CBC(Cipher Block Chaining)是一种分组加密模式,通过将前一个块的密文与当前块的明文进行异或操作,提高加密的安全性。在Python中,可以使用PyCryptodome库来实现CBC模式的加密。
from Crypto.Cipher import AES
import binascii
# 密钥和初始化向量
key = b'this is a 16 key'
iv = Random.new().read(AES.block_size)
# 创建AES对象
cipher = AES.new(key, AES.MODE_CBC, iv)
# 要加密的数据
data = '南来北往'
# 加密数据
encrypted_data = cipher.encrypt(data.encode())
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的数据:', binascii.b2a_hex(encrypted_data))
print('解密后的数据:', decrypted_data.decode())
运行
8. ECB模式
ECB(Electronic Codebook)是一种分组加密模式,每个块独立加密,但安全性较低。在Python中,可以使用PyCryptodome库来实现ECB模式的加密。
from Crypto.Cipher import AES
import binascii
# 密钥
key = b'this is a 16 key'
# 创建AES对象
cipher = AES.new(key, AES.MODE_ECB)
# 要加密的数据
data = '南来北往'
# 加密数据
encrypted_data = cipher.encrypt(data.encode())
# 解密数据
decrypted_data = cipher.decrypt(encrypted_data)
print('加密后的数据:', binascii