Поделиться через


Криптографические ключи

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

симметричные ключи;

Шифрование симметричного ключа, также называемое шифрованием секретного ключа, требует, чтобы ключ, используемый для шифрования, также использовался для расшифровки. Класс SymmetricKeyAlgorithmProvider можно использовать для указания симметричного алгоритма и создания или импорта ключа. Статические методы можно использовать в классе CryptographicEngine для шифрования и расшифровки данных с помощью алгоритма и ключа.

Шифрование симметричного ключа обычно использует блочные шифры и режимы блочного шифра. Шифр блока — это симметричная функция шифрования, которая работает в блоках фиксированного размера. Если сообщение, которое требуется зашифровать, превышает длину блока, необходимо использовать режим шифра блока. Режим блочного шифра — это симметричная функция шифрования, созданная с помощью блочного шифра. Он шифрует обычный текст как ряд блоков фиксированного размера. Для приложений поддерживаются следующие режимы:

  • Режим ECB (электронная кодовая книга) шифрует каждый блок сообщения отдельно. Это не считается защищенным режимом шифрования.
  • В режиме CBC (цепочка блоков шифров) используется предыдущий блок шифра для маскирования текущего блока. Необходимо определить, какое значение следует использовать для первого блока. Это значение называется вектором инициализации (IV).
  • Режим CCM (счетчик с CBC-MAC) объединяет режим блочного шифра CBC с кодом проверки подлинности сообщений (MAC).
  • Режим счетчика GCM (режим счетчика Galois) объединяет режим шифрования счетчиков с режимом проверки подлинности Galois.

Некоторые режимы, такие как CBC, требуют, чтобы для первого блока шифров использовался вектор инициализации (IV). Ниже приведены распространенные векторы инициализации. При вызове CryptographicEngine.Encrypt указывается IV. В большинстве случаев важно, чтобы IV никогда не повторно используется с тем же ключом.

  • Исправлено использование одного и того же IV для шифрования всех сообщений. Эта утечка информации и ее использование не рекомендуется.
  • Счетчик увеличивает iv для каждого блока.
  • Случайный создает псевдорандом IV. Для создания IV можно использовать CryptographicBuffer.GenerateRandom.
  • Неисчисленное использует уникальное число для шифрования каждого сообщения. Как правило, nonce является измененным сообщением или идентификатором транзакции. Nonce не должен храниться в секрете, но его никогда не следует повторно использовать под тем же ключом.

Большинству режимов требуется, чтобы длина открытого текста была точной величиной блока. Обычно для получения соответствующей длины требуется провести заполнение открытого текста.

Хотя блочные шифры шифруют блоки данных фиксированного размера, шифры потоков являются симметричными функциями шифрования, которые объединяют биты обычного текста с псевдорандомным битом (называемым потоком ключей) для создания зашифрованного текста. Некоторые режимы блочных шифров, такие как режим обратной связи вывода (OTF) и режим счетчика (CTR) фактически преобразовывают шифр блока в шифр потока. Фактические шифры потоков, такие как RC4, обычно работают с более высокой скоростью, чем режимы блочных шифров способны достичь.

В следующем примере показано, как использовать класс SymmetricKeyAlgorithmProvider для создания симметричного ключа и его использования для шифрования и расшифровки данных.

асимметричные ключи;

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

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

  • Алиса требует, чтобы Боб отправлял ей только зашифрованные сообщения.
  • Алиса создает пару закрытого и открытого ключа, сохраняет секрет закрытого ключа и публикует ее открытый ключ.
  • Боб имеет сообщение, что он хочет отправить Алису.
  • Боб создает симметричный ключ.
  • Боб использует свой новый симметричный ключ, чтобы зашифровать свое сообщение Алисе.
  • Боб использует открытый ключ Алисы для шифрования симметричного ключа.
  • Боб отправляет зашифрованное сообщение и зашифрованный симметричный ключ в Алису (конвертированный).
  • Алиса использует свой закрытый ключ (из частной/общедоступной пары) для расшифровки симметричного ключа Боба.
  • Алиса использует симметричный ключ Боба для расшифровки сообщения.

Объект AsymmetricKeyAlgorithmProvider можно использовать для указания асимметричного алгоритма или алгоритма подписи, создания или импорта пары временных ключей или импорта части открытого ключа пары ключей.

Производные ключи

Часто необходимо наследовать дополнительные ключи из общего секрета. Для получения ключей можно использовать класс KeyDerivationAlgorithmProvider и один из следующих специализированных методов в классе KeyDerivationParameters.

Объект Description
BuildForPbkdf2 Создает объект KeyDerivationParameters для использования в функции производного ключа на основе паролей 2 (PBKDF2).
BuildForSP800108 Создает объект KeyDerivationParameters для использования в режиме счетчика, хэш-код проверки подлинности сообщений (HMAC) функции вывода ключа.
BuildForSP80056a Создает объект KeyDerivationParameters для использования в функции извлечения ключей SP800-56A.