AesCng持久化密钥导出/导入:导入失败,出现CryptographicException:提供的句柄无效

时间:2018-02-21 18:10:14

标签: c# .net cryptography cng

我需要安全地持久化AES密钥以供.NET AesCng算法使用。我们的想法是使用CngKey类来持久化密钥并利用其导出/导入功能在多个服务器上维护相同的密钥。

我可以创建持久的AES密钥

public static bool CreateContainer(string name)
{
    if (CngKey.Exists(name))
    {
        return false;
    }

    CngKeyCreationParameters keyCreationParameters = new CngKeyCreationParameters()
    {
        ExportPolicy = CngExportPolicies.AllowPlaintextExport,
        KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey
    };
    CngKey cngKey = CngKey.Create(new CngAlgorithm("AES"), name, keyCreationParameters);
    cngKey.Dispose();
    return true;
}

然后用它来加密/解密

    public static byte[] Encrypt(string keyContainerName, byte[] clearText, byte[] iv)
    {
        AesCng aesCng = null;
        ICryptoTransform crypto = null;
        byte[] cipher = null;
        try
        {
            aesCng = new AesCng(keyContainerName);
            aesCng.IV = (iv == null ? new byte[aesCng.IV.Length] : iv);
            crypto = aesCng.CreateEncryptor();
            cipher = crypto.TransformFinalBlock(clearText, 0, clearText.Length);
        }
        finally
        {
            if (crypto != null)
            {
                crypto.Dispose();
            }
            if (aesCng != null)
            {
                aesCng.Clear();
                aesCng.Dispose();
            }
        }
        return cipher;
    }

    public static byte[] Decrypt(string keyContainerName, byte[] cipher, byte[] iv)
    {
        AesCng aesCng = null;
        ICryptoTransform crypto = null;
        byte[] clearText = null;
        try
        {
            aesCng = new AesCng(keyContainerName);
            aesCng.IV = (iv == null ? new byte[aesCng.IV.Length] : iv);
            crypto = aesCng.CreateDecryptor();
            clearText = crypto.TransformFinalBlock(cipher, 0, cipher.Length);
        }
        finally
        {
            if (crypto != null)
            {
                crypto.Dispose();
            }
            if (aesCng != null)
            {
                aesCng.Clear();
                aesCng.Dispose();
            }
        }
        return clearText;
    }

我可以导出密钥

    public static bool ExportKey(string name, out byte[] blob)
    {
        blob = null;
        if (!CngKey.Exists(name))
        {
            return false;
        }

        CngKey cngKey = CngKey.Open(name);
        blob = cngKey.Export(CngKeyBlobFormat.OpaqueTransportBlob);
        cngKey.Dispose();
        return true;
    }

但是,当我尝试导入blob时,我得到 CryptographicException:提供的句柄无效。

    public static void ImportKey(string name, byte[] blob)
    {
        CngKey cngKey = CngKey.Import(blob, CngKeyBlobFormat.OpaqueTransportBlob);
        cngKey.Dispose();
    }

我无法解释为什么失败。 任何人都可以对此有所了解吗?

感谢。

0 个答案:

没有答案