Python的一些加密方法及Python加密模块
在Python编程语言中,有多种加密方式和方法可以对数据和信息进行加密,保护信息安全。本文将讲解Python中一些常用的加密方法和加密模块。
常用的加密方法
哈希
哈希是将明文数据转换为一串由数字和字母组成的固定长度的代码,也称为摘要。哈希算法是不可逆的,也就是说,无法从哈希值中还原出原始明文数据。Python中常用的哈希算法模块是hashlib
。
import hashlib
def md5_encode(s: str) -> str:
"""
使用MD5哈希算法对字符串s进行加密
"""
m = hashlib.md5()
m.update(s.encode('utf-8'))
return m.hexdigest()
if __name__ == '__main__':
s = "Hello, World!"
print(f"明文: {s}")
print(f"MD5加密后: {md5_encode(s)}")
对称加密
对称加密是指使用相同密钥进行加密和解密的加密方式。Python中常用的对称加密模块是cryptography
。
from cryptography.fernet import Fernet
def encrypt(s: str, key: bytes) -> bytes:
"""
使用Fernet对称加密算法对字符串s进行加密,key是密钥
"""
f = Fernet(key)
return f.encrypt(s.encode('utf-8'))
def decrypt(ciphertext: bytes, key: bytes) -> str:
"""
使用Fernet对称加密算法对密文进行解密,key是密钥
"""
f = Fernet(key)
return f.decrypt(ciphertext).decode('utf-8')
if __name__ == '__main__':
key = Fernet.generate_key()
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, key)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, key)
print(f"解密后的明文: {plaintext}")
非对称加密
非对称加密是指使用私钥进行加密,使用公钥进行解密,或者使用公钥进行加密,使用私钥进行解密的加密方式。Python中常用的非对称加密模块是pycryptodome
。
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
def generate_key() -> RSA.RsaKey:
"""
生成公私钥对
"""
key = RSA.generate(2048)
return key
def encrypt(s: str, key: RSA.RsaKey) -> bytes:
"""
使用公钥key进行RSA非对称加密
"""
cipher = PKCS1_OAEP.new(key)
return cipher.encrypt(s.encode('utf-8'))
def decrypt(ciphertext: bytes, key: RSA.RsaKey) -> str:
"""
使用私钥key进行RSA非对称解密
"""
cipher = PKCS1_OAEP.new(key)
return cipher.decrypt(ciphertext).decode('utf-8')
if __name__ == '__main__':
private_key = generate_key()
public_key = private_key.publickey()
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, public_key)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, private_key)
print(f"解密后的明文: {plaintext}")
常用的加密模块
cryptography
cryptography
是Python中一个常用的加密模块。它支持多种对称和非对称加密算法,包括AES、Blowfish、RSA和DSA等。cryptography
还支持密码学安全伪随机数生成器、密码哈希函数和密码学证书等。使用该模块可以快速实现各种加密需求。
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
def encrypt(s: str, key: bytes, iv: bytes) -> bytes:
"""
使用AES对称加密算法对字符串s进行加密,key是密钥,iv是初始化向量
"""
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()
return encryptor.update(s.encode('utf-8')) + encryptor.finalize()
def decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> str:
"""
使用AES对称加密算法对密文进行解密,key是密钥,iv是初始化向量
"""
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
decryptor = cipher.decryptor()
return decryptor.update(ciphertext) + decryptor.finalize()
if __name__ == '__main__':
key = b'0123456789abcdef'
iv = b'0123456789abcdef'
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, key, iv)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, key, iv)
print(f"解密后的明文: {plaintext}")
hashlib
hashlib
模块是Python中一个常用的哈希算法模块,支持多种哈希算法,如MD5、SHA1、SHA224、SHA256、SHA384和SHA512等。使用该模块可以方便地实现哈希运算。
import hashlib
def sha256_encode(s: str) -> str:
"""
使用SHA256哈希算法对字符串s进行加密
"""
m = hashlib.sha256()
m.update(s.encode('utf-8'))
return m.hexdigest()
if __name__ == '__main__':
s = "Hello, World!"
print(f"明文: {s}")
print(f"SHA256加密后: {sha256_encode(s)}")
pycryptodome
pycryptodome
是Python中一个常用的加密模块。它是Cryptography及PyCrypto项目的继承者,可以支持多种对称和非对称加密算法,包括AES、Blowfish、RSA和DSA等。pycryptodome
同样支持密码学安全伪随机数生成器、密码哈希函数和密码学证书等。使用该模块可以快速实现各种加密需求。
from Crypto.Cipher import AES
def encrypt(s: str, key: bytes, iv: bytes) -> bytes:
"""
使用AES对称加密算法对字符串s进行加密,key是密钥,iv是初始化向量
"""
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_data = s.encode() + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
ciphertext = cipher.encrypt(padded_data.encode())
return ciphertext
def decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> str:
"""
使用AES对称加密算法对密文进行解密,key是密钥,iv是初始化向量
"""
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_data = cipher.decrypt(ciphertext)
return padded_data.decode().rstrip(chr(AES.block_size - len(padded_data) % AES.block_size))
if __name__ == '__main__':
key = b'0123456789abcdef'
iv = b'0123456789abcdef'
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, key, iv)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, key, iv)
print(f"解密后的明文: {plaintext}")
示例说明
哈希
在示例代码中,我们使用了hashlib
模块中的md5()
函数对字符串进行哈希运算,返回哈希值的16进制表示形式。
import hashlib
def md5_encode(s: str) -> str:
"""
使用MD5哈希算法对字符串s进行加密
"""
m = hashlib.md5()
m.update(s.encode('utf-8'))
return m.hexdigest()
if __name__ == '__main__':
s = "Hello, World!"
print(f"明文: {s}")
print(f"MD5加密后: {md5_encode(s)}")
非对称加密
在示例代码中,我们使用了pycryptodome
模块中的RSA
和PKCS1_OAEP
类实现RSA非对称加密和解密。
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
def generate_key() -> RSA.RsaKey:
"""
生成公私钥对
"""
key = RSA.generate(2048)
return key
def encrypt(s: str, key: RSA.RsaKey) -> bytes:
"""
使用公钥key进行RSA非对称加密
"""
cipher = PKCS1_OAEP.new(key)
return cipher.encrypt(s.encode('utf-8'))
def decrypt(ciphertext: bytes, key: RSA.RsaKey) -> str:
"""
使用私钥key进行RSA非对称解密
"""
cipher = PKCS1_OAEP.new(key)
return cipher.decrypt(ciphertext).decode('utf-8')
if __name__ == '__main__':
private_key = generate_key()
public_key = private_key.publickey()
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, public_key)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, private_key)
print(f"解密后的明文: {plaintext}")
对称加密
在示例代码中,我们使用了cryptography
模块中的Fernet
类实现AES对称加密和解密。
from cryptography.fernet import Fernet
def encrypt(s: str, key: bytes) -> bytes:
"""
使用Fernet对称加密算法对字符串s进行加密,key是密钥
"""
f = Fernet(key)
return f.encrypt(s.encode('utf-8'))
def decrypt(ciphertext: bytes, key: bytes) -> str:
"""
使用Fernet对称加密算法对密文进行解密,key是密钥
"""
f = Fernet(key)
return f.decrypt(ciphertext).decode('utf-8')
if __name__ == '__main__':
key = Fernet.generate_key()
s = "Hello, World!"
print(f"明文: {s}")
ciphertext = encrypt(s, key)
print(f"加密后的密文: {ciphertext}")
plaintext = decrypt(ciphertext, key)
print(f"解密后的明文: {plaintext}")
总结
Python中有多种加密方法和模块可以用于对数据和信息进行加密,保护信息安全。在选择使用加密方法和模块时,应根据实际需求和情况选择合适的方法和模块,确保加密效率和安全性,同时注意保护密钥的安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的一些加密方法及python 加密模块 - Python技术站