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

自定义Python加密库TextEncS类单元测试断言错误求助

问题排查与解决

核心问题分析

AES EAX模式的正确使用依赖**唯一nonce(随机数)**完成加密解密的上下文匹配:

  • 加密时AES会自动生成一个nonce,该值必须与密文、标签一同传递给解密环节
  • 当前代码的两个致命错误:
    1. encrypt方法仅返回ciphertext和tag,丢失了加密时生成的关键nonce
    2. decrypt方法错误地将tag当作nonce传入AES初始化函数,导致解密上下文完全不匹配,无法还原原始明文

修复步骤

1. 修正TextEncS类的加密解密逻辑

修改方法接口,补充nonce的传递,并使用更安全的decrypt_and_verify方法自动验证标签合法性:

class TextEncS:
    """ symmetric text encryption """

    def __init__(self, key):
        self.key = key

    def encrypt(self, plaintext):
        cipher = AES.new(self.key, AES.MODE_EAX)
        ciphertext, tag = cipher.encrypt_and_digest(plaintext)
        # 返回nonce、密文、标签三个必要值
        return cipher.nonce, ciphertext, tag

    def decrypt(self, nonce, ciphertext, tag):
        # 使用加密时生成的nonce初始化AES上下文
        cipher = AES.new(self.key, AES.MODE_EAX, nonce=nonce)
        # 自动验证tag并解密
        return cipher.decrypt_and_verify(ciphertext, tag)

2. 修正测试代码

调整测试逻辑以匹配修改后的接口,同时修复解密失败测试的不合理调用:

class TestTextEncS(unittest.TestCase):
    def setUp(self):
        self.message = b"This is a test message"
        self.key = tienc.generate_key_s()
        self.text_enc = tienc.TextEncS(self.key)

    def test_encrypt_decrypt(self):
        nonce, ciphertext, tag = self.text_enc.encrypt(self.message)
        result = self.text_enc.decrypt(nonce, ciphertext, tag)
        self.assertEqual(self.message, result)

    def test_decrypt_failure(self):
        nonce, ciphertext, tag = self.text_enc.encrypt(self.message)
        # 使用错误密钥创建新的加密实例
        wrong_text_enc = tienc.TextEncS(os.urandom(32))
        # 错误密钥解密会抛出验证异常
        self.assertRaises(Exception, wrong_text_enc.decrypt, nonce, ciphertext, tag)

3. 验证修复效果

重新运行unittest测试,test_encrypt_decrypt会通过明文匹配断言,test_decrypt_failure会正确捕获解密异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:25:22