本文主要介绍如何用Python实现ECB模式的AES加密算法,满足一些数据请求头参数加密或者请求体数据加密的需求。
文章目录
- 场景说明
- 解决方案
- 源代码
我们在进行数据采集的时候,可能会从采集页面转向直接请求网站的定制化接口来直接获取某部分数据,而不是请求整个网站的数据然后解析。
请求数据接口时,网站的反爬机制可能在数据请求头或请求体中进行了数据加密,我们需要使用相同的加密算法对请求头的参数或请求体数据加密后再发送请求,才能成功返回我们要的数据。
通过JS逆向解析出对应的加密算法后,其中一种方式是如果加密算法是常规的加密算法,那么可以使用python
实现后完全使用python
代码进行数据请求。
本篇文章出于在数据采集过程中的实际场景,遇到了在javascript
代码中使用ECB
模式的AES
加密算法同时加密了请求体参数和请求体数据,在分析出加密算法后使用python
实现该加密逻辑并在此记录相关代码(关于AES加密算法相关的密码学内容之后有时间看看是不是有必要补充吧……)。
python
中密码学加密算法相关的库有crypto
,pycryptodome
,cryptography
等等。
crypto
库比较陈旧,数年没有更新,pycryptodome
和cryptography
则是其替代。
这里使用cryptography
来实现。实现AES有几点需要注意:
os.urandom(32)
生成案例使用的key
pad(plaintext)
函数from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from base64 import b64encode
import os
# Generate a random 256-bit key
key = os.urandom(32)
# Create an AES-ECB cipher object with the generated key
cipher = Cipher(algorithms.AES(key), modes.ECB())
# Define a function to pad plaintext to a multiple of the block size
def pad(plaintext):
padder = padding.PKCS7(algorithms.AES.block_size).padder()
return padder.update(plaintext) + padder.finalize()
# Define a function to encrypt plaintext
def encrypt(plaintext):
# Pad the plaintext
padded_plaintext = pad(plaintext)
# Create an encryptor object from the cipher object
encryptor = cipher.encryptor()
# Encrypt the padded plaintext
ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize()
# Return the base64-encoded ciphertext
return b64encode(ciphertext)
# Test the encryption function with some sample plaintext
plaintext = b"T9mqi6rDKgB0urH1EWezHEE7cQ1h5aEqOPaLkVveW2R0jJdqsdmUPSfJyzenqtfo"
ciphertext = encrypt(plaintext)
expected_result = "Y8Y3C6FCRFAAutkzqUv7urr1V6iJzjvRrSxqpTDBPyHAOZBdfRY45DH4JnBfTpcSy82rfGDsBsVh9aI8bbbChTwzQP/+zGb84qEKRKHv+N4="
print(ciphertext.decode("utf-8"))
print(expected_result)
print(ciphertext.decode("utf-8") == expected_result)
好书推荐:
- 流畅的python
- Python编程 从入门到实践 第2版
- Python数据结构与算法分析 第2版
好课推荐:
- 零基础学python
- python核心技术与实战
- python自动化办公实战
写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~