2009-12-31 5 views
10

При использовании алгоритма blowfish из библиотеки openssl можно шифровать и дешифровать любые данные.Как проверить, успешно ли расшифровка?

Кроме того, любые данные могут быть зашифрованы (дешифрованы) любым ключом \ iv. В openssl нет способа определить, было ли дешифрование успешным или нет. Это просто математическое преобразование.

Итак, что мне делать, чтобы убедиться, что шифрование прошло успешно: некоторые данные были дешифрованы с помощью того же ключа/iv, который был зашифрован?

Должен ли я добавить несколько MAGIC-байтов перед данными, которые необходимо проверить после дешифрования?

+0

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

ответ

8

Вы можете добавить контрольную сумму (например, MD5 исходного содержимого) в конце файла. После того, как вы расшифруете его, последние 16 байтов должны быть снова равны md5 (контент-16 байт).

+3

контрольная сумма! = MD5 – jldupont

+0

MD5 может использоваться как функция контрольной суммы, так как она имеет относительно низкое отношение коллизий.Конечно, это не типичная функция контрольной суммы, но ее легко вычислить, и это довольно быстро (я знаю, что CRC быстрее ;-) – naivists

+0

@naivists: дело в том, что «контрольная сумма» - это другой зверь из «алгоритма хэширования», , – jldupont

1

Из множества возможных решений, возможно, рассмотрим использование CRC.

+0

Согласно статье Википедии, «n-разрядный CRC, примененный к блоку данных произвольной длины, будет обнаруживать любой пакет ошибок, не превышающий n бит». Это означает, что я должен использовать CRC с длиной, равной моему зашифрованному сообщению? Поскольку, насколько я понимаю, «ошибка» в сообщении, дешифрованном с неправильным ключом, скорее всего, будет иметь максимальную длину (длину сообщения). Это не так эффективно. –

+0

нет, например: 32-битный CRC обнаруживает любую однобитовую ошибку ** пакет ** не более 32 бит ** независимо ** зашифрованной длины сообщения. Другими словами, это очень эффективная память. Надеюсь это поможет. – jldupont

+0

Подождите, подождите, подождите :-) Если сообщение было дешифровано с неправильным ключом, длина ошибки будет такой же, как длина сообщения, правильно? Потому что, скорее всего, каждый бит будет неправильным. Правильно? Означает ли это, что ошибка в сообщении длиной более 32 бит не будет обнаружена? Извините, возможно, глупые вопросы. –

0

Метод контрольной суммы в конце данных лучше всего, я думаю, однако вам нужно расшифровать весь контент до конец.

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

Так что я сделал (наконец, в продуктивном программном обеспечении) использовал сам ключ для первого блока (вместо использования постоянных или прогнозируемых магических байтов). это приводит к следующим дополнительным знаниям для злоумышленника:

key = decrypt(ciphertext, key) 

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

0

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

Смежные вопросы