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の提案を採用し、単に復号化してテストします。

rawブロックを使用して復号化し、そこにあるものをテストすることで、モードとパディングをテストできる場合があります。また、暗号化後に物事が等しいかどうか(ブロック暗号化自体はプレーンテキストと暗号文に対して1:1の関係にあります)、または暗号化が異なるかどうかをテストすることもできます。暗号化されたデータのサイズが正しいかどうかをテストすることもできます。

ただし、暗号化の自己は復号化なしではテストできません。そもそもその背後にある考え方です。平文やキーに関する情報を取得することはできません。ランダムに見えないものは、これらの概念に反します。

[編集]暗号化をテストする最良の方法は、公式のテストベクトルに対してテストすることです。これらが十分でないか利用できない場合は、既知の適切な実装(opensslなどの検証済み実装など)またはリファレンス実装に対してテストします。

于 2012-07-17T22:53:13.517 に答える
0

結果をテストしないでください。暗号プロバイダーとランダムプロバイダーをモックし、それらが正しいパラメーターで呼び出されているかどうか、および中間結果がそれらの間で正しく渡されているかどうかをテストします

于 2012-07-18T00:16:29.080 に答える