AssertionError - Создание моей собственной библиотеки Python, и я получаю сообщение об ошибке утверждения

Я кодирую библиотеку шифрования, которая позволяет вам генерировать либо симметричную, либо асимметричную пару ключ/ключ и использовать ее в любом из этих 4 классов: TextEncA, TextEncS, ImageEncA и ImageEncS. Код выглядит синтаксически правильным, однако при тестировании кода я получаю сообщение об ошибке при тестировании класса TextEncS с использованием unittest, а именно ошибку утверждения.

Вот код для тестирования класса 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'

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

Как я могу решить эту проблему и что я должен попробовать?

Я пытался изменить код о том, что прочитал документацию, но ничего из того, что я пробовал, похоже, не сработало.

Ошибка утверждения просто означает, что тест не проходит, то есть ваше шифрование/дешифрование работает неправильно.

matszwecja 10.01.2023 15:22

@matszwecja да, я понимаю, что из-за ошибки я получаю сообщение о том, что расшифровка не работает должным образом, однако я немного не понимаю, как это исправить.

Vey 10.01.2023 15:26

Вы уверены, что возникнет исключение, если вы передадите неправильный ключ? Типа не имеет смысла, когда вы думаете об этом.

matszwecja 10.01.2023 16:01
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
Learning Data Analytics Two: Filtering data in a DataFrame.
Learning Data Analytics Two: Filtering data in a DataFrame.
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
1
3
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Изменения в вашем классе 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.nonce)
  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 см. в этой документации.

Чтобы узнать, почему я использую модуль Cryptodome вместо модуля Crypto, см. эту ссылку.

Насколько мне известно, я использую библиотеку pycryptodomex, независимую от pycryptodome и криптографических библиотек, будет ли это иметь какое-либо значение для предложенного вами кода? Кроме того, было бы лучше переключиться на pycryptodome?

Vey 11.01.2023 20:01

@ Вей, я только пользуюсь Cryptodome Я не могу дать тебе такое предложение. Мне жаль. Я думаю, что мой код может шифровать и расшифровывать с помощью AES и проходить ваши тесты. С Crypto я не могу скомпилировать свой код, поэтому я использовал Cryptodome.

frankfalse 11.01.2023 21:15

@Vey Вам полезен код с моей модификацией? Вы можете использовать его для шифрования и расшифровки, или это не работает? О тесте: я использовал диспетчер контекста, чтобы проверить возникшее исключение, а не ваш синтаксис. С вашим синтаксисом тест, на мой взгляд, не корректен. Дайте мне отзыв, пожалуйста.

frankfalse 12.01.2023 10:32

Извините за поздний ответ - последние несколько дней я был очень занят. Добавление nonce и других модификаций в соответствии с предоставленным вами кодом решило проблему. Большое спасибо!

Vey 16.01.2023 21:24

Другие вопросы по теме