我如何创建一个公钥/私钥对,然后将它们安全地存放到钥匙容器中



我一直在尝试做一些简单的加密练习,但是我很难过。迄今为止,我已经能够生成一对公共和私钥,但是我还没有弄清楚如何安全地存储它们或使它们持续到一次会话之外。在我的研究中,我听说过这个称为"钥匙容器"的东西,该操作使这些密钥(安全地(持续到一次会话之外,并在以后的时间内检索。

不幸的是,密码学很复杂,因此每次我认为我已经弄清楚了一些问题时,它都会给我五个问题,在我了解自己在做什么之前必须回答。到这一点上,我的头正在欣赏所有这些信息,而且我遇到了很多麻烦。所以...

我想看到一个代码示例,该示例可以创建一个公用/私钥对,将它们保存在钥匙容器中,然后将其检索。如果可能的话,我还希望看到一些可以从假定已经存在的密钥容器中检索公共密钥和私钥的代码。对于约束,假设Visual Studios C#在Windows 10 OS上的.NET框架中使用。

除非有一种更安全的方法来执行此操作,否则我宁愿使用RSA加密来查看。

我几乎可以肯定,这或多或少是重复的问题,但是如果是这样,那么我还没有找到原始问题。

从corefx test(以及同一文件中的其他代码(借用:

// 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.
}

最新更新