PlatformNotSupportedException al usar encriptación asimétrica en .NET Core y cómo resolverlo
De forma escueta y muy resumida, la encriptación asimétrica nos permite encriptar contenido con una clave pública utilizando una clave pública y privada parar encriptar y desencriptar información.
Esta técnica de seguridad se puede utilizar en .NET Core a través de la clase RSACryptoServiceProvider perteneciente al ensamblado System.Security.Cryptography.Csp dentro del namespace System.Security.Cryptography.
El siguiente recorte de código que en .NET Framework funciona perfectamente, y supuestamente generaría una clave pública y privada en .NET Core 2.2.
var rsa = new RSACryptoServiceProvider(); var privateKey = rsa.ToXmlString(true); var publicKey = rsa.ToXmlString(false);
Este código compila perfectamente, pero si tratamos de ejecutarlo, veremos que el método ToXmlString nos devuelve una excepción de tipo PlatformNotSupportedException.
Esta excepción significa que la característica NO está preparada para ser ejecutada en una determinada plataforma.
Dicho de otro modo, no está preparada para ser ejecutada en .NET Core 2.2 ó anterior.
El hecho de que se genere un problema en tiempo de ejecución en lugar de en tiempo de compilación es un problema sucio y real con el que tendremos que lidiar.
El problema de fondo como comentaba es que .NET Core 2.2 y versiones anteriores de .NET Core no tiene implementado los métodos ToXmlString y FromXmlString, devolviendo directamente la excepción PlatformNotSupportedException.
Una posible solución a este problema es utilizar un workaround o extensión para resolver este problema.
Esta extensión la podemos encontrar en github.
Pero si vamos a trabajar con .NET Core 3.0, debes saber que Microsoft ha implementado la funcionalidad que nos permite obtener la clave pública y privada sin problemas a través del método ToXmlString y introducirla a través de FromXmlString en RSA y DSA.
Encontrarás información sobre esto en este enlace.
Por si quieres investigar un poco más sobre este problema, tiene tiempo y recorrido y podrás encontrar más información sobre él en este enlace y en este otro enlace, dónde podrás observar que pese a empezar en el 2017, la conversación está viva pidiendo incluso que esta funcionalidad se incluya en versiones anteriores de .NET Core 3.0 (último mensaje hace unas horas).
Como menciono en la entrada y pese a que no esté incluido en .NET Core 2.2 ó anteriores así como la forma en la que Microsoft ha menejado esto – la cuál no es muy elegante en mi opinión que dé un error en tiempo de ejecución – existe por otro lado un workaround para resolverlo exportando los parámetros y formando la clave privada/pública con XML parseando los valores.
Espero que te haya servido.
Happy Coding!