PYTHON实现AES加密,中英文通用!!!
一、前言
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加密,中英文通用!!!相关推荐
- 用python实现AES加密解密
文章目录 背景 测试数据 代码 遗留问题 补充(2021.10.6) 背景 以蓝牙官方协议(V5.0)中的 sample data 为例子,看看怎么用 python 实现 AES 加密和解密. 测试数 ...
- Python实现AES加密进行PKCS5Padding的填充
Python实现AES加密进行PKCS5Padding的填充 (1)Python 需要导入的模块 (2)AES加密代码 (3)AES解密代码 (4)测试代码 (5)测试结果
- python aes_python AES 加密
pad: ZeroPadding mode: cbc #!/usr/bin/env python # -*- coding:utf-8 -*- # 这里使用pycrypto库 # 按照方法:easy ...
- Python 的AES加密与解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现. python 在 Windows下使用A ...
- python post AES加密图片
AES 加解密 import requests import time import os import json import base64 import cv2 import numpy as n ...
- java aes 中文_从Java到Python的AES加密
我试图对python和java中的一些字符串进行加密和解密,反之亦然,但是当我尝试用java加密和在python中使用相同的密钥解密时,我遇到了问题.在 这是我用来解密java输出的python算法f ...
- windows中使用Python进行AES加密解密-文本文件加密工具
之前的文章http://blog.csdn.net/u013578500/article/details/77905924 简单介绍了一下使用PyCrypto模块实现对字符串的加密解密,里面有提到我利 ...
- python 加密解密_python实现AES加密解密
本文实例为大家分享了python实现AES加密解密的具体代码,供大家参考,具体内容如下 (1)对于AES加密解密相关知识 (2)实现的功能就是输入0-16个字符,然后经过AES的加密解密最后可以得到原 ...
- 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]下标访 ...
最新文章
- 一文看尽目标检测:从YOLO v1到v3的进化之路
- mysql里concat什么意思_mysql里concat函数和 ‘’|‘’ 符号一起用是表示什么?
- java九种数据类型以及封装类
- (56)FPGA条件选择有优先级(case)
- java拦截器_springMVC入门(八)------拦截器
- 销售行业转行软件测试,这是我成功的感受...
- 4 合并grid列_在 Power BI Desktop 中合并数据
- iOS开发中常用的宏
- SpringBoot(十七)_springboot跨域处理
- GAN里面的Kullback-Leibler Divergence和Jensen–Shannon Divergence
- 原生 js 生成二维码
- 测绘地物的识别:建筑上怎么样区别挑廊、走廊、檐廊
- scrapy手工识别验证码登录超星泛雅
- python 知乎 合并 pdf_有什么比较好的 PDF 分割、合并软件?
- android 手势识别,Android实现Gesture手势识别用法分析
- 数据分析师前景如何,需要学习什么技能?
- rockchip研讨会_地下在线研讨会6
- 神话是这样打破的-南阳理工学院
- 基于JAVA网上蛋糕订购系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
- PMP考试都是什么题?
热门文章
- 常见化学物质有哪些?常见化学物质化学式
- 前端:a 鼠标悬浮变小手
- 关于这第一篇文字性的东西
- Vijous系列(1)LIS 最长不下降子序列的应用
- 3dmax怎么建模眼镜盒模型_ 3dmax盒子建模过程 小白教程
- python random库画多彩蟒蛇,Python Turtle库绘制蟒蛇
- python蟒蛇编程_蟒蛇(Python)——欧美最容易学习的编程语言
- 测开/测试面经(个人)
- vfifo控制mig_已解决: 使用MIG例子工程操作DDR3 - Community Forums
- CSS---z-index