🍦🍦写这篇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不需要加初始值,其他模式都需要加
编号 | 模式 | 说明 |
---|---|---|
1 | ECB Electronic Code Book Mode | 常用的模式之一 不需要加偏移量或初始值 |
2 | CBC Cipher Block Chaining Mode | 常用的模式之一 需要加偏移量或初始值 |
3 | CFB Cipher Feedback Mode | 需要加偏移量或初始值 |
4 | OFB Output Feedback Mode | 需要加偏移量或初始值 |
5 | CTR Counter Mode | 需要加偏移量或初始值 |
6 | PCBC 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#语言的基础,所以很多原理以及解题思路都是想通的!