O .NET encapsula a criptografia da plataforma — CNG no Windows, OpenSSL no Linux, as bibliotecas da Apple no macOS — por trás de uma única API: ECDsa, RSA, MLDsa, MLKem e companhia. O teste rodou o .NET 10.0.13 no Ubuntu 24.04, em que o OpenSSL por baixo é o 3.0.13, e essa versão determina vários dos resultados.
A codificação de assinatura padrão é o oposto da usada pela maioria das bibliotecas do lado do servidor. ECDsa.SignData retorna o r‖s IEEE P1363 de 64 bytes e VerifyData espera esse formato; o DER exige DSASignatureFormat.Rfc3279DerSequence nas duas chamadas. Com isso, o .NET coincide, sem configuração extra, com o JWS e com a WebCrypto e diverge do OpenSSL, do SHA256withECDSA do Java e do SignASN1 do Go. Toda assinatura malformada ou incompatível faz VerifyData retornar false, então uma assinatura DER verificada com o formato padrão parece exatamente uma falsificação — o exemplo mostra os dois resultados, e o conversor DER ⇄ bruto mostra qual das duas formas você tem.
No Linux, o ECDSA cobriu da P-256 à P-521, a secp256k1 e as curvas Brainpool r1, tudo por meio do OpenSSL. SignHash assina um digest calculado por você, os nonces são aleatórios, o s não é normalizado e a verificação aceita high-S. Não há classe Ed25519 nem Ed448 na biblioteca de classes base; para EdDSA, é preciso o Bouncy Castle para .NET ou outro pacote.
MLKem, MLDsa, SlhDsa e CompositeMLDsa existem no .NET 10, mas cada uma informa IsSupported de acordo com a plataforma. Com o OpenSSL 3.0.13, o valor foi false em todas; o OpenSSL adicionou ML-KEM e ML-DSA na versão 3.5, então, no Linux, elas precisam de uma distribuição que traga essa versão e, no Windows, do suporte correspondente no CNG. O código deve verificar IsSupported em vez de presumir, e esta página não verificou nenhuma plataforma em que a resposta seja true.
As chaves são importadas de SPKI e PKCS#8 (PEM ou DER, criptografados ou não), de SEC1 EC PRIVATE KEY e de coordenadas brutas em ECParameters; não há importação de ponto SEC1 nem de JWK. Inspecione pacotes PFX com o inspetor de PFX.