对称加密(AES)
AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个。
常见的对称加密:AES,DES,3DES.我们这里讨论AES。
安装:
Copy Highlighter-hljs
pip install pycryptodome
AES
加密最常用的模式就是CBC
模式和ECB
模式,当然还有很多其它模式,他们都属于AES加密。ECB
模式和CBC
模式俩者区别就是ECB
不需要iv
偏移量,而CBC
需要。
Copy Highlighter-hljs
| 长度 |
| 16:*AES-128* |
| 24: *AES-192* |
| 32:*AES-256* |
| |
| MODE加密模式. |
| 常见的ECB,CBC |
Copy Highlighter-hljs
| ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。 |
| """ |
| ECB 以 16:*AES-128* 算法为例:我们有一个要加密的,就会按照16分割,然后分别加密,再把所有的加密的组合起来 |
| """ |

Copy Highlighter-hljs
| CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或操作后再加密,这样做的目的是增强破解 |
| 难度。 |
| """ |
| CBC:也是分块,第一块加密之后,第一块加密数据与第二块明文做异或 |
| """ |

CBC加密流程
Copy Highlighter-hljs
| import base64 |
| from Crypto.Cipher import AES |
| from Crypto.Util.Padding import pad |
| |
| |
| key = "0123456789123456".encode() |
| iv = "qazwsxedcrfvtgby".encode() |
| |
| aes = AES.new(key, AES.MODE_CBC, iv) |
| |
| |
| data = "xiaoxiaoxiao".encode() |
| |
| pad_data = pad(data, 16) |
| print(pad_data) |
| encrypt_date = aes.encrypt(pad_data) |
| print(encrypt_date) |
| |
| |
| |
| base64_encrypt_date = base64.b64encode(encrypt_date).decode() |
| print(base64_encrypt_date) |
如果加密的是一个字典,在解密的时候就有一个“坑”
Copy Highlighter-hljs
| import base64 |
| from Crypto.Cipher import AES |
| from Crypto.Util.Padding import pad |
| |
| |
| key = "0123456789123456".encode() |
| iv = "qazwsxedcrfvtgby".encode() |
| |
| aes = AES.new(key, AES.MODE_CBC, iv) |
| |
| |
| |
| data = "{'a':1}".encode() |
| |
| pad_data = pad(data, 16) |
| print(pad_data) |
| encrypt_date = aes.encrypt(pad_data) |
| print(encrypt_date) |
| |
| |
| |
| base64_encrypt_date = base64.b64encode(encrypt_date).decode() |
| print(base64_encrypt_date) |
解密
以上面的字典的加密为例,来解密
Copy Highlighter-hljs
| # 此段代码是个半成品 |
| import base64 |
| from Crypto.Cipher import AES |
| |
| base64_encrypt_date = "r3RENyeeiShBgA4kGZiAew==" |
| |
| # (1)base64解码 |
| encrypt_date = base64.b64decode(base64_encrypt_date) |
| print(encrypt_date) # b"\xaftD7'\x9e\x89(A\x80\x0e$\x19\x98\x80{" |
| |
| |
| # (2)解密 |
| # 2.1 确认好解密的参数 |
| key = "0123456789123456".encode() |
| iv = "qazwsxedcrfvtgby".encode() |
| # 2.2 创建AES对象 |
| aes = AES.new(key, AES.MODE_CBC, iv) # key 模式 iv |
| |
| # 2.3 对数据进行解密 |
| data = aes.decrypt(encrypt_date) |
| print(data) # b"{'a':1}\t\t\t\t\t\t\t\t\t" |
| 此时我们的数据有了\t,,,因为我们在数据加密的是不够位数,就补齐的原因,所有要去掉【见下面代码】 |
完整版
Copy Highlighter-hljs
| import base64 |
| from Crypto.Cipher import AES |
| from Crypto.Util.Padding import unpad |
| |
| |
| |
| base64_encrypt_date = "r3RENyeeiShBgA4kGZiAew==" |
| |
| # (1)base64解码 |
| encrypt_date = base64.b64decode(base64_encrypt_date) |
| print(encrypt_date) # b'\x91\x8f\xcb\xcfM\xa8\xbf\xc2\x87\x8b\x1c\x01Y\xb5\x17X' |
| |
| |
| # (2)解密 |
| # 2.1 确认好解密的参数 |
| key = "0123456789123456".encode() |
| iv = "qazwsxedcrfvtgby".encode() |
| # 2.2 创建AES对象 |
| aes = AES.new(key, AES.MODE_CBC, iv) # key 模式 iv |
| |
| # 2.3 对数据进行解密 |
| data = aes.decrypt(encrypt_date) |
| # 2.4 去掉填充 |
| # data = unpad(data, AES.block_size) # AES.block_size 默认就是16 |
| print(data, type(data)) # b"{'a':1}" |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
2021-07-16 python 整数反转
2021-07-16 python 字符串反转