【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

news2024/9/22 9:32:28

🍦🍦写这篇AES文章也是有件趣事,有位小伙伴发了段密文,看看谁解密速度快,学过Python的小伙伴一下子就解开来了,内容也挺有趣的。
🍟🍟原来加解密也可以这么有趣,虽然看起来很枯燥!

目录

  • 1、认识AES
    • 1.1、全称
    • 1.2、简介
    • 1.3、对称加密
    • 1.4、密钥
    • 1.5、加密函数
    • 1.6、解密函数
    • 1.7、非对称加解密
    • 1.8、简单结构说明
    • 1.9、加密模式
  • 2、基础信息
    • 2.1、安装模块
    • 2.2、查看目录
    • 2.3、注意点
    • 2.4、进制转换
  • 3、加解密
    • 3.1、加密代码
    • 3.2、解密代码
  • 4、常见情况
  • 5、一图总结
  • 6、推荐阅读

【🍬挑战谁最快解密这个密文🍬】

  • 温馨提示:
选项
AES加密模式CBC
填充pkcs
数据块128位
密码my_python_key_20230220ABC_ComeOn
偏移量python1234567890
输出hex
字符集uft编码(unicode编码)

【加密串:a5e83e3ad027dd2ce1f57a85cfb170f423f569cad3307b7766ea586c9b8c02725f5771664b25c1205f14567f04f906f5095dae85ee241c14fdc188cbe9e6425c3267a10d95b1f6ec63dff96dd519a06e0e6f0ea1c906dd79902cdd57517658d00cd5a5fe93b782582c7968f9b917495af50c7376dc9157fce048db2b72ddcf1deda7f66658fadb50f7cee0b024b2ad0c】

1、认识AES

1.1、全称

Advanced Encryption Standard,高级加密标准

1.2、简介

AES,是一种最常见的对称加密算法。
它的特点是分组加密,每一组是16字节,是目前主流的高级加密算法

1.3、对称加密

对称加密算法使用了相同的密钥进行加密和解密,它的特点就是速度快计算量小,是最常用的加密方式以及各种安全技术应用的基础

1.4、密钥

密钥支持16位和32位,必须正确设置长度,否则会报错。
加密和解密使用的密钥都是相同的,所以在实际使用时,传输肯定是密文,密钥是不允许传输,只有接收方和发送方知道密钥。
如果实在需要把密文也要在网络上传输,那么就需要通过非对称加密方式加密密钥。否则泄露密钥,那密文就毫无保密作用。

1.5、加密函数

设密钥为Key,明文为Plaintext,密文Ciphertext,加密函数名Encryption,函数如下
C=E(K,P)

1.6、解密函数

设密钥为Key,明文为Plaintext,密文Ciphertext,解密函数名Decrypt,函数如下
P=D(K,C)

1.7、非对称加解密

和对称加解密算法相反,它是使用了不同的密钥进行加解密,它的特点就是速度非常慢破解难度大,适合网络上偶尔临时传输。
它常见的算法有RSA、ECC和EIGamal

1.8、简单结构说明

除了第一轮加密,其他轮次都是循环加密
AES支持的长度:128、192、256,AES128/AES192/AES256,特点就是位数长安全性高性能低,反之安全性低性能高。
在这里插入图片描述

1.9、加密模式

ECB模式和CBC模式是最常用的两种模式,除了ECB不需要加初始值,其他模式都需要加

编号模式说明
1ECB
Electronic Code Book Mode
常用的模式之一
不需要加偏移量或初始值
2CBC
Cipher Block Chaining Mode
常用的模式之一
需要加偏移量或初始值
3CFB
Cipher Feedback Mode
需要加偏移量或初始值
4OFB
Output Feedback Mode
需要加偏移量或初始值
5CTR
Counter Mode
需要加偏移量或初始值
6PCBC
Propagating Cipher Block Chaining Mode
需要加偏移量或初始值

🏆🏆 原则:Write Less Do More!
🍎🍎简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!

2、基础信息

2.1、安装模块

安装pycryptodome模块,
由于pycrypto模块为第三方库,已经停止多年不更新和维护了,这个时候pycryptodome模块就来了,它是之前模块的扩展,用法和之前一样。

