Можно ли указать длину вывода зашифрованной строки с помощью AES?

У меня проблема с шифрованием, и мне нужны рекомендации.

Я использую шифрование AES (Rijndael) для шифрования и расшифровки паролей пользователей, ответов на секретные вопросы и номеров PIN. Эти зашифрованные значения затем помещаются в базу данных, где поля определены как bin (16), bin (32) и bin (64). Первоначально я использовал настраиваемое заполнение, чтобы обеспечить длину данных, но по соображениям безопасности я перехожу на заполнение PKCS7. К сожалению, это изменение сделало длину зашифрованной строки непредсказуемой, по крайней мере, для пароля и ответов на секретный вопрос. Например, допустимые пароли могут иметь длину 16 или 32 байта при шифровании, а ответы безопасности могут иметь длину 16, 32 или 64 байта при шифровании. Я знаю, что такое размер блока и как он работает, но даже используя размер блока 32 байта (самый большой доступный размер блока), я все еще не могу контролировать длину ответа безопасности (это может быть 32 ИЛИ 64 байта).

Есть ли способ заставить мои зашифрованные строки иметь определенную длину, все еще используя заполнение AES и PCKS7, без добавления ограничений на ввод?


person Alakazooom    schedule 16.12.2019    source источник
comment
Это вполне предсказуемо. См. Этот ответ от СПП.   -  person kelalaka    schedule 17.12.2019
comment
Вы правы, может быть, «предсказуемый» - не то слово. Когда я знаю длину ввода, длина вывода предсказуема. Но если я не знаю длины ввода, как здесь, я не могу знать длину вывода (кроме того, что она кратна размеру блока).   -  person Alakazooom    schedule 17.12.2019
comment
Если есть максимальный размер, который вы принимаете от пользователя, то заполнение нулями лучше для вашей цели.   -  person kelalaka    schedule 17.12.2019
comment
@kelalaka Да, похоже, это будет мой лучший вариант. Спасибо за вклад.   -  person Alakazooom    schedule 17.12.2019
comment
Это было заполнение 10 ... 0000, так что вы можете удалить его с конца, посмотрев первую 1.   -  person kelalaka    schedule 17.12.2019


Ответы (1)


По сути, вы просите отказаться от принципа голубятни (чего не произойдет).

Я знаю, что вы говорите, что понимаете размер блока, но, похоже, вы не понимаете предложения, следующего сразу за этим утверждением. Размер блока определяет длину битовой строки, которая передается в алгоритм и выходит из алгоритма. Вот и все. Если вы передадите 2,5 лота по 256 бит (которые будут дополнены до 3 блоков), то вы получите 3 блока вывода. Кроме того, AES с размером блока 256 бит больше не AES, это Rijndael.

Вы можете предсказать размер вывода для данного ввода в AES с заполнением PKCS7, но вы не можете ограничить его, скажем, 32 байтами.

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

person Luke Joshua Park    schedule 16.12.2019
comment
Я понимаю размер блока. Я понял, что если у меня размер блока 256 бит, единственный способ обеспечить длину вывода - убедиться, что входной сигнал меньше 256 бит. Но в этом случае есть некоторые входы более 256 бит, что делает выход 512 бит. В любом случае, я ценю ваш комментарий. Похоже, то, что я пытаюсь сделать, невозможно (с учетом ограничений, которые я надеялся удовлетворить), поэтому мне придется найти другое решение. Спасибо. - person Alakazooom; 16.12.2019
comment
PKCS # 7 работает с 256-байтовыми блочными шифрами. В этом разница между PKCS # 5 и PKCS # 7. - person kelalaka; 17.12.2019