python CBC AES PKCS7Padding SALT

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 字节长
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值