Python vs. JS Crypto 数据加密问题

用 Requests 爬数据的时候发现数据被加密了,以下是JS的加密和解密函数。

function encryptStr(key, encStr) {
  var crypto = require("crypto");
  var cipher = crypto.createCipher("aes-128-ecb", key);
  var crypted = cipher.update(encStr, "utf-8", "hex");
  crypted += cipher.final("hex");
  return crypted;
};

function decryptStr(key, decStr) {
  var crypto = require("crypto");
  var cipher = crypto.createDecipher("aes-128-ecb", key);
  var decrypted = cipher.update(decStr, "hex", "utf-8");
  decrypted += cipher.final("utf-8");
  return decrypted ;
};

请问用 Python Crypto 怎么模拟以上JS函数加密或解密服务器数据。不明白的点:

  1. JS cipher.final 用的是什么补齐方法
  2. Python Crypto 怎么输出 hex

使用Python的Crypto库来实现相同的加密和解密操作

from Crypto.Cipher import AES
import binascii

# 加密函数
def encrypt_str(key, enc_str):
    cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
    padded_data = pad(enc_str.encode('utf-8'), AES.block_size)
    encrypted = cipher.encrypt(padded_data)
    return binascii.b2a_hex(encrypted).decode('utf-8')

# 解密函数
def decrypt_str(key, dec_str):
    cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)
    decrypted = cipher.decrypt(binascii.a2b_hex(dec_str))
    return unpad(decrypted).decode('utf-8')

# 填充函数
def pad(s, block_size):
    padding_size = block_size - len(s) % block_size
    padded_data = s + padding_size * chr(padding_size).encode('utf-8')
    return padded_data

# 取消填充函数
def unpad(s):
    padding_size = s[-1]
    return s[:-padding_size]

# 测试
key = '1234567890123456'
enc_str = 'Hello World!'
enc_data = encrypt_str(key, enc_str)
print(enc_data)
dec_data = decrypt_str(key, enc_data)
print(dec_data)
  • JS中使用的是PKCS7补齐方式,Python中需要自己实现填充和取消填充函数。
  • 在Python中输出十六进制需要使用binascii.b2a_hex()进行转换。

如果回答对您有用,希望你不吝采纳,谢谢