簡體   English   中英

如何創建公鑰/私鑰對並將其安全地存儲到密鑰容器中?

[英]How do I create a public-key/private-key pair and safely store them into a key container?

我一直在嘗試做一些簡單的加密練習,但我很難過。 到目前為止,我已經能夠生成一對公鑰和私鑰,但我還沒有弄清楚如何安全地存儲它們或使它們在單個會話之后持續存在。 在我的研究中,我聽說過這個稱為“密鑰容器”的東西,它允許這些密鑰(安全地)持續超過單個會話並在以后檢索。

不幸的是,密碼學是復雜的,所以每次我想我已經找到了一些東西,它給了我另外五個問題,在我能理解我在做什么之前必須回答。 在這一點上,我的頭腦正在游泳所有這些信息,我在理解這一切時遇到了一些麻煩。 所以...

我想看一個代碼示例,它創建一個公鑰/私鑰對,將它們保存在一個密鑰容器中,然后檢索它們。 如果可能的話,我還希望看到一些代碼從一個假定已經存在的密鑰容器中檢索公鑰和私鑰。 對於約束,假設Visual Studio C#正在Windows 10 OS上的.NET框架中使用。

除非有更安全的方法,否則我更願意看到RSA加密。

我幾乎可以肯定這或多或少是一個重復的問題,但如果是這樣,那么我還沒有找到原始問題。

借用corefx測試 (以及同一文件中的其他代碼):

// Ideally you use a name that won't ever be used by someone else.
// Certificate import names its keys GUIDs, but then has to remember what they were.
const string KeyName = "SomePersistedKey";
const int Size = 2048; // Or whatever.

CNG:

CngKey key = null;

try
{
    key = CngKey.Open(KeyName);
}
catch (CryptographicException)
{
    // This is only in the catch block to avoid a scrollbar.
    CngKeyCreationParameters creationParameters = new CngKeyCreationParameters()
    {
        ExportPolicy = CngExportPolicies.None, // Or whatever.
        Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
        KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey,
        Parameters =
        {
            new CngProperty("Length", BitConverter.GetBytes(Size), CngPropertyOptions.None),
        }
    };

    cngKey = CngKey.Create(CngAlgorithm.Rsa, KeyName, creationParameters);
}

using (cngKey)
using (RSA rsa = new RSACng(cngKey))
{
    // Tada.
}

或者,如果你需要堅持使用CAPI(希望不是):

const int PROV_RSA_AES = 24;

CspParameters cspParameters = new CspParameters(PROV_RSA_AES)
{
    KeyNumber = (int)KeyNumber.Exchange,
    KeyContainerName = KeyName,
    Flags = CspProviderFlags.UseNonExportableKey, // Or whatever.
};

// This constructor is open-or-create since flags didn't asset ExistingOnly.
using (RSA rsa = new RSACryptoServiceProvider(Size, cspParameters))
{
    // tada.  Use CNG instead, if you can.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM