Фон
Я разрабатываю систему, которая позволяет разрабатывать схемы динамической аутентификации для пользователя статического веб-контента. Мотивация состоит в том, чтобы предварительно сгенерировать большие объемы сложного для генерации, но конфиденциального веб-контента, а затем обслуживать его статически с аутентификацией на основе файлов cookie (встраивая обратимо зашифрованную информацию), принудительно применяемой веб-сервером. Использование примитива шифрования в режиме AEAD.
Проблема
Мне нужно сгенерировать IVEC и ключи, действительные в течение определенного периода времени, скажем, одну неделю (текущая действительная пара). и что прошлые IVEC/ключи также действительны, скажем, 2 недели (исторически действительные), и любые данные, зашифрованные с исторически действительными секретами, будут просто повторно зашифрованы с помощью текущего действительного IVEC/KEY.
Что мне нужно, так это детерминированный CSPRNG, который задает случайное число и фразу-пароль и который может создавать в индексированном виде 64-битные или 128-битные блоки чисел. Если я использую «недели с 1 января 1970 года» в качестве одного из элементов индекса моей гипотетической CSPRNG, я смогу построить систему, которая автоматически меняет ключи с течением времени.
Подход, который я рассматриваю
Сейчас я не вижу такой функциональности в cryptopp, или я достаточно хорошо знаю терминологию, а так как cryptopp является самой продвинутой из существующих библиотек шифрования, я не уверен, что найду другую. Итак, если я не могу найти реализацию, я должен свернуть свою собственную. Поможет ли генерация статической строковой структуры из конкатенированных данных, а затем ее хеширование (показано ниже)?
RIPEMD160(RandomPreGeneratedFixedNonce:PassPhrase:UInt64SinceEpoch:128BitBlockIndexNumber);
Примечание. Номера блоков будут назначены и иметь обычную структуру, поэтому, например, для 128-битного дайджеста первые 64 бита блока 0 будут для ivec, а весь элемент 1 — для 128-битного ключа.
Является ли это разумным подходом (--.т.е. криптографически безопасным)?
-- изменить: опубликовать принять комментарий --
После некоторого размышления я решил объединить то, что я первоначально считал парольной фразой и одноразовым номером/солью, в 16-байтовый (криптографически стойкий) ключ и использовать методы, описанные в PKCS #5, для получения нескольких ключей на основе времени. Нет необходимости в соли, так как парольные фразы не используются.