AssertionError -创建我自己的python库时遇到Assert错误

bzzcjhmw  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(186)

我正在编写一个加密库,它允许您生成对称或非对称密钥/密钥对,并在以下4个类中的任意一个中使用它:TextEncATextEncSImageEncAImageEncS。代码看起来语法正确,但在测试代码时,我使用unittest测试TextEncS类时遇到错误-即Assert错误。
下面是测试TextEncS类的代码:

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):
        ciphertext, tag = self.text_enc.encrypt(self.message)
        result = self.text_enc.decrypt(ciphertext, tag)
        self.assertEqual(self.message, result)

    def test_decrypt_failure(self):
        wrong_key = os.urandom(32)
        ciphertext, tag = self.text_enc.encrypt(self.message)
        self.assertRaises(Exception, self.text_enc.decrypt, ciphertext, tag, wrong_key)

下面是TextEncS类本身的代码:

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)
        return ciphertext, tag

    def decrypt(self, ciphertext, tag):
        cipher = AES.new(self.key, AES.MODE_EAX, tag)
        return cipher.decrypt(ciphertext)

对称密钥的密钥按如下方式生成:

def generate_key_s():
    key = os.urandom(32)
    return key

在终端中看到的错误如下所示:

======================================================================
FAIL: test_encrypt_decrypt (Test_TIENC.TestTextEncS)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\*****\Desktop\tienc\tests\Test_TIENC.py", line 38, in test_encrypt_decrypt
    self.assertEqual(self.message, result)
AssertionError: b'This is a test message' != b'\x1c\x83\x8cJ\xa7\x1b\x02g\xfet\xf1XOP\x9c\xa6\xa8\x99k\xabC\x01'

----------------------------------------------------------------------

我将如何着手解决这个问题,我应该尝试什么?
我试过改变代码,关于已经阅读了文档,但没有什么我已经尝试似乎已经工作。

vuktfyat

vuktfyat1#

修改类TextEncS

您必须修改您的生产代码如下:

from Cryptodome.Cipher import AES

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)
        return ciphertext, tag, cipher.nonce

    def decrypt(self, ciphertext, tag, nonce):
        cipher = AES.new(self.key, AES.MODE_EAX, nonce)
        data = cipher.decrypt_and_verify(ciphertext, tag)
        return data

修改如下:

  1. encrypt()返回3个值(我添加了chiper.once
  2. decrypt()有3个参数(我添加了once);此外,decrypt()的主体与您的代码有些不同
    在您的问题中,您没有包括import。在我的代码中,导入为:
from Cryptodome.Cipher import AES

修改测试代码

相应修改测试代码(参见代码内的注解):

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):
        # encrypt() return ---> ciphertext, tag, nonce
        ciphertext, tag, nonce = self.text_enc.encrypt(self.message)
        # pass 3 arguments to decrypt()
        result = self.text_enc.decrypt(ciphertext, tag, nonce)
        self.assertEqual(self.message, result)

    def test_decrypt_failure(self):
        # encrypt() return ---> ciphertext, tag, nonce
        ciphertext, tag, nonce = self.text_enc.encrypt(self.message)
        wrong_key = os.urandom(32)
        # create a new instance the class TextEncS with the wrong key
        self.text_enc = tienc.TextEncS(wrong_key)
        # change a bit the test
        with self.assertRaises(Exception):
            self.text_enc.decrypt(ciphertext, tag, nonce)

有用的链接

有关使用AES加密数据的详细信息,请参阅this documentations
要知道为什么我使用Cryptodome而不是Crypto模块,请参见this link

相关问题