python AES 初探
AES是一个加密算法,…具体我也不清楚,等我搞清楚了再详说…;
代码实现
import base64
import hashlib
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import algorithms
from Crypto.Cipher import AES as _AES
class AES:
def __init__(self):
self.SALT = b'JSKksjskao#llkas'
self.IV = b'aSAMcx4dds3s!1#F'
self.KEY = b'wet&38oid!98ksl'
def pkcs7_padding(self, data, block_size=128):
"""
密码必须满足8的倍数所以需要补位,PKCS7Padding用'\n'补位
:param data:
:param block_size:
:return:
"""
if not isinstance(data, bytes):
data = data.encode('utf-8')
padder = padding.PKCS7(block_size).padder()
return padder.update(data) + padder.finalize()
def generateKey(self):
"""
key加盐
:return:
"""
return hashlib.pbkdf2_hmac(hash_name="sha1", password=self.KEY, salt=self.SALT, iterations=1,
dklen=16)
def encrypt(self, password: str):
"""
aes加密
:param password:
:return:
"""
key = self.generateKey()
padded_data = self.pkcs7_padding(password)
cipher = _AES.new(key, _AES.MODE_CBC, self.IV)
return base64.b64encode(cipher.encrypt(padded_data)).decode()
def decrypt(self, content: str):
"""
aes解密
:param content:
:return:
"""
key = self.generateKey()
cipher = _AES.new(key, _AES.MODE_CBC, self.IV)
content = base64.b64decode(content)
return (cipher.decrypt(content).decode('utf-8')).replace('\n', '')
if __name__ == '__main__':
print(AES().encrypt("123456"))
print(AES().decrypt("HV3NE6KTgGa8JrI12Tf/0w=="))
代码详解
- generateKey:给key加盐,此处根据业务需求而定,具体加盐的算法会有所不同;
- encrypt:加密,使用Crypto库的aes功能没啥可讲的用就完事了;
- decrypt:解密,decrypt进行解密;
- pkcs7_padding:PKCS7Padding补位,此处使用python内置cryptography库的能力,不自己造轮子了,其他补位算法也有,所以大家看情况去用,如果不知道原理的不建议自己写,网上很多自己实现的教程都是错误的!
- SALT:盐值,根据业务需求而定,跟AES算法本身没有关系;上述实例中AES与SALT进行了结合产生了新的化学反应;
IV:对于“MODE_CBC”、“MODE_CFB”和“MODE_OFB”,它的长度必须为 16 个字节。如果没有提供默认会生成一个16位的随机数,可以通过iv属性读取生成的随机数(可以自己实现随机数的生成只要满足位数就行);
KEY:秘钥,它必须是 16、24 或 32 字节长