На самом деле вам нужно семейство устойчивых к второму прообразу, необнаруживаемых, односторонних функций. В общем, любая безопасная криптографическая хэш-функция (SHA2, SHA3, ...) должна работать с небольшой настройкой, чтобы сделать ее ключевой. Вам не нужно, чтобы это был PRF, и функция имеет фиксированную длину. Следовательно, если вы также зафиксируете длину ключа, используя
SHA3(К || М)
в порядке (а затем берет необходимое количество выходных битов). Для SHA2 (или любой конструкции Меркла-Дамгарда) вы получаете более надежный аргумент безопасности, если вы сначала включаете ключ в вызов функции сжатия, а затем в сообщение. то есть, вы делаете
SHA2-256 (площадка (K, 512) || M),
где pad(K, 512) применяет инъективное дополнение, чтобы превратить K в 512-битную строку. Предполагая фиксированную длину для K, добавление достаточного количества нулей работает просто отлично. Здесь я учел, что длина блока SHA2-256 составляет 512 бит. Для разных длин блоков вы должны соответствующим образом отрегулировать длину. Из-за усиления Меркла-Дамгарда (которое требует применения заполнения длины) это не увеличивает количество вызовов функции сжатия. В то же время вы можете думать об этом как о первом вычислении псевдослучайного IV из K, который затем используется для хеширования M.