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

写这篇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,特点就是位数长安全性高性能低,反之安全性低性能高。
【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战_第1张图片

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
【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战_第2张图片

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:无效
【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战_第3张图片

2)使用不正确长度密钥,提示如下
Incorrect AES key length (19 bytes)
AES密钥长度不正确(19字节),正确长度是16和32
【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战_第4张图片

5、一图总结

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战_第5张图片

6、推荐阅读

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

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

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

你可能感兴趣的:(python,python)