CNGKey.Create не будет сохраняться - PullRequest
0 голосов
/ 05 апреля 2020

Я играю с CNGKey и хранилищем. Я хотел бы сохранить ключ, а затем получить его для шифрования. Я делаю CngKey.Create и вижу, что оно сохраняется в файловой системе. Чтобы проверить доступ к нему, сразу после команды Create я получаю false для CngKey.Exists (проверено из окна Visual Studio 'watch'). Это происходит как для RSA (используя встроенный Microsoft), так и для AES (используя мою строку). Мой код для AES:

CngKeyCreationParameters keyParams = new CngKeyCreationParameters
{
    ExportPolicy = CngExportPolicies.AllowExport,
    KeyCreationOptions = CngKeyCreationOptions.MachineKey | CngKeyCreationOptions.OverwriteExistingKey,
    Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
    //KeyUsage = CngKeyUsages.Decryption
};
CngAlgorithm aesAlgorithm = new CngAlgorithm("AES");
CngKey.Create(aesAlgorithm, "mykeyAES", keyParams);

Мой код для RSA:

CngKeyCreationParameters keyParams = new CngKeyCreationParameters
{
    ExportPolicy = CngExportPolicies.AllowExport,
    KeyCreationOptions = CngKeyCreationOptions.MachineKey | CngKeyCreationOptions.OverwriteExistingKey,
    Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
    //KeyUsage = CngKeyUsages.Decryption
};
if (!CngKey.Exists(keyName, CngProvider.MicrosoftSoftwareKeyStorageProvider))
{
    CngKey key = CngKey.Create(CngAlgorithm.Rsa, keyName, keyParams);
}

Единственная релевантная информация, которую я получаю при поиске в Интернете, связана с теми же вопросами о SO, которые не мне сильно помочь с моим конкретным делом. Цени любую помощь!

Редактировать:

Согласно ответу @ Martheen, Open изменился на:

CngKey key = CngKey.Open(keyName, CngProvider.MicrosoftSoftwareKeyStorageProvider, CngKeyOpenOptions.MachineKey);

Я получаю правду на CngKey.Exists, но получаю исключение «пара ключей не существует»

1 Ответ

0 голосов
/ 06 апреля 2020

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

CngKey.Exists("mykeyAES", CngProvider.MicrosoftSoftwareKeyStorageProvider, CngKeyOpenOptions.MachineKey));

и

CngKey.Open("mykeyRSA", CngProvider.MicrosoftSoftwareKeyStorageProvider, CngKeyOpenOptions.MachineKey));
...