首页 > 其他分享 >AES_加密模块

AES_加密模块

时间:2022-11-20 16:58:01浏览次数:52  
标签:AES 加密 模块 text self aes key return

AES_加密模块

参考连接
https://mp.weixin.qq.com/s?__biz=MzIwNDI1NjUxMg==&mid=2651262030&idx=1&sn=9fe47330bad26de7b5025a812aff476d&chksm=8d314821ba46c1375ca4edafd8b1008e0da03824d08b8a40013a89bb2b0c1a43066e5b862ed3&scene=158#rd

环境
pip3 install pycryptodome 
ECB模式
import base64
from Crypto.Cipher import AES

class UseAES:
    """
    AES
    除了MODE_SIV模式key长度为:32, 48, or 64,
    其余key长度为16, 24 or 32
    详细见AES内部文档
    CBC模式传入iv参数
    本例使用常用的ECB模式
    """
    def __init__(self, key):
        if len(key) > 32:
            key = key[:32]
        self.key = self.to_16(key)

    @staticmethod
    def to_16(key):
        """
        转为16倍数的bytes数据
        :param key:
        :return:
        """
        key = bytes(key, encoding="utf8")
        while len(key) % 16 != 0:
            key += b'\0'
        return key  # 返回bytes

    def aes(self):
        return AES.new(self.key, AES.MODE_ECB)  # 初始化加密器

    def encrypt(self, text):
        aes = self.aes()
        return str(base64.encodebytes(aes.encrypt(self.to_16(text))),
                   encoding='utf8').replace('\n', '')  # 加密

    def derypt(self, text):
        aes = self.aes()
        return str(aes.decrypt(base64.decodebytes(bytes(
            text, encoding='utf8'))).rstrip(b'\0').decode("utf8"))  # 解密

    def pkcs7padding(self, text):
        """
        明文使用PKCS7填充
        最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
        :param text: 待加密内容(明文)
        :return:
        """
        bs = AES.block_size  # 16
        length = len(text)
        bytes_length = len(bytes(text, encoding='utf-8'))
        # tips:utf-8编码时,英文占1个byte,而中文占3个byte
        padding_size = length if(bytes_length == length) else bytes_length
        padding = bs - padding_size % bs
        # tips:chr(padding)看与其它语言的约定,有的会使用'\0'
        padding_text = chr(padding) * padding
        return text + padding_text


    def pkcs7unpadding(self, text):
        """
        处理使用PKCS7填充过的数据
        :param text: 解密后的字符串
        :return:
        """
        length = len(text)
        unpadding = ord(text[length-1])
        return text[0:length-unpadding]

if __name__ == '__main__':

    aes_test = UseAES("1234567890123456")		# key

    data = aes_test.pkcs7padding("13961469967")		# 明文使用PKCS7填充
    a = aes_test.encrypt(data)
    print(a)

    b = aes_test.derypt(a)
    print(aes_test.pkcs7unpadding(b))			# 处理使用PKCS7填充过的数据

标签:AES,加密,模块,text,self,aes,key,return
From: https://www.cnblogs.com/startstart/p/16908861.html

相关文章

  • ES6之模块化
    模块化模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。 模块化的好处模块化的优势有以下几点:1)防止命名冲突2)代码复用3)高维护性 模......
  • 非对称加密方式
    一、概念非对称加密方式:使用不同秘钥进行加密解密的是非对称加密方式,使用同一秘钥进行加密解密的是对称加密方式。公钥、私钥:公共的、对外的秘钥称为公钥。私人的,不对外......
  • java RSA加密
    参考了下面这个博主的文章,很有收获,简单处理后记录一下RSA加密、解密、签名、验签的原理及方法-PC君-博客园  工具类自带生成秘钥的方法,也可以用第三方工具生成秘......
  • YOLOV5 train模块写,没验证对错,能跑
    importtorchimporttorch.nnasnnimporttorch.optimasoptimimportdatasetimportmodelsimportnn_utilsclassYoloHead(nn.Module):def__init__(se......
  • Python 基础之wmi模块(windows监控)
    背景:最近学习Python监控系统状态的Psutil模块时。看到很多函数都是针对某些系统(如Linux、FreeBSD )的时就在想,既然有那么多监听系统状态的函数没有兼容win系统那......
  • PHP通过加密计算出短信验证码,无需缓存验证码
    通过加密计算出短信验证码,无需缓存验证码classXixiOtp{private$iKeeptime;//验证码有效期private$sKey;//加密的密钥private$p1Len=1;//验......
  • VUE模块划分
    bg-extend├──src│ ├──App.vue│ ├──api│ │ ├──tenant│ │ │ └──manager.js│ │ └──vote模块名-活动管理接......
  • 黏包现象及struct模块
    目录黏包现象struct模块解决黏包现象黏包代码实操UDP协议(了解)黏包现象黏包现象1.服务端连续执行三次recv2.客户端连续执行三次send执行上述两端的操作,服务端一次性......
  • 同步、异步与阻塞、非阻塞的概念、创建进程的多种方式及multiprocessing模块、进程间
    目录一、同步与异步同步异步二、阻塞与非阻塞阻塞非阻塞三、综合使用1.同步阻塞:2.同步非阻塞:3.异步阻塞:4.异步非阻塞:四、创建进程的多种方式进程的创建multiprocessing模块......
  • IoT物联网无线通信模块该如何选择?
    目前大多数物联网(IoT)的节点都是使用ZigBee技术来进行组网的,然后通过gateway(网关)来连接网络。但是ZigBee模块的优势并不明显,也有很多公司正在开发新的无线模块来代替它,例如lo......