Где хранится ключ шифрования?

Я новичок в криптографии. Я читал, что симметричные и асимметричные алгоритмы используют один и два ключа шифрования соответственно. и эти ключи должны храниться где-то в безопасности. но когда я искал в интернете учебники о том, как выполнять шифрование в asp.net, я обнаружил что-то странное для меня! например, этот учебник.

при шифровании или расшифровке данных нет открытого или предоставленного открытого или закрытого ключа! Я не могу понять

Еще одна проблема, с которой я столкнулся, заключается в том, что все учебники, которые я нашел до сих пор, представляют собой коды без каких-либо объяснений, что это за коды и почему они используются. Я ценю любой предложенный хороший учебник.

1 ответ

Решение

От конструктора RSACryptoServiceProvider:

Если ключ по умолчанию не найден, создается новый ключ.

Этот конструктор создает пару ключей Exchange, подходящую для шифрования сеансовых ключей, чтобы их можно было безопасно хранить и обмениваться с другими пользователями. Сгенерированный ключ соответствует ключу, созданному с использованием значения AT_KEYEXCHANGE, используемого в неуправляемом криптографическом API-интерфейсе Microsoft (CAPI).

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

Немного предыстории (я предполагаю, что вы используете Windows), пары асимметричных ключей связаны с сертификатами. Эти сертификаты используются для того, чтобы доверять асимметричным ключам. Каждый сертификат может быть подписан центром сертификации (который является органом, который выдает асимметричные ключи), если вы доверяете центру сертификации, то вы доверяете асимметричным ключам, которые принадлежат сертификату, подписанному этим органом. Все эти сертификаты хранятся в вашем "Хранилище сертификатов", также известном как "Хранилище ключей" (Java), "Брелок для ключей" (Mac).

Вы можете просмотреть свои сертификаты, выполнив Start > Run > certmgr.msc, Ваши сертификаты находятся в разделе Личные> Сертификаты. Если вы откроете один и перейдете к Certificate Path На вкладке вы увидите цепочку сертификатов до центра сертификации. Если этот "корневой" сертификат, принадлежащий центру сертификации, найден в вашем Trusted Root Certification Authorities > Certificates хранить, то сертификат считается действительным и доверенным.

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

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

Это можно сделать с помощью класса X509Store, например:

X509Store certificateStore = new X509Store("MY", StoreLocation.CurrentUser);
X509Certificate2Collection allCertificates = certificateStore.Certificates;
//Iterate through all certificates

"MY" представляет собой личные сертификаты, остальное можно найти здесь. CurrentUser представляет ключи пользователя, другой вариант - LocalMachine.

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

  1. Получить сертификат
  2. Извлечь открытый ключ из сертификата
  3. Генерация симметричного ключа (AES)
  4. Шифровать данные симметричным ключом
  5. Зашифровать симметричный ключ с открытым ключом
  6. Храните зашифрованный симметричный ключ с зашифрованными данными вместе с идентификатором (серийным номером) для сертификата, который вы использовали для шифрования

Когда вы расшифровываете, вы должны:

  1. Считать серийный номер из зашифрованных данных
  2. Извлечь сертификат из хранилища ключей с этим серийным номером
  3. Извлечь закрытый ключ из этого сертификата
  4. Расшифровать симметричный ключ с этим закрытым ключом
  5. Расшифровать данные с помощью этого симметричного ключа
  6. Используйте данные

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

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

Другие вопросы по тегам