我为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)
答案 0 :(得分:6)
伪随机置换的整个想法 - 和块密码只是 - 它看起来是随机的。你可以运行测试来检查随机性,但我很确定这对于JUnit测试来说有点太多了。所以我会接受s2222的建议,只需通过解密测试。
您可以通过使用原始块解密并在那里测试什么来测试模式和填充。您还可以测试加密后的内容是否相等(块加密本身与纯文本和密文的关系为1:1),或者加密是否不同。您还可以测试加密数据的大小是否正确。
然而,加密自我无法在没有解密的情况下进行测试,这首先是它背后的想法:你无法获得有关明文或密钥的信息 - 任何看起来不随机的东西都会违背这些概念。< / p>
[编辑]可能测试加密的最佳方法是针对official test vectors对其进行测试,如果这些不够或不可用,请针对已知良好实现(例如openssl等经过验证的实现)进行测试)或参考实施。
答案 1 :(得分:0)
不测试结果。嘲笑你的密码和随机提供者并测试他们是否使用正确的参数调用,以及是否在他们之间正确传递了中间结果