Содержание
Дано известно, что при взаимодействии через общедоступные сети может происходить чтение, изменение или даже кража передаваемой информации злоумышленниками. Использование различных криптографических алгоритмов позволяет обеспечить защиту данных от просмотра, обнаружить изменения в данных, а также обеспечить безопасный обмен данными на основе незащищенных каналов. Например, данные могут быть зашифрованы с помощью какого-либо криптографического алгоритма и в зашифрованном виде переданы потребителю, а затем расшифрованы потребителем, например, с помощью ключа шифрования. Если зашифрованные данные будут перехвачены злоумышленником, то расшифровать их будет трудно или практически невозможно.
В .NET C# классы для работы с шифрованием данных содержатся в пространстве имен System.Security.Cryptography
.
Криптографические примитивы
Криптография используется для достижения следующих целей:
- конфиденциальность: защита данных или личной информации пользователя от несанкционированного просмотра;
- целостность данных: защита данных от несанкционированного изменения;
- аутентификация: проверка того, что данные исходят действительно от определенного лица;
- неотрекаемость: ни одна сторона не должна иметь возможность отрицать факт отправки сообщения.
Типичная ситуация, когда Вы используете криптографические алгоритмы — обмен сообщениями в Telegram, где используется свой оригинальный алгоритм шифрования сообщений. При этом, для достижения целей криптографии (см. выше) можно использовать алгоритмы и правила, известные как криптографические примитивы и на их основе разрабатывать криптографические схемы. В таблице ниже приведены криптографические примитивы и их использование.
Криптографический примитив | Использование |
Шифрование с закрытым ключом (симметричное шифрование) | Осуществляет преобразование данных с целью предотвращения их просмотра третьей стороной. При таком способе шифрования для шифрования и расшифровки данных используется один общий закрытый ключ |
Шифрование с открытым ключом (асимметричное шифрование) | Осуществляет преобразование данных с целью предотвращения их просмотра третьей стороной. При таком способе шифрования для шифрования и расшифровки данных используется набор, состоящий из открытого и закрытого ключей |
Создание криптографической подписи | Позволяет проверить, действительно ли данные исходят от конкретного лица, с помощью уникальной цифровой подписи этого лица. Этот процесс также использует хэш-функции |
Криптографическое хэширование | Отображает данные любого размера в байтовую последовательность фиксированной длины. Результаты хэширования статистически уникальны; отличающаяся хотя бы одним байтом последовательность не будет преобразована в то же самое значение |
Рассмотрим эти примитивы более подробно.
Шифрование с закрытым ключом
При шифровании с закрытым ключом для шифрования и расшифровки данных используется один закрытый ключ. Поэтому, при таком виде шифрования, крайне важно обезопасить этот ключ от несанкционированного доступа, потому что любой обладающий ключом человек может использовать его для расшифровки данных или шифрования собственных данных с подменой источника.
Этот вид шифрования также называется симметричным шифрованием, так как для шифрования и расшифровки используется один и тот же ключ. Алгоритмы шифрования с закрытым ключом являются очень быстрыми (по сравнению с алгоритмами шифрования с открытым ключом) и хорошо подходят для осуществления криптографических преобразований больших массивов данных. И, если асимметричные алгоритмы шифрования, такие как RSA, имеют математические ограничения на объем шифруемых данных, то для симметричных алгоритмов шифрования подобной проблемы обычно не возникает.
Разновидность алгоритмов шифрования с закрытым ключом — блочный шифр, используется для шифрования целого блока данных за один раз. Блочные шифры (такие как DES, TrippleDES и AES) преобразуют входной блок данных длиной n
байтов в выходной блок зашифрованных данных. Если необходимо зашифровать или расшифровать последовательность байтов, то это следует делать это блок за блоком. Так как значение n
достаточно мало то, данные большей длины, чем n
, должны шифроваться блоками, по одному за раз. Блоки данных размером менее n
байт должны быть увеличены до n
байт перед обработкой.
Шифрование с открытым ключом
При шифровании с открытым ключом используются два ключа: закрытый — должен храниться в секрете от злоумышленника и открытый ключ, который может предоставляться кому угодно. Открытый и закрытый ключи математически взаимосвязаны. Данные, зашифрованные с помощью открытого ключа, можно расшифровать исключительно с помощью соответствующего ему закрытого ключа, а цифровая подпись данных, подписанных с помощью закрытого ключа, может быть проверена только с помощью соответствующего открытого ключа.
Открытый ключ можно предоставить любому лицу. Он используется для шифрования данных, которые должны быть отправлены хранителю закрытого ключа. Алгоритмы шифрования с открытым ключом также известны как асимметричные алгоритмы, потому что для шифрования данных требуется один ключ, а для расшифровки — другой. Основное правило шифрования запрещает повторное использование ключа — оба ключа в каждом сеансе шифрования должны быть уникальными. Однако на практике асимметричные ключи обычно используются достаточно долго.
Хэш-значения
Цель хэш-алгоритма — преобразовать двоичные последовательности произвольной длины в двоичные последовательности фиксированного меньшего размера, известные также, как хэш-значения. Хэш-значение является числовым представлением части данных. Если в хэшированном абзаце текста изменяется хотя бы одна буква, результат хэширования также меняется. Если хэш является криптостойким, его значение значительно изменится. Например, если изменяется один бит сообщения, результат выполнения криптостойкой хэш-функции может отличаться на 50%.
С помощью сравнения хэш-значений можно сделать два вывода:
- сообщение не было изменено;
- отправитель сообщения подлинный
Генерация случайных чисел
Генерация случайных чисел является неотъемлемой частью многих криптографических операций. Например, криптографические ключи должны выбираться настолько случайно, насколько это возможно, чтобы было фактически невозможно воспроизвести их значения. Криптографические генераторы случайных чисел должны генерировать результат, который нельзя предсказать вычислительными методами с вероятностью хотя бы 50 %. Поэтому все методы предсказания очередного случайного бита не должны быть точнее, чем простое угадывание. Классы в .NET используют генераторы случайных чисел для создания криптографических ключей, так, например, класс RandomNumberGenerator
является реализацией алгоритма генерации случайных чисел.