using System; using System.Security.Cryptography; using System.Text; namespace LevelCode.License.Security { public static class RsaService { // ========================= // GERAR PAR DE CHAVES // ========================= public static void GerarParDeChaves( out string chavePublica, out string chavePrivada, int tamanho = 2048) { using (var rsa = new RSACryptoServiceProvider(tamanho)) { chavePublica = rsa.ToXmlString(false); // public key chavePrivada = rsa.ToXmlString(true); // private key } } // ========================= // ASSINAR TEXTO (PRIVATE KEY) // ========================= public static string Assinar(string texto, string chavePrivada) { if (string.IsNullOrWhiteSpace(texto)) throw new ArgumentException("Texto inválido para assinatura."); using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(chavePrivada); byte[] dados = Encoding.UTF8.GetBytes(texto); byte[] assinatura = rsa.SignData(dados, CryptoConfig.MapNameToOID("SHA256")); return Convert.ToBase64String(assinatura); } } // ========================= // VALIDAR ASSINATURA (PUBLIC KEY) // ========================= public static bool ValidarAssinatura( string texto, string assinaturaBase64, string chavePublica) { if (string.IsNullOrWhiteSpace(texto) || string.IsNullOrWhiteSpace(assinaturaBase64)) return false; using (var rsa = new RSACryptoServiceProvider()) { rsa.FromXmlString(chavePublica); byte[] dados = Encoding.UTF8.GetBytes(texto); byte[] assinatura = Convert.FromBase64String(assinaturaBase64); return rsa.VerifyData( dados, CryptoConfig.MapNameToOID("SHA256"), assinatura); } } } }