Контекст: VS 2015 winforms, Windows 7, с использованием библиотеки Inferno SecurityDriven.Создание частного CngKey (ECDH_P384) из кодовой фразы
Я кодирую офлайн-приложение, которое создает зашифрованные файлы для отправки в виде вложений электронной почты (поэтому не используется в контексте клиент-сервер). Файлы сначала зашифровываются Inferno (ETM_Transform), а затем отправляются (иногда, чтобы сбросить пароль) другой файл, обрабатывая обмен ключами DHM.
Открытый ключ каждого пользователя хранится в виде данных, созданных и сохраняемых приложением, что обеспечивает быстрый доступ во время процесса обмена ключами. Однако для частного ключа моя проблема заключается в том, что пользователи (включая меня) предпочли бы воссоздать свой закрытый ключ из фразы прохода, избавляя от необходимости скрывать ключ, повышая безопасность и переносимость. Поэтому мне нужно будет создать ключ из хранимого открытого ключа и хэшированной фразы.
Является ли это разумным подходом или, возможно, лучше для этого конкретного контекста?
Вот очень короткий пример кода, который выдает исключение: «Запрошенная операция не поддерживается». Как мне перейти на импорт данных в ключ?
internal static void CreateKey(string passPhrase)
{
byte[] keyType = new byte[] { 0x45, 0x43, 0x4B, 0x34 };
byte[] keyLength = new byte[] { 0x30, 0x0, 0x0, 0x0 };
CryptoRandom cr = new CryptoRandom(); // rng used for this example
byte[] prKey = cr.NextBytes(48); // salt+hash passphrase and pass it to the private key part
byte[] pbKey = cr.NextBytes(96); // the public part, if I understand the format correctly for a cngkey using ECDH_P384
byte[] blob = Utils.Combine(keyType, keyLength); // same as concat
blob = Utils.Combine(blob, pbKey, prKey);
CngKey key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob);
}
Очень поучительный ответ. Я как раз собирался опубликовать вопрос о хранилище секретных ключей, но я внимательно изучу Minilock и узнаю, что я могу, прежде чем продолжить ... – Frank