python3 aes加解密代码,,安装模块python


安装模块

python3.6 -m pip install  pycryptodome 

导入模块

from Crypto.PublicKey import RSAfrom Crypto.Cipher import AESfrom Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHA256

ECB模式

ECB模式是分块进行加密的,可以实现并行加密,但是因为是分别加密的,如果遇到相同的明文,加密之后的密文也是一样的,那么它的安全性就降低了。

import base64from Crypto.Cipher import AESclass 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 decode_bytes(self, text):        aes = self.aes()        return str(aes.decrypt(base64.decodebytes(bytes(            text, encoding='utf8'))).rstrip(b'\0').decode("utf8"))  # 解密if __name__ == '__main__':    aes_test = UseAES("xianyuxuepython")    a = aes_test.encrypt("咸鱼学Python")    print(a)    b = aes_test.decode_bytes(a)    print(b)

CBC模式

CBC模式在加密之前有一个iv向量进行异或操作,进而增加了加密的复杂度。

#!/usr/bin/env python# -*- coding=utf-8 -*-import base64from Crypto.Cipher import AESimport randomdef pkcs7padding(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_textdef pkcs7unpadding(text):    """    处理使用PKCS7填充过的数据    :param text: 解密后的字符串    :return:    """    length = len(text)    unpadding = ord(text[length-1])    return text[0:length-unpadding]def encrypt(key, content):    """    AES加密    key,iv使用同一个    模式cbc    填充pkcs7    :param key: 密钥    :param content: 加密内容    :return:    """    key_bytes = bytes(key, encoding='utf-8')    iv = key_bytes    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)    # 处理明文    content_padding = pkcs7padding(content)    # 加密    encrypt_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))    # 重新编码    result = str(base64.b64encode(encrypt_bytes), encoding='utf-8')    return resultdef decrypt(key, content):    """    AES解密     key,iv使用同一个    模式cbc    去填充pkcs7    :param key:    :param content:    :return:    """    key_bytes = bytes(key, encoding='utf-8')    iv = key_bytes    cipher = AES.new(key_bytes, AES.MODE_CBC, iv)    # base64解码    encrypt_bytes = base64.b64decode(content)    # 解密    decrypt_bytes = cipher.decrypt(encrypt_bytes)    # 重新编码    result = str(decrypt_bytes, encoding='utf-8')    # 去除填充内容    result = pkcs7unpadding(result)    return resultdef get_key(n):    """    获取密钥 n 密钥长度    :return:    """    c_length = int(n)    source = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'    length = len(source) - 1    result = ''    for i in range(c_length):        result += source[random.randint(0, length)]    return resulten_16 = 'abcdefgj10124567'encrypt_en = encrypt(aes_key, en_16)print(encrypt_en)

参考资料

https://www.jianshu.com/p/5d27888e7c93

https://www.cnblogs.com/xuchunlin/p/11421795.html

https://www.zhangkunzhi.com/archives/163

python3 aes加解密代码

评论关闭