「Python|加密算法|场景案例」用Python实现ECB模式的AES加密算法

本文主要介绍如何用Python实现ECB模式的AES加密算法,满足一些数据请求头参数加密或者请求体数据加密的需求。

文章目录

  • 场景说明
  • 解决方案
  • 源代码

场景说明

我们在进行数据采集的时候,可能会从采集页面转向直接请求网站的定制化接口来直接获取某部分数据,而不是请求整个网站的数据然后解析。

请求数据接口时,网站的反爬机制可能在数据请求头或请求体中进行了数据加密,我们需要使用相同的加密算法对请求头的参数或请求体数据加密后再发送请求,才能成功返回我们要的数据。

通过JS逆向解析出对应的加密算法后,其中一种方式是如果加密算法是常规的加密算法,那么可以使用python实现后完全使用python代码进行数据请求。

本篇文章出于在数据采集过程中的实际场景,遇到了在javascript代码中使用ECB模式的AES加密算法同时加密了请求体参数和请求体数据,在分析出加密算法后使用python实现该加密逻辑并在此记录相关代码(关于AES加密算法相关的密码学内容之后有时间看看是不是有必要补充吧……)。

解决方案

python中密码学加密算法相关的库有cryptopycryptodomecryptography等等。
crypto库比较陈旧,数年没有更新,pycryptodomecryptography则是其替代。

这里使用cryptography来实现。实现AES有几点需要注意:

  • 密钥长度需要是256bit,一般是使用固定值,可以在目标网站的代码中找到网站使用的具体密钥。这里使用os.urandom(32)生成案例使用的key
  • 在AES加密与解密的过程中如果需要加密的数据不是16的倍数的时候,需要对原来的数据做padding操作,所以需要有一个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自动化办公实战

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~

你可能感兴趣的:(给程序员看的python教程,python,python,爬虫,javascript,密码学)