使用PyCrypto库进行数据加密与解密的基本步骤如下:
-
安装PyCrypto:
你可以使用pip安装PyCrypto库,但需要注意的是,PyCrypto已经不再维护,建议使用其替代库PyCryptodome。pip install pycryptodome
-
导入库:
导入必要的模块。 -
生成密钥和初始化向量:
对于对称加密算法(如AES),你需要生成密钥和初始化向量(IV)。 -
加密数据:
使用加密算法加密数据。 -
解密数据:
使用相同的算法和密钥解密数据。
下面是一个使用PyCryptodome库进行AES加密和解密的示例:
AES加密和解密
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
# 生成密钥和初始化向量(IV)
key = get_random_bytes(16) # AES-128需要16字节密钥
iv = get_random_bytes(16) # IV需要与块大小相同,即16字节
# 加密函数
def encrypt(data, key, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
# 数据填充以符合块大小的倍数
padding_length = AES.block_size - len(data) % AES.block_size
data += chr(padding_length) * padding_length
encrypted_data = cipher.encrypt(data.encode('utf-8'))
return base64.b64encode(iv + encrypted_data).decode('utf-8')
# 解密函数
def decrypt(encrypted_data, key):
encrypted_data = base64.b64decode(encrypted_data)
iv = encrypted_data[:16]
encrypted_data = encrypted_data[16:]
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = cipher.decrypt(encrypted_data)
padding_length = decrypted_data[-1]
return decrypted_data[:-padding_length].decode('utf-8')
# 加密数据
data = "Hello, World!"
encrypted_data = encrypt(data, key, iv)
print("Encrypted data:", encrypted_data)
# 解密数据
decrypted_data = decrypt(encrypted_data, key)
print("Decrypted data:", decrypted_data)
解释代码:
-
生成密钥和IV:
key = get_random_bytes(16) iv = get_random_bytes(16)
-
加密数据:
def encrypt(data, key, iv): cipher = AES.new(key, AES.MODE_CBC, iv) padding_length = AES.block_size - len(data) % AES.block_size data += chr(padding_length) * padding_length encrypted_data = cipher.encrypt(data.encode('utf-8')) return base64.b64encode(iv + encrypted_data).decode('utf-8')
这里使用了CBC模式进行AES加密,数据进行了填充以符合块大小的倍数,然后将IV和加密后的数据一起进行Base64编码。
-
解密数据:
def decrypt(encrypted_data, key): encrypted_data = base64.b64decode(encrypted_data) iv = encrypted_data[:16] encrypted_data = encrypted_data[16:] cipher = AES.new(key, AES.MODE_CBC, iv) decrypted_data = cipher.decrypt(encrypted_data) padding_length = decrypted_data[-1] return decrypted_data[:-padding_length].decode('utf-8')
解密时,首先将Base64解码得到IV和加密数据,使用相同的密钥和IV进行解密,最后移除填充字节。
注意事项:
- 密钥管理:确保密钥的安全存储和传输,不要硬编码在代码中。
- 填充方式:示例中使用简单的PKCS7填充方式,可以根据实际需求选择不同的填充方式。
- 错误处理:在实际应用中,需要增加错误处理机制,以应对解密失败等情况。
这样,你就可以使用PyCrypto(PyCryptodome)进行数据加密和解密了。