# 运行如下命令安装
pip install pycryptodome

# 如下方式引用
from Crypto.Cipher import AES

在这里插入图片描述

2.2、查看目录

查看Python安装目录,
由于小编这里用的是VS开发工具,默认安装的Python路径为如下目录
具体查看Python版本,可以浏览点击此篇文章【python】基础学习系列之查看版本(1)

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python39_64

2.3、注意点

默认在windows环境下安装,pycryptodome安装的路径如下,
温馨提示,可能在其他环境安装文件夹是小写需要改为大写,正确路径和命名如下,Crypto
在这里插入图片描述

2.4、进制转换

1)binascii.b2a_hex
将字符串转为十六进制,得到的字符串是是原数据长度的两倍,如下

  • 引用方式一
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-09

import binascii

a = 'Python'
print("a字符串值:",a)

# 字符串转为十六进制
b = binascii.b2a_hex(a.encode()) #注意:这里需要转换为编码格式,否则报错
print("b字符串值:",b)

  • 引用方式二
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-10

from binascii import b2a_hex

a = 'Python'
print("a字符串值:",a)

# 字符串转为十六进制
b = b2a_hex(a.encode()) #注意:这里需要转换为编码格式,否则报错
print("b字符串值:",b)

在这里插入图片描述

2)binascii.a2b_hex

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-10

from binascii import a2b_hex

a = b'507974686f6e'
print("a十六进制串:",a)

# 十六进制转为字符串
c = a2b_hex(a.decode())
print("c字符串值:",c)

在这里插入图片描述

3、加解密

3.1、加密代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-02-20
 
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
 
code='utf-8'
offset=b'python1234567890'  # 字节
mykey='my_python_key_20230220ABC_ComeOn'
key = mykey.encode(code)
mode = AES.MODE_CBC
 
# 加16位
def addTo16(txt):
    if len(txt.encode(code)) % 16:
        add = 16 - (len(txt.encode(code)) % 16)
    else:
        add = 0
    txt = txt + ('\0' * add)
    return txt.encode(code)

# 加密数据函数
def encryptData(text):
    # Incorrect AES key length (15 bytes)
    text = addTo16(text)
    cryptos = AES.new(key, mode,offset)
 
    cipher_text = cryptos.encrypt(text)
    return b2a_hex(cipher_text)
 
# 程序入口
if __name__ == '__main__':
    # 加密
    text="My Name is Python"
    encryptStr = encryptData(text)
  
    print("明文字符串:", text)                            
    print("加密串数据:", encryptStr)

3.2、解密代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# 2023-03-09
 
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
 
code='utf-8'
offset=b'python1234567890'  # 字节
mykey='my_python_key_20230220ABC_ComeOn'    # 支持16位和32位长度
key = mykey.encode(code)
mode = AES.MODE_CBC
 
# 加16位
def addTo16(txt):
    if len(txt.encode(code)) % 16:
        add = 16 - (len(txt.encode(code)) % 16)
    else:
        add = 0
    txt = txt + ('\0' * add)
    return txt.encode(code)
 
# 解密数据函数
def decryptData(text):
    cryptor = AES.new(key, mode,offset)
    plain_text = cryptor.decrypt(a2b_hex(text))
    return bytes.decode(plain_text).rstrip('\0')
     
# 程序入口
if __name__ == '__main__':
    # 加密串
    text="06a9c834a3fa7a9774a0e0e319226f7f"
    # 解密串
    decryptStr = decryptData(text)                                 
    print("加密串数据:", text)
    print("解密串数据:", decryptStr)

4、常见情况

1)使用16位长度密钥解析32位长度密文会报错,提示如下
‘utf-8’ codec can’t decode byte 0x82 in position 2: invalid
“utf-8”编解码器无法解码位置2中的字节0x82:无效
在这里插入图片描述

2)使用不正确长度密钥,提示如下
Incorrect AES key length (19 bytes)
AES密钥长度不正确(19字节),正确长度是16和32
在这里插入图片描述

5、一图总结

在这里插入图片描述

6、推荐阅读

