如何使用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
相关产品推荐
相关产品推荐

