Quiero almacenar una clave AES conocida (recuperada sin conexión) ingresándola en la aplicación una vez, guardándola en Cng para almacenarla y luego hacer referencia a ella solo por su nombre en el uso posterior.
Quiero guardar la clave en el proveedor de almacenamiento de claves para que mi aplicación no la cargue en la memoria.
Puedo crear (generar) una clave AES (que puedo recuperar y crear una instancia de AesCng ) como esta:
CngProvider keyStorageProvider = CngProvider.MicrosoftSoftwareKeyStorageProvider; CngKeyCreationParameters keyCreationParameters = new CngKeyCreationParameters() { ExportPolicy = CngExportPolicies.AllowPlaintextExport, KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey }; var name = "mykey"; var algo = new CngAlgorithm("AES"); var created = CngKey.Create(algo, name, keyCreationParameters);Pero, ¿cómo puedo agregar mi clave simétrica AES ya conocida y simplemente hacer referencia a ella por nombre la próxima vez que ejecute mi aplicación para ejecutar el cifrado/descifrado usando Cng?
El uso CngKey.Import no me permite especificar un nombre y creo que probé todas las sobrecargas, pero todas producen algún tipo de error.
ACTUALIZAR:
Este es un ejemplo de trabajo completo al crear una clave.
// Calling code byte[] key = //<from external input>; byte[] data = new byte[] { 0xA, 0xB, 0xC, 0xD }; crypto.StoreKey("appkey", key); var encryptedData = crypto.EncryptWithStoredKey("appkey", data); // Implementation public void StoreKey(string name, byte[] key) { CngKeyCreationParameters keyCreationParameters = new CngKeyCreationParameters() { KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey }; var algo = new CngAlgorithm("AES"); // Question: How can I import the byte[] key with name "appkey" instead of generating a new key here? CngKey.Create(algo, name, keyCreationParameters); } public byte[] EncryptWithStoredKey(string name, byte[] data) { using (var cng = new AesCng(name)) using (var encryptor = cng.CreateEncryptor()) using (var memoryStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { cryptoStream.Write(data, 0, data.Length); cryptoStream.FlushFinalBlock(); return memoryStream.ToArray(); } } }