编号文章标题
1【Python】输入一个整数n,1<=n<=10,输出一个n层的特定三角形
2【华为OD机试题】字符串消消乐
3【Python】使用bs4的
4【Python】输入一段字母字符串
5【Python】编写代码实现指定下标值顺序进行正序和倒序排序算法编程

【挑战谁最快解密这个密文:a5e83e3ad027dd2ce1f57a85cfb170f45d5ce9f8e29dfb18c6fbaab26ee56e980c8da839cb63fd9620107bd19b9cb8336ebc43052aad19784ceb8e32839a9ecfb1f12730541f40e58aab9017b2fdec1e1bcb17e8de4a417323f56ffc50e0d13c3651b032bbcf1fe1294142f76b322652381f86fa0d60069ccfda5cc720270f2199f2e1cfed559c9766d580fba2386a8a2873c82ee752befbea04c66e8b8574653e611ee7d423b409ea238448639a17d1f4bec72dde1f2cc6a6b1a6c627700a28】

🍹🍹不管多忙,都要抽出时间来写博客,沉淀一些经验和感受!欢迎小伙伴交流学习,技术碰撞,也欢迎小伙伴加入小5的个人圈,分享个人十年经验和答疑解惑!
学习Python也有一年多了,个人的学习方式比较注重实在,因为有C#语言的基础,所以很多原理以及解题思路都是想通的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/401214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【专项训练】字典树和并查集

字典树和并查集 二叉搜索树查询效率更高 前缀推后面,这种情况怎么办,选什么数据结构呢 每个节点不存单词本身!他只存到下一个路径上面,这个路径代表的字符! Trie树是多叉树! 任何一个节点,他代表的单词是走过的这条边 统计频次 208. 实现 Trie (前缀树)

ViewBinding 和 DataBinding的使用

1.ViewBinding:视图绑定 通过视图绑定功能&#xff0c;您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后&#xff0c;系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。在大多数情况下&…

容器方式搭建免费的表白网站--阿狸心图--背景音乐《英文歌》(2023.310更新)

效果图 源码 源文件:https://download.csdn.net/download/zhanremo3062/87554456 目录结构 ├── ali2 │ ├── css │ │ └── all.min.css │ ├── fonts │ │ └── RuiHeiXiTi.otf │ ├── img │ │ ├── 14915.jpg . . . │ ├── index.html │ ├──…

【JVM】字节码指令

文章目录1. 方法的执行流程1.1 常量池载入运行时常量池1.2 方法字节码载入方法区1.3 main线程开始运行&#xff0c;分配栈帧内存1.4 执行引擎开始执行字节码2. 条件判断2.1 源码分析3. 循环控制指令3.1 源码分析1. 方法的执行流程 原始Java代码 public class Demo3_1 {public…

vue el-switch 列表开关状态显示有误 全部关闭的问题

后台使用int类型传状态status的值 但是前端列表展示的开关状态是未开启&#xff0c;实际上&#xff0c;后台传的都是开启的状态 结果应该是这样 确定后台传的status值 在 el-switch 标签中是否使用了正确的值判断&#xff0c;比如 后台用的是字符串、布尔 或者是 数值类型&…

2-7 SpringCloud快速开发入门: Eureka 注册中心高可用集群搭建

接上一章节Eureka 服务注册中心发现与消费服务&#xff0c;这里讲讲Eureka 注册中心高可用集群搭建 Eureka 注册中心高可用集群搭建 Eureka 注册中心高可用集群就是各个注册中心相互注册 Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己&#xff0c…

LeetCode——203. 移除链表元素

对于初学链表的学者来学&#xff0c;链表是比较困难的&#xff0c;这部分对指针结构体的要求比较高。我们通过练习是掌握知识的重要途经203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;我们在数组中去除某元素是遍历一遍数组&#xff0c;如果某位置是要去除的元素&a…

[Linux]应用部署部分流程命令备忘

备忘一下常用的Linxu应用部署命令&#xff0c;Java应用版。 目录1、环境查询1.1、端口占用查询1.2、环境变量查询与设置设置局部用户定义变量设置全局环境变量删除环境变量2、执行命令保存日志并查看3、查看java应用内存使用情况1、环境查询 1.1、端口占用查询 lsof -i 命令 …

