Использование открытого ключа в асимметричном шифровании с сертификатами X.509

Иногда назад я читал статью об использовании асимметричных ключей, таких как открытый и закрытый ключи, для безопасной отправки данных. Я понял, что сервер имеет 1 ключ (закрытый ключ), который он использует для шифрования данных, а все клиенты используют второй ключ. (открытый ключ), чтобы его расшифровать.

Как мне ожидать получения ключа и как с ним работать?

Если я получу сертификат с сервера, не будет ли он содержать как открытый, так и закрытый ключи ?!

X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
var cert = GetCertificate(certStore);
var privatekey= cert.PrivateKey;
var publicKey= cert.PublicKey;

Можно ли удалить закрытый ключ из сертификата? Как? и как я могу понять, есть ли у сертификата закрытый ключ?


person Ashkan Sirous    schedule 09.04.2018    source источник
comment
Ключ шифрования и ключи дешифрования должны быть одинаковыми. Алгоритм шифрования / дешифрования использует ключ, состоящий из двух частей. Один является частью приложения (закрытый ключ), а второй - уникальным для каждого сообщения / соединения (открытый ключ).   -  person jdweng    schedule 09.04.2018
comment
В криптографии с открытым ключом вы шифруете с помощью открытого ключа сервера, а сервер дешифрует с помощью своего закрытого ключа. Таким образом, сервер распространяет свой сертификат (конечно, без закрытого ключа), который доступен всем клиентам.   -  person Evk    schedule 09.04.2018
comment
Сертификат никогда не содержит закрытого ключа. Только внутренние структуры C # группируют их вместе (если присутствует закрытый ключ).   -  person Robert    schedule 09.04.2018


Ответы (2)


Если я получу сертификат с сервера, не будет ли он содержать как открытый, так и закрытый ключи ?!

Нет, не обязательно.

Есть два разных способа получить сертификат.

  • PKCS # 7 / PEM - файл обычно содержит только публичную часть сертификата
  • PKCS # 12 / PFX - в магазине хранятся сертификаты с закрытыми ключами

Можно ли удалить закрытый ключ из сертификата?

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

Откройте веб-браузер, перейдите на любой сайт, использующий SSL.

Теперь щелкните значок замка и оттуда информацию о сертификате. На стороне клиента (в браузере) есть сертификат без закрытого ключа. Вы можете сохранить его и даже импортировать в системное хранилище сертификатов, но без закрытого ключа.

и как я могу понять, есть ли у сертификата закрытый ключ?

Если вы загрузите его с помощью кода C #, доступ к свойству HasPrivateKey будет true только для сертификатов с доступными закрытыми ключами.

person Wiktor Zychla    schedule 09.04.2018

Сначала небольшое уточнение:

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

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

Чтобы проверить, есть ли у сертификата закрытый ключ, вы можете использовать HasPrivateKey-Property.

cert.HasPrivateKey;

А чтобы получить сертификат только с открытым ключом, вы можете использовать:

byte[] bytes = cert.Export(X509ContentType.Cert);
var publicCert = new X509Certificate2(bytes);
person Hyarus    schedule 09.04.2018