1. AES算法简介

AES算法详解:高级加密标准,它是一种对称加密算法,AES只有一个密钥,这个密钥既用来加密,也用于解密。

AES加密方式有五种:ECB, CBC, CTR, CFB, OFB
安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现。
CBC 和ECB模式的区别就是:

  • CBC加密需要一个十六位的key(密钥)和一个十六位iv(偏移量)
  • ECB加密不需要iv,只需要key(密钥)

2.模块安装

在 Windows下使用AES时要安装的是pycryptodome 模块

pip install pycryptodome 

在 Linux下使用AES时要安装的是pycrypto模块

pip install pycrypto 

3.AES的ECB 模式实现

第一种写法:

import base64
from Crypto.Cipher import AES

"""
ECB没有偏移量
"""
def pad(text):
    """
    #填充函数,使被加密数据的字节码长度是block_size的整数倍
    """
    count = len(text.encode('utf-8'))
    add = 16 - (count % 16)
    entext = text + (chr(add) * add)
    return entext.encode('utf-8')


def add_to_16(text):
    if len(text.encode('utf-8')) % 16:
        add = 16 - (len(text.encode('utf-8')) % 16)
    else:
        add = 0
    text = text + ('\0' * add)
    return text.encode('utf-8')

# 加密函数
def encrypt(text):
    key = '9999999999999999'.encode('utf-8')
    text = add_to_16(text)
    cryptos = AES.new(key=key, mode=AES.MODE_ECB)
    cipher_text = cryptos.encrypt(text)
    msg = str(base64.b64encode(cipher_text), encoding="utf8")
    return msg


# 解密后,去掉补足的空格用strip() 去掉
def decrypt(text):
    key = '9999999999999999'.encode('utf-8')
    mode = AES.MODE_ECB
    cryptor = AES.new(key, mode)
    res = base64.decodebytes(text.encode("utf-8"))
    plain_text = cryptor.decrypt(res).decode("utf-8").rstrip('\0')
    return plain_text


if __name__ == '__main__':
    text = 'happy_new_years_2022'
    res = encrypt(text)  # 加密
    doc_text = decrypt(res)  # 解密
    print("加密前数据:", text)
    print("加密后数据:", res)
    print("数据解密:", doc_text)

运行结果:
在这里插入图片描述
第二种写法:

# -*- coding:utf-8 -*-

import base64
from Crypto.Cipher import AES

class EncryptDate:
    def __init__(self, key):
        self.key = key                              # 初始化密钥
        self.length = 16                            # 初始化数据块大小
        self.aes = AES.new(self.key, AES.MODE_ECB)  # 初始化AES,ECB模式的实例
        self.unpad = lambda date: date[0:-ord(date[-1])]  # 截断函数,去除填充的字符

    def pad(self, text):
        """
        #填充函数,使被加密数据的字节码长度是block_size的整数倍
        """
        count = len(text.encode('utf-8'))
        add = self.length - (count % self.length)
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self, encrData):  # 加密函数
        a = self.pad(encrData)
        res = self.aes.encrypt(a.encode("utf-8"))
        msg = str(base64.b64encode(res), encoding="utf8")
        return msg

    def decrypt(self, decrData):  # 解密函数
        res = base64.decodebytes(decrData.encode("utf-8"))
        msg = self.aes.decrypt(res).decode("utf-8")
        return self.unpad(msg)


if __name__ == '__main__':
    aes_key = "9999999999999999"
    aes_text = "happy_new_years_2022"
    eg = EncryptDate(aes_key.encode("utf-8"))
    encrypt_data = eg.encrypt(aes_text)
    print("明文数据数据:", eg.decrypt(encrypt_data))
    print("加密后数据:", encrypt_data)

3.AES的CBC 模式实现

第一种写法:

import base64
from Crypto.Cipher import AES


# 密钥(key), 密斯偏移量(iv) CBC模式加密

def AES_Encrypt(key, data, vi):
    pad = lambda s: s + (16 - len(s) % 16) * chr(16 - len(s) % 16)
    data = pad(data)
    # 字符串补位
    cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
    encryptedbytes = cipher.encrypt(data.encode('utf8'))
    # 加密后得到的是bytes类型的数据
    encodestrs = base64.b64encode(encryptedbytes)
    # 使用Base64进行编码,返回byte字符串
    enctext = encodestrs.decode('utf8')
    # 对byte字符串按utf-8进行解码
    return enctext


def AES_Decrypt(key, data, vi):
    data = data.encode('utf8')
    res = base64.decodebytes(data)
    # 将加密数据转换位bytes类型数据
    cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8'))
    text_decrypted = cipher.decrypt(res)
    unpad = lambda s: s[0:-s[-1]]
    text_decrypted = unpad(text_decrypted)
    # 去补位
    text_decrypted = text_decrypted.decode('utf8')
    return text_decrypted


if __name__ == '__main__':
    aes_key = '0CoJUm6Qyw8W8jud'
    aes_iv = "9999999999999999"
    data_text = 'dsdadaxdgdfgdfgwer tw4356 45623 462345fas'
    enctext = AES_Encrypt(aes_key, data_text, aes_iv)
    text_decrypted = AES_Decrypt(aes_key, enctext, aes_iv)
    print("原始文本:", data_text)
    print("AES加密后:", enctext)
    print("AES解密后:", text_decrypted)

效果如图:
在这里插入图片描述
第二种写法:

import base64
from Crypto.Cipher import AES

class EncryptDate:
    def __init__(self, key, iv):
        self.key = key.encode("utf-8")                          # 初始化密钥
        self.iv = iv.encode("utf-8")                            # 初始化偏移量
        self.length = 16                                        # 初始化数据块大小
        self.aes = AES.new(self.key, AES.MODE_CBC, self.iv)     # 初始化AES,ECB模式的实例
        # 截断函数,去除填充的字符
        self.unpad = lambda s: s[0:-s[-1]]

    def pad(self, text):
        """
        填充函数,使被加密数据的字节码长度是block_size的整数倍
        """
        count = len(text.encode('utf-8'))
        add = self.length - (count % self.length)
        entext = text + (chr(add) * add)
        return entext

    def encrypt(self, encrData):  # 加密函数
        a = self.pad(encrData)
        res = self.aes.encrypt(a.encode("utf-8"))
        msg = str(base64.b64encode(res), encoding="utf8")
        return msg

    def decrypt(self, decrData):  # 解密函数
        res = base64.decodebytes(decrData.encode("utf-8"))
        msg_text = self.aes.decrypt(res)
        decrypt_text = self.unpad(msg_text).decode('utf8')
        return decrypt_text


if __name__ == '__main__':
    aes_key = "0CoJUm6Qyw8W8jud"
    aes_iv = "9999999999999999"
    text_data = 'dsdadaxdgdfgdfgwer tw4356 45623 462345fas'
    encrypt_data = EncryptDate(aes_key, aes_iv).encrypt(text_data)
    decrypt_data = EncryptDate(aes_key, aes_iv).decrypt(encrypt_data)
    print("原始数据:", text_data)
    print("加密后数据:", encrypt_data)
    print("数据解密:", decrypt_data)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