leetcode-每日一题-2379(简单,字符串)

久违的简单题......给你一个长度为 n 下标从 0 开始的字符串 blocks &#xff0c;blocks[i] 要么是 W 要么是 B &#xff0c;表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。给你一个整数 k &#xff0c;表示想要 连续 黑色块的数目。每一次操作中&#xff0c;你可以选择…

NGINX学习笔记(三):一篇搞懂NGINX的常用配置之LOCATION指令

写在前面 NGINX主配置文件 /etc/nginx/nginx.conf 是一个纯文本类型的文件&#xff0c;整个配置文件是以区块的形式组织&#xff0c;通常每一个区块以一对大括号{}来表示开始与结束。 提示&#xff1a;若编译安装则nginx.conf 位于编译时所指定目录。 我是手动编译安装的&…

【LeetCode】剑指 Offer(20)

目录 题目&#xff1a;剑指 Offer 38. 字符串的排列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 38. 字符串的…

一文读懂无线信道传播的各种特性

通过无线信道传播的信号沿着大量不同的路径到达目的地&#xff0c;这些不同路径称为多径。图 1 是一位沿公路驾车的典型移动用户的图形。该图描述了从发射机到接收机的众多信号路径中的三条。这些路径源自环境中物体对辐射能的散射、反射和衍射或者媒介中的折射。各种传播机制对…

mac系统手册(帮助/说明)

文章目录1. mac自带的帮助文档2. Mac使用技巧&#xff08;提示&#xff09;2.1 聚焦搜索2.2 截图&#xff08;录制屏幕&#xff09;2.3 调出右键菜单2.4 快速查看2.5 翻译2.5.1 词典解释2.5.2 翻译&#xff08;字、词和句&#xff09;3. macOS使用手册3.1 在聚焦中进行计算和转…

C51---串口发送字符串

1.Code: #include "reg52.h" #include "intrins.h" sfr AUXR 0x8E; void UartInit(void) //9600bps11.0592MHz { PCON & 0x7F; //波特率不倍速 SCON 0x50; //8位数据,可变波特率 AUXR & 0xBF; //定时器…

100种思维模型之认知资源思维模型-030

我们常说&#xff0c;一个人永远也赚不到自己认知以外的钱&#xff0c;这话的确很有道理&#xff0c;被无数人所推崇。 由此&#xff0c;不难看出&#xff0c;认知在我们的生活起着多么关键的作用。 你的认知层次越高&#xff0c;范围越广&#xff0c;就意味着你这个人所处的阶…

SpringMVC程序开发

目录 SpringMVC 1、MVC定义 2、MVC和SpringMVC之间的关系 学SpringMVC 1、Spring MVC的创建和连接 浏览器获取前端接口和后端程序连接功能实现 2、获取参数 2.1、传递单个参数/多个参数 2.2、传递对象 2.3、传递表单参数 2.4、后端参数重命名 2.5、RequestBody接收J…

postgres源码解析52 磁盘管理器--1

简介 postgres中的磁盘管理器SMGR对外提供了管理磁盘介质的接口&#xff0c;其主要实现在md.c文件中。磁盘管理器并非对磁盘上的文件直接进行操作&#xff0c;而是通过VFD机制进行文件操作。凡是对存储在磁盘中的表进行访问操作均会与磁盘管理器打交道&#xff0c;由它进行统一…

145页企业数字化转型大数据湖项目建设和运营综合解决方案WORD

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用。部分资料内容&#xff1a; 2 需求分析 2.1功能需求 数据湖的应用、管控、展示为一体&#xff0c;提供标准的服务和数据接口和报表展现方式。数据湖数据采用高效&#xff0c;可靠的存储架构。企业业务数据制订…

【0基础学爬虫】爬虫基础之网页基本结构

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

不用vdom的lit框架学习1:安装和编译

上一篇文章讲了我们不得不在部分页面将vuepress换用其他框架的原因&#xff0c;这里我们用了一个新的&#xff0c;号称轻量级的lit框架。 主要原因&#xff1a; 1&#xff09;我们只是部分页面使用&#xff0c;不要要太重的 2&#xff09;vite默认创建有这个选项…… 我们依…