Обнаружение ошибок при дешифрировании
Иногда получатель хочет проверить, является ли его конкретный ключ правильным ключом симметричного дешифрирования. Если открытый текст сообщения представляет собой что-то похожее на ASCII, он может попытаться расшифровать и прочитать сообщение. Если открытый текст случаен, то существуют другие приемы.
Наивным подходом явилось бы присоединение к открытому тексту до шифрования проверочного блока - известного заголовка. Получатель Боб расшифровывает заголовок и проверяет, что он правилен. Это работает, но дает Еве известный кусочек открытого текста, что помогает ей криптоанализировать систему. Это также облегчает вскрытие шифров с коротким ключом, таких как DES и все экспортируемые шифры. Рассчитайте заранее один раз для каждого ключа проверочную сумму, затем используйте эту проверочную сумму для определения ключа в любом сообщении, которое вы перехватили после этого. Любая проверочная сумма ключа, в которую не включены случайные или, по крайней мере, различные данные, обладает этим свойством. По идее это очень похоже на генерацию ключей по ключевым фразам.
Вот для этого способ получше [821]:
-
Сгенерите вектор идентификации (отличный от используемого в сообщении).
-
Используйте этот вектор идентификации для генерации большого блока битов: скажем, 512.
-
Хэшируйте результат.
-
Используйте те же фиксированные биты хэш-значения, скажем, 32, для контрольной суммы ключа.
Это тоже дает Еве какую-то информацию, но очень небольшую. Если она попытается использовать младшие 32 бита конечного хэш-значения для вскрытия грубой силой, ей придется для каждого вероятного ключа выполнить несколько шифрований и хэширование, вскрытие грубой силой самого ключа окажется быстрее.
Она не получит для проверки никаких известных кусочков открытого текста, и даже если она сумеет подбросить нам наше же случайное значение, она никогда не получит от нас выбранный открытый текст, так как он будет преобразован хэш-функцией прежде, чем она его увидит.