from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import constant_time
from cryptography.hazmat.backends import default_backend
import os
import binascii
# ===============================
# AES-192-GCM 加密函数
# ===============================
def aes_192_gcm_encrypt(key: bytes, plaintext: bytes, associated_data: bytes = b""):
"""
使用 AES-192-GCM 进行加密
:param key: 24 字节密钥
:param plaintext: 明文数据
:param associated_data: 附加认证数据(可选)
:return: (nonce, ciphertext, tag)
"""
if len(key) != 24:
raise ValueError("AES-192 需要 24 字节密钥")
# 生成 12 字节随机 nonce(GCM 推荐长度)
nonce = os.urandom(12)
encryptor = Cipher(
algorithms.AES(key),
modes.GCM(nonce),
backend=default_backend()
).encryptor()
# 添加 AAD(可选)
encryptor.authenticate_additional_data(associated_data)
# 执行加密
ciphertext = encryptor.update(plaintext) + encryptor.finalize()
# 返回 nonce、密文、tag
return nonce, ciphertext, encryptor.tag
# ===============================
# AES-192-GCM 解密函数
# ===============================
def aes_192_gcm_decrypt(key: bytes, nonce: bytes, tag: bytes, ciphertext: bytes, associated_data: bytes = b""):
"""
使用 AES-192-GCM 进行解密
:param key: 24 字节密钥
:param nonce: 加密时的随机 nonce
:param tag: GCM 认证标签
:param ciphertext: 密文数据
:param associated_data: 附加认证数据(可选)
:return: plaintext
"""
decryptor = Cipher(
algorithms.AES(key),
modes.GCM(nonce, tag),
backend=default_backend()
).decryptor()
decryptor.authenticate_additional_data(associated_data)
# 执行解密
plaintext = decryptor.update(ciphertext) + decryptor.finalize()
return plaintext
# ===============================
# 示例测试
# ===============================
if __name__ == "__main__":
key_hex = "35FE9BD1DFF7FD1939382935F4AEEF62E2C7895D8F441305"
key = bytes.fromhex(key_hex)
plaintext = b"Hello, AES-192-GCM Encryption!"
aad = b"optional_authenticated_data"
print("原文:", plaintext)
# 加密
nonce, ciphertext, tag = aes_192_gcm_encrypt(key, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext:", ciphertext.hex())
print("Tag:", tag.hex())
# 解密
decrypted = aes_192_gcm_decrypt(key, nonce, tag, ciphertext, aad)
print("解密结果:", decrypted)
# 校验
print("是否一致:", constant_time.bytes_eq(plaintext, decrypted))
PC微信协议之AES-192-GCM算法
AiXed2025-11-17 2:04
相关推荐
正儿八经的少年4 分钟前
redis 的大 key 和热 key 详解AI砖家8 分钟前
多智能体系统实战:架构设计、数据库表设计与 Skill 体系吃饱了得干活29 分钟前
别再手动解析 LLM 输出了!LangChain 四种结构化输出方案对比吃糖的小孩29 分钟前
从只读页面到可控真实探针:我如何给 Owner Console 加手动诊断谷无姜29 分钟前
为什么你的性能优化无效?可能是"木桶效应"在作祟ikun_文33 分钟前
Python进阶—函数编程雾非雾33 分钟前
《基于具身交互智能数字人技术:如何打造AI数字人宣讲平台"红厅智播”》MC皮蛋侠客37 分钟前
uv 系列(三):依赖、锁文件与环境同步——可重复构建的核心量化吞吐机39 分钟前
2026年交易想法转Python,中间先补规则转译夜雪一千39 分钟前
MySQL查询条件的顺序是否影响查询效率