《Python密码算法例程》
- 一、哈希算法(以MD5为例,虽然MD5安全性存在缺陷,但常用于简单示例)
- 1. 计算字符串的MD5哈希值
- 2. 更安全的哈希算法 - SHA - 256
- 二、对称加密算法(以AES为例)
- 1. AES加密和解密简单示例(需要安装`pycryptodome`库)
- 2. 示例用法
- 三、非对称加密算法(以RSA为例)
- 1. 生成RSA密钥对并进行加密解密(需要安装`cryptography`库)
- 2. 生成密钥对
以下是一些常见的Python密码算法例程:
一、哈希算法(以MD5为例,虽然MD5安全性存在缺陷,但常用于简单示例)
1. 计算字符串的MD5哈希值
import hashlibdef md5_hash(string):m = hashlib.md5()m.update(string.encode('utf-8'))return m.hexdigest()string_to_hash = "password123"
print(md5_hash(string_to_hash))
这个函数将输入的字符串转换为字节串(因为update
方法需要字节串参数),然后计算其MD5哈希值并以十六进制字符串的形式返回。
2. 更安全的哈希算法 - SHA - 256
import hashlibdef sha256_hash(string):sha256 = hashlib.sha256()sha256.update(string.encode('utf-8'))return sha256.hexdigest()input_str = "mysecret"
print(sha256_hash(input_str))
SHA - 256是一种广泛使用的安全哈希算法,用于密码存储等场景。它生成的哈希值长度为256位,相比MD5更难发生碰撞。
二、对称加密算法(以AES为例)
1. AES加密和解密简单示例(需要安装pycryptodome
库)
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64def aes_encrypt(key, plaintext):cipher = AES.new(key, AES.MODE_CBC)padded_plaintext = pad(plaintext.encode('utf-8'), AES.block_size)ciphertext = cipher.encrypt(padded_plaintext)iv = cipher.ivreturn base64.b64encode(iv + ciphertext).decode('utf-8')def aes_decrypt(key, ciphertext):ciphertext_bytes = base64.b64decode(ciphertext)iv = ciphertext_bytes[:AES.block_size]cipher = AES.new(key, AES.MODE_CBC, iv)plaintext_padded = cipher.decrypt(ciphertext_bytes[AES.block_size:])plaintext = unpad(plaintext_padded, AES.block_size).decode('utf-8')return plaintext
2. 示例用法
encryption_key = b'mysecretkey123456'
text_to_encrypt = "This is a secret message"
encrypted_text = aes_encrypt(encryption_key, text_to_encrypt)
print("加密后的内容:", encrypted_text)
decrypted_text = aes_decrypt(encryption_key, encrypted_text)
print("解密后的内容:", decrypted_text)
- 首先,
aes_encrypt
函数中,创建了一个AES加密对象,使用CBC(Cipher - Block Chaining)模式。将明文填充到块大小的整数倍(AES块大小一般为16字节),然后进行加密。初始向量(IV)与密文拼接后进行Base64编码返回。 - 在
aes_decrypt
函数中,先对Base64编码的密文进行解码,提取出IV和真正的密文部分。然后使用相同的密钥和IV创建解密对象,对密文进行解密,最后去除填充并返回明文。
三、非对称加密算法(以RSA为例)
1. 生成RSA密钥对并进行加密解密(需要安装cryptography
库)
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashesdef generate_rsa_key_pair():private_key = rsa.generate_private_key(public_exponent=65537,key_size=2048,backend=default_backend())public_key = private_key.public_key()private_pem = private_key.private_bytes(encoding=serialization.Encoding.PEM,format=serialization.PrivateFormat.PKCS8,encryption_algorithm=serialization.NoEncryption())public_pem = public_key.public_bytes(encoding=serialization.Encoding.PEM,format=serialization.PublicFormat.SubjectPublicKeyInfo)return private_pem, public_pemdef rsa_encrypt(public_key, plaintext):public_key_obj = serialization.load_pem_public_key(public_key,backend=default_backend())ciphertext = public_key_obj.encrypt(plaintext.encode('utf-8'),padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None))return ciphertextdef rsa_decrypt(private_key, ciphertext):private_key_obj = serialization.load_pem_private_key(private_key,password=None,backend=default_backend())plaintext = private_key_obj.decrypt(ciphertext,padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),algorithm=hashes.SHA256(),label=None))return plaintext.decode('utf-8')
2. 生成密钥对
private_key_pem, public_key_pem = generate_rsa_key_pair()
message = "这是一个秘密消息"
encrypted_message = rsa_encrypt(public_key_pem, message)
print("加密后的消息:", encrypted_message)
decrypted_message = rsa_decrypt(private_key_pem, encrypted_message)
print("解密后的消息:", decrypted_message)
generate_rsa_key_pair
函数用于生成RSA密钥对,其中私钥格式为PKCS8,公钥格式为SubjectPublicKeyInfo,都采用PEM编码。rsa_encrypt
函数使用公钥对明文进行加密,采用OAEP(Optimal Asymmetric Encryption Padding)填充方式,结合SHA - 256哈希算法,以增强安全性。rsa_decrypt
函数使用私钥对密文进行解密,同样采用OAEP填充方式和SHA - 256哈希算法,最后将解密后的字节串转换为字符串返回。
这些只是密码算法在Python中的基本示例,在实际应用中,还需要考虑密钥管理、安全存储、性能优化等诸多因素。同时,密码学是一个复杂且敏感的领域,正确使用密码算法对于保障信息安全至关重要。