private static PacoteCriptografado CriptografarDados(string original, RsaWithRsaParameterKey rsaParams) { var aes = new AesEncryption(); var sessaoDaChave = NumerosAleatorios.GerarNumerosAletorios(32); var pacoteCriptografado = new PacoteCriptografado { Iv = NumerosAleatorios.GerarNumerosAletorios(16) }; pacoteCriptografado.DadosCriptografados = aes.Criptografar(Encoding.UTF8.GetBytes(original), sessaoDaChave, pacoteCriptografado.Iv); pacoteCriptografado.ChaveDaSessaoCriptografada = rsaParams.CriptografarDados(sessaoDaChave); using (var hmac = new HMACSHA256(sessaoDaChave)) { pacoteCriptografado.Hmac = hmac.ComputeHash(pacoteCriptografado.DadosCriptografados); } return(pacoteCriptografado); }
private static string DescriptografarDados(PacoteCriptografado blocoCriptografado, RsaWithRsaParameterKey rsaParams) { var aes = new AesEncryption(); var sessaoDaChaveDescriptografada = rsaParams.DescriptografarDados(blocoCriptografado.ChaveDaSessaoCriptografada); using (var hmac = new HMACSHA256(sessaoDaChaveDescriptografada)) { var hmacParaVerificar = hmac.ComputeHash(blocoCriptografado.DadosCriptografados); if (!Compare(blocoCriptografado.Hmac, hmacParaVerificar)) { throw new CryptographicException("HMAC para a descodificação não corresponde pacote criptografado."); } } var dadosDescriptografados = aes.Descriptografar(blocoCriptografado.DadosCriptografados, sessaoDaChaveDescriptografada, blocoCriptografado.Iv); return(Encoding.UTF8.GetString(dadosDescriptografados)); }