You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AES无需编码加密整数并直接得到整数形式密文

问题结论

标准AES原生加密接口不支持直接传入整数完成加密并返回整数,但可以通过简单的封装实现你需要的「调用时无需手动做任何编码/解码操作,直接传整数得到整数密文」的效果。


原生接口限制说明

主流Python加密库(PyCryptodome、cryptography等)提供的AES.new(key, mode, iv).encrypt() 方法,入参仅支持字节串类型,直接传入整数会触发类型报错,原生层面没有支持整数输入的实现。

封装实现方案

你可以自行封装一层加密/解密函数,把整数和字节的转换逻辑内置在函数内,调用层完全不需要感知编码解码过程:

  • 加密侧:内部自动把输入的整数转换为对应长度的字节串,完成AES加密后,再把密文字节串转回整数返回
  • 解密侧:内部自动把输入的整数密文转成字节串,完成AES解密后,再把明文字节串转回整数返回

示例代码

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

def aes_encrypt_int(key: bytes, mode: int, iv: bytes, plain_int: int, block_size: int = 16) -> int:
    cipher = AES.new(key, mode, iv)
    # 内置整数转字节逻辑,统一使用大端序,自动对齐字节长度
    plain_bytes = plain_int.to_bytes((plain_int.bit_length() + 7) // 8, byteorder='big')
    cipher_bytes = cipher.encrypt(pad(plain_bytes, block_size))
    # 内置密文字节转整数逻辑
    return int.from_bytes(cipher_bytes, byteorder='big')

def aes_decrypt_int(key: bytes, mode: int, iv: bytes, cipher_int: int, block_size: int = 16) -> int:
    cipher = AES.new(key, mode, iv)
    cipher_bytes = cipher_int.to_bytes((cipher_int.bit_length() + 7) // 8, byteorder='big')
    plain_bytes = unpad(cipher.decrypt(cipher_bytes), block_size)
    return int.from_bytes(plain_bytes, byteorder='big')

调用示例

# 提前准备好AES所需的key、iv、mode参数
key = b"test_key_16_byte"
iv = b"test_iv_16_byte_"
mode = AES.MODE_CBC

# 直接传入整数,直接得到整数密文,无需手动编码
cipher_int = aes_encrypt_int(key, mode, iv, 123456789)
# 解密也直接传入整数密文,直接得到明文整数
plain_int = aes_decrypt_int(key, mode, iv, cipher_int)

注意事项

  • 加密和解密的字节序(byteorder)必须保持一致,上面示例用的是大端序,你也可以根据需求换成小端序,只要两端统一即可
  • 如果是固定长度的整数(比如固定64位整数),可以直接在to_bytes中指定固定长度,不用动态计算长度,稳定性更高

内容的提问来源于stack exchange,提问作者TaihouKai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:15:01