drobotun/gostcrypto

Небольшие проблемы с алгоритмом Магма

ilya-nikolaev opened this issue · 2 comments

Я не понимаю что я делаю не так. При использовании алгоритма кузнечик с ключом шифрования
bytearray('adadadadadadadadadadadadadadadad'.encode('UTF-8')) (32 байта)
все работает отлично, но когда я использую все то же самое но с шифром магма вылетает ошибка
gostcrypto.gostcipher.gost_34_13_2015.GOSTCipherError: GOSTCipherError: invalid initialization vector value
Мне нужно шифровать файл, пример кода я взял из документации. Если же я в качестве cipher_obj использую сразу GOST34122015Magma то ошибки нет, но при шифровке/дешифровке я получаю только часть от начальных данных

Также, я пытался в качестве init_vector подставить пример из документации, но выскакивает та же ошибка

Если я правильно понял, то используется режим гаммирования (MODE_CTR) из примера в документации. В режиме гаммирования в качестве инициализирующего вектора (значение init_vector) необходимо использовать последовательность размером вполовину меньшей чем размер одного блока шифрования. Для "кузнечика" длина блока 16 байт (128 бит), соответственно init_vector должен быть 8-ми байтовым (как и показано в примере в документации), для "магмы" длина блока 8 байт (64 бита) и, соответственно, init_vector должен быть размером в 4 байта. Если сразу поставить в cipher_obj значение "GOST34122015Magma", то произойдет шифрование только одного блока (длиной 8 байт) из файла. Более подробно все это можно почитать в ГОСТ Р 34.12-2015 (https://files.stroyinf.ru/Data/603/60339.pdf) и ГОСТ Р 34.13-2015 (https://files.stroyinf.ru/Data2/1/4293762/4293762703.pdf). Первый ГОСТ описывает алгоритмы шифрования отдельных блоков, второй - алгоритмы шифрования последовательностей большего размера чем один блок.

Огромное вам спасибо за ваше объяснение, у меня получилось разобраться.
Также спасибо вам за проделанный труд по созданию этой библиотеки и написанию документации к ней