一、前言

AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个。在日常的开发中,无论是实现前后端的接口数据加密,还是数据传输安全性,都使用了AES加密,本文章将从python的角度去实现AES的加密和解密

二、环境安装

AES的加密方式有很多种,例如ECB、CBC、CTR、OFB、CFB,最常用的是ECB和CBC,本文章侧重从CBC模式来实现加密和解密:

#AES加密环境
import base64
from Crypto.Cipher import  AES

这是需要用到的库,如果报错的情况下

#AES加密环境
#先卸载这些包,防止一些环境问题
pip uninstall crypto
pip uninstall pycryptodome
#在安装
pip install pycryptodome

三、加密

在加密的过程中,我们会经常碰到一个问题,当一串JSON里面有中文又有英文的时候,我们做加密的时候经常会报这样的错
ValueError: Data must be padded to 16 byte boundary in CBC mode
这里面就牵扯到中文和文字符的长度问题,在utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符等于一个字节。gbk编码:一个中文包含繁体字等于二个字节,一个英文字符等于一个字节,不多说,直接上代码

iv='shzxsjicommunity' #偏移量
key='shzxsjicommunity' #密钥
#补足字节方法
def pad(value):BLOCK_SIZE = 16  # 设定字节长度count=len(value)if(count%BLOCK_SIZE !=0):add=BLOCK_SIZE-(count%BLOCK_SIZE)else:add=0text=value+("\0".encode()*add) # 这里的"\0"必须编码成bytes,不然无法和text拼接return text# 将明文用AES加密
def AES_en(data):# 将长度不足16字节的字符串补齐data=pad(data.encode())#注意在这个地方要把传过来的数据编码成bytes,不然还是会报上面说的那个错# 创建加密对象AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))# 完成加密AES_en_str = AES_obj.encrypt(data)# 用base64编码一下AES_en_str = base64.b64encode(AES_en_str)# 最后将密文转化成字符串AES_en_str = AES_en_str.decode("utf-8")return AES_en_strdata="{'test':'我是一个小小的程序员!'}" #测试数据
b=AES_en(data1)
print(f"加密为:{b}") #此写法python3.6以上才支持

输出结果

加密为:6kJuZxX6EUUp9QgeBbDUuHiQznKMQz87GaQxKaVPlVIhwODIKCBcdz70ZhB9PFbp

四、解密

直接上代码
输出结果

def AES_de(data):# 解密过程逆着加密过程写# 将密文字符串重新编码成二进制形式data = data.encode("utf-8")# 将base64的编码解开data = base64.decodebytes(data)# 创建解密对象AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))# 完成解密AES_de_str = AES_de_obj.decrypt(data)# 去掉补上的空格AES_de_str =AES_de_str.strip()# 对明文解码AES_de_str = AES_de_str.decode("utf-8")return AES_de_str.strip(b'\x00'.decode()) #去除特定的空格

我们把加密上面的结果放到解密来,输出结果

data='6kJuZxX6EUUp9QgeBbDUuHiQznKMQz87GaQxKaVPlVIhwODIKCBcdz70ZhB9PFbp'
a=AES_de(data)
print(f"解密为:{a}")

输出结果

解密为:{'name':'我是一个小小的程序员!'}

五、完整代码

# -*- coding: utf-8 -*-
#AES加密
import base64
from Crypto.Cipher import  AESiv='shzxsjicommunity'#偏移量
key='shzxsjicommunity'#密钥
#补足字节方法
def pad(value):BLOCK_SIZE = 16  # 设定字节长度count=len(value)if(count%BLOCK_SIZE !=0):add=BLOCK_SIZE-(count%BLOCK_SIZE)else:add=0text=value+("\0".encode()*add) # 这里的"\0"必须编码成bytes,不然无法和text拼接return text
# 将明文用AES加密
def AES_en(data):# 将长度不足16字节的字符串补齐data=pad(data.encode())# 创建加密对象AES_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))# 完成加密AES_en_str = AES_obj.encrypt(data)# 用base64编码一下AES_en_str = base64.b64encode(AES_en_str)# 最后将密文转化成字符串AES_en_str = AES_en_str.decode("utf-8")return AES_en_strdef AES_de(data):# 解密过程逆着加密过程写# 将密文字符串重新编码成二进制形式data = data.encode("utf-8")# 将base64的编码解开data = base64.decodebytes(data)# 创建解密对象AES_de_obj = AES.new(key.encode("utf-8"), AES.MODE_CBC, iv.encode("utf-8"))# 完成解密AES_de_str = AES_de_obj.decrypt(data)# 去掉补上的空格AES_de_str =AES_de_str.strip()# 对明文解码AES_de_str = AES_de_str.decode("utf-8")return AES_de_str.strip(b'\x00'.decode())if __name__=='__main__':data="{'test':'我是一个小小的程序员!'}"b=AES_en(data)print(f"加密为:{b}")#python3.6以上的写法a=AES_de(b)print(f"解密为:{a}")

