Контекст: winforms VS 2015, Windows 7, использование библиотеки SecurityDriven Inferno.
Я кодирую автономное приложение, которое создает зашифрованные файлы для отправки в виде вложений электронной почты (таким образом, не используется в контексте клиент-сервер). Файлы сначала шифруются с помощью 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);
}