PYTHON实现AES加密,中英文通用!!!

这篇具有很好参考价值的文章主要介绍了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=0
    text=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_str
    
data="{'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  AES


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=0
    text=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_str

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())

if __name__=='__main__':
    data="{'test':'我是一个小小的程序员!'}"
    b=AES_en(data)
    print(f"加密为:{b}")#python3.6以上的写法
    a=AES_de(b)
    print(f"解密为:{a}")

我们可以通过该网站看自己的加密和解密是否正确:验证.
希望与大家一起学习交流!!!有什么python和go的问题可以私信我文章来源地址https://www.toymoban.com/news/detail-519599.html

到了这里,关于PYTHON实现AES加密,中英文通用!!!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32学习记录——SIM900A实现中英文短信发送

    目录 调试 32控制 硬件连接 百度网盘源码  发短信失败大概率跟你的模块供电有关系,由于GSM模块发射信号功率较大,电脑的USB供电电流较小,板子供电不足问题需要外接充电宝供电。(充电宝比电脑USB电流大) 首先用串转USB模块调试。 TEST(UCS2)模式下发送中英文短息,短消

    2023年04月12日
    浏览(61)
  • 微信小程序英文版:实现一键切换中英双语版(已组件化)

    已经重新优化代码做成了组件,需要可自取:https://github.com/CrystalCAI11/wechat-language-compoment 所有操作都打包在组件里不需要在额外的地方添加代码,直接在你需要的页面里导入组件,再在对应页面的onLoad()里set文本就行了。 第一步,找个地方新建中英文两个字典,我是放在ut

    2024年04月17日
    浏览(60)
  • Qt利用VCPKG和CMake和OpenCV和Tesseract实现中英文OCR

      今天看 OpenCV 方面的教程,pdf 格式的,因为一些强迫症的习惯,喜欢添加一些书签,手动是不太愿意的,自然就想到利用OCR来实现。   想要自己编码实现OCR,方案比较简单就是 Tesseract 。单独使用 Tesseract 也可以,但最好利用 OpenCV 来进行图像方面的处理,一大堆方法可

    2024年02月05日
    浏览(54)
  • 全网最详细中英文ChatGPT-GPT-4示例文档-食谱智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示例 curl命令示例 json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流,

    2023年04月10日
    浏览(42)
  • Vray中英文对照

    渲染元素,中英文对照表 【英文】 【中文翻译】 VRayAlpha VRay Alpha VRayAO VRay AO VRayDRBucket VRay DR 渲染块 VRayMtlReflectIOR VRay Mtl 反射IOR VRayMtlReflectHilightGlossiness VRay Mtl 反射高光光泽度 VRayMtlReflectGlossiness VRay Mtl 反射光泽度 VRayMtlRefractGlossiness VRay Mtl 折射光泽度 VRayZDepth VRay Z 深度 VR

    2024年02月05日
    浏览(63)
  • Qt 动态中英文切换

            需要界面实现动态国际化,一键点击切换中英文或其他语言。         已经完成了整个界面的翻译,拿到匹配的ts翻译文件,注意:要保证界面切换后,翻译的全覆盖,要保证任何需要反应的地方,都用到了tr(\\\"\\\")包含,不然Linguist会捕捉不到。.ts文件的生成参考下文

    2024年02月10日
    浏览(81)
  • 全网最详细中英文ChatGPT-GPT-4示例文档-智能聊天机器人从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示例 curl命令示例 json格式示例 其它资料下载 ChatGPT是目前最先进的AI聊天机器人,它能够理解图片和文字,生成流畅和有趣的回答。如果你想跟上AI时代的潮流,

    2023年04月11日
    浏览(56)
  • 汽车研发与制造中英文对照

    FPDS(Ford Product Development System)福特产品开发系统 threetype chassis 三类底盘 inter-citybus 长途客车 PassengerVehicle 乘用车 MPV(Multi-PurposeVehicle)多用途汽车 SUV(Sports Utility Vehicle) 运动型多用途车 four-wheeldrive 四轮驱动 front-wheeldrive 前轮驱动 DFA-Design For Assembly 面向装配的设计 toolb

    2024年02月21日
    浏览(79)
  • 网络安全中英文术语大全

    01享级持久感动(APT) 一种阿络攻击。使用复杂的技术持续对目标 政府和公司进行网络间谍活造或其他咨意活 动。遗常由具有丰富专业知识和大量安渗的 对手进行-通营与民族国家参与者相关。 这些攻击往往来自多个入口点,并且可能使 用多个攻击媒介 《例运,同络攻击,

    2024年02月05日
    浏览(64)
  • 面试算法十问2(中英文)

    算法题 1: 数组和字符串 Q: How would you find the first non-repeating character in a string? 问:你如何找到字符串中的第一个不重复字符? Explanation: Use a hash table to store the count of each character, then iterate through the string to find the first character with a count of one. 解释: 使用哈希表存储每个字符的计

    2024年04月25日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包