Я кодирую библиотеку шифрования, которая позволяет вам генерировать либо симметричную, либо асимметричную пару ключ/ключ и использовать ее в любом из этих 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 да, я понимаю, что из-за ошибки я получаю сообщение о том, что расшифровка не работает должным образом, однако я немного не понимаю, как это исправить.
Вы уверены, что возникнет исключение, если вы передадите неправильный ключ? Типа не имеет смысла, когда вы думаете об этом.
Вы должны изменить свой производственный код, как показано ниже:
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
Модификация:
encrypt()
которые возвращают 3 значения (я добавил chiper.nonce
)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?
@ Вей, я только пользуюсь Cryptodome Я не могу дать тебе такое предложение. Мне жаль. Я думаю, что мой код может шифровать и расшифровывать с помощью AES и проходить ваши тесты. С Crypto я не могу скомпилировать свой код, поэтому я использовал Cryptodome.
@Vey Вам полезен код с моей модификацией? Вы можете использовать его для шифрования и расшифровки, или это не работает? О тесте: я использовал диспетчер контекста, чтобы проверить возникшее исключение, а не ваш синтаксис. С вашим синтаксисом тест, на мой взгляд, не корректен. Дайте мне отзыв, пожалуйста.
Извините за поздний ответ - последние несколько дней я был очень занят. Добавление nonce и других модификаций в соответствии с предоставленным вами кодом решило проблему. Большое спасибо!
Ошибка утверждения просто означает, что тест не проходит, то есть ваше шифрование/дешифрование работает неправильно.