自定义Python加密库TextEncS类单元测试断言错误求助
问题排查与解决
核心问题分析
AES EAX模式的正确使用依赖**唯一nonce(随机数)**完成加密解密的上下文匹配:
- 加密时AES会自动生成一个nonce,该值必须与密文、标签一同传递给解密环节
- 当前代码的两个致命错误:
encrypt方法仅返回ciphertext和tag,丢失了加密时生成的关键noncedecrypt方法错误地将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
相关产品推荐
相关产品推荐

