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

时间:2020-12-06 00:52:59

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


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

  • 温馨提示:

选项

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,特点就是位数长安全性高性能低,反之安全性低性能高。

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

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

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

2.2、查看目录

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

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

2.3、注意点

默认在windows环境下安装,pycryptodome安装的路径如下,

温馨提示,可能在其他环境安装文件夹是小写需要改为大写,正确路径和命名如下,Crypto

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

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)

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

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:无效

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

2)使用不正确长度密钥,提示如下

Incorrect AES key length (19 bytes) AES密钥长度不正确(19字节),正确长度是16和32

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

5、一图总结

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


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


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