我已经写了一些Crypto.Cipher.AES.encrypt/decrypt
的抽象,我想为它编写单元测试。编写decrypt
的单元测试很简单,但是有没有合理的方法来测试加密本身是否发生?例如,是否有一些方法可以查看一个字节串,并知道是的,那是一大块AES加密数据?如果没有(可能会提供太多的信息),我有什么选择来测试我的encrypt
函数是否具有合理的输出?如何编写加密单元测试?
def encrypt(plaintext):
"""Return 'plaintext' AES encrypted."""
initialization_vector = Random.new().read(AES.block_size)
cipher = AES.new(settings.secret, AES.MODE_CFB, initialization_vector)
return initialization_vector + cipher.encrypt(bytes(plaintext.encode('utf-8')))
def decrypt(crypt):
"""Return 'crypt' AES decrypted."""
initialization_vector, crypt = crypt[:AES.block_size], crypt[AES.block_size:]
cipher = AES.new(settings.secret, AES.MODE_CFB, initialization_vector)
return cipher.decrypt(crypt)
# … this is a method of a unittest.TestCase subclass:
def test_decrypt(self):
"""Test that a message can be decrypted."""
crypt = utils.encrypt("abcdefg")
decrypt = utils.decrypt(crypt)
self.assertEqual("abcdefg", decrypt)
def test_encrypt(self):
"""Test that a message can be encrypted. … if you can"""
crypt = utils.encrypt("abcdefg")
self.assertSomethingmumblemumble(crypt)
你可以通过已知好的外部解密器运行'encrypt()'的结果并验证出来对方符合你的意见?这似乎是唯一的方法来做到这一点。编辑:你的解密测试不是很好。如果可能的话,您不应该使用模块本身来创建您正在测试的数据。仅仅因为操作是对称的,并不意味着这些步骤是正确的。 – 2012-07-17 22:35:40
您对我的'test_decrypt'的批评正是我为什么要问这个问题的原因......说,如果您将您的评论发布为答案,我可能会接受它。 – kojiro 2012-07-18 03:13:34