我们可以通过该网站看自己的加密和解密是否正确:验证.
希望与大家一起学习交流!!!有什么python和go的问题可以私信我

PYTHON实现AES加密,中英文通用!!!相关推荐

  1. 用python实现AES加密解密

    文章目录 背景 测试数据 代码 遗留问题 补充(2021.10.6) 背景 以蓝牙官方协议(V5.0)中的 sample data 为例子,看看怎么用 python 实现 AES 加密和解密. 测试数 ...

  2. Python实现AES加密进行PKCS5Padding的填充

    Python实现AES加密进行PKCS5Padding的填充 (1)Python 需要导入的模块 (2)AES加密代码 (3)AES解密代码 (4)测试代码 (5)测试结果

  3. python aes_python AES 加密

    pad: ZeroPadding mode: cbc #!/usr/bin/env python # -*- coding:utf-8 -*- # 这里使用pycrypto‎库 # 按照方法:easy ...

  4. Python 的AES加密与解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现. python 在 Windows下使用A ...

  5. python post AES加密图片

    AES 加解密 import requests import time import os import json import base64 import cv2 import numpy as n ...

  6. java aes 中文_从Java到Python的AES加密

    我试图对python和java中的一些字符串进行加密和解密,反之亦然,但是当我尝试用java加密和在python中使用相同的密钥解密时,我遇到了问题.在 这是我用来解密java输出的python算法f ...

  7. windows中使用Python进行AES加密解密-文本文件加密工具

    之前的文章http://blog.csdn.net/u013578500/article/details/77905924 简单介绍了一下使用PyCrypto模块实现对字符串的加密解密,里面有提到我利 ...

  8. python 加密解密_python实现AES加密解密

    本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...

  9. python aes加密 cbc_Python实现AES的CBC模式加密和解密过程详解 和 chr() 函数 和 s[a:b:c] 和函数lambda...

    1.chr()函数 chr() 用一个范围在 range(256)内的(就是0-255)整数作参数,返回一个对应的字符. 2.s[a:b:c] s=(1,2,3,4,5) 1>. s[a]下标访 ...

最新文章

  1. 一文看尽目标检测:从YOLO v1到v3的进化之路
  2. mysql里concat什么意思_mysql里concat函数和 ‘’|‘’ 符号一起用是表示什么?
  3. java九种数据类型以及封装类
  4. (56)FPGA条件选择有优先级(case)
  5. java拦截器_springMVC入门(八)------拦截器
  6. 销售行业转行软件测试,这是我成功的感受...
  7. 4 合并grid列_在 Power BI Desktop 中合并数据
  8. iOS开发中常用的宏
  9. SpringBoot(十七)_springboot跨域处理
  10. GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
  11. 原生 js 生成二维码
  12. 测绘地物的识别:建筑上怎么样区别挑廊、走廊、檐廊
  13. scrapy手工识别验证码登录超星泛雅
  14. python 知乎 合并 pdf_有什么比较好的 PDF 分割、合并软件?
  15. android 手势识别,Android实现Gesture手势识别用法分析
  16. 数据分析师前景如何,需要学习什么技能?
  17. rockchip研讨会_地下在线研讨会6
  18. 神话是这样打破的-南阳理工学院
  19. 基于JAVA网上蛋糕订购系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  20. PMP考试都是什么题?

热门文章

  1. 常见化学物质有哪些?常见化学物质化学式
  2. 前端:a 鼠标悬浮变小手
  3. 关于这第一篇文字性的东西
  4. Vijous系列(1)LIS 最长不下降子序列的应用
  5. 3dmax怎么建模眼镜盒模型_ 3dmax盒子建模过程 小白教程
  6. python random库画多彩蟒蛇,Python Turtle库绘制蟒蛇
  7. python蟒蛇编程_蟒蛇(Python)——欧美最容易学习的编程语言
  8. 测开/测试面经(个人)
  9. vfifo控制mig_已解决: 使用MIG例子工程操作DDR3 - Community Forums
  10. CSS---z-index