2

我已经为 编写了一些抽象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)
4

2 回答 2

6

伪随机排列的整个想法——和分组密码就是这样——是它看起来是随机的。你可以运行测试来检查随机性,但我很确定这对于 JUnit 测试来说有点太多了。所以我会接受 sr2222 的建议,并简单地通过解密进行测试。

您可以通过使用原始块解密并测试那里的内容来测试模式和填充。您还可以测试加密后事物是否相等(块加密本身对于纯文本和密文具有 1:1 的关系)或加密是否不同。您可能还可以测试加密数据的大小是否正确。

然而,加密本身不能在没有解密的情况下进行测试,这首先是它背后的想法:你无法获得关于明文或密钥的信息——任何看起来不随机的东西都会违背这些概念。

[编辑] 测试加密的最佳方法可能是针对官方测试向量对其进行测试,如果这些还不够或不可用,请针对(输出)已知的良好实现(例如经过验证的 openssl)或参考实现进行测试。

于 2012-07-17T22:53:13.517 回答
0

不要测试结果。模拟您的密码和随机提供程序并测试它们是否使用正确的参数调用以及中间结果是否在它们之间正确传递

于 2012-07-18T00:16:29.080 回答