Crie corretamente RSACryptoServiceProvider a partir da chave pública

Atualmente, estou tentando criar umRSACryptoServiceProvider objeto exclusivamente de um arquivo PEM decodificado. Após vários dias de pesquisa, consegui organizar uma solução funcional, mas não era uma que estivesse pronta para produção.

Em poucas palavras, para criar umRSACryptoServiceProvider objeto dos bytes que compõem a chave pública em um arquivo PEM, devo criar o objeto especificando o tamanho da chave (atualmente 2048 usando SHA256, especificamente) e depois importar umRSAParameters objeto com oExponent eModulus conjunto. Eu estou fazendo isso assim;

byte[] publicKeyBytes = Convert.FromBase64String(deserializedPublicKey.Replace("-----BEGIN PUBLIC KEY-----", "")
                                                                      .Replace("-----END PUBLIC KEY-----", ""));

// extract the modulus and exponent based on the key data
byte[] exponentData = new byte[3];
byte[] modulusData = new byte[256];
Array.Copy(publicKeyBytes, publicKeyBytes.Length - exponentData.Length, exponentData, 0, exponentData.Length);
Array.Copy(publicKeyBytes, 9, modulusData, 0, modulusData.Length);


// import the public key data (base RSA - works)
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(dwKeySize: 2048);
RSAParameters rsaParam = rsa.ExportParameters(false);
rsaParam.Modulus = modulusData;
rsaParam.Exponent = exponentData;
rsa.ImportParameters(rsaParam);

Enquanto isso funciona, não é viável supor que odeserializedPublicKey terá exatamente 270 bytes e o módulo que eu preciso está localizado na posição 9 e sempre terá 256 bytes de comprimento.

Como altero isso para selecionar corretamente o byte do módulo e do expoente, com base em um conjunto de bytes de chave pública? Tentei entender o padrão ASN.1, mas com pouca sorte para encontrar o que preciso dele - os padrões são um pouco bizantinos.

Qualquer ajuda é apreciada.

questionAnswers(3)

yourAnswerToTheQuestion