es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo comprobar si el par de claves privada/pública coincide.

Actualmente, lo estoy haciendo mediante la encriptación de algunos datos con una clave pública y luego decodificando con una clave privada.

La desencriptación fallará si el par no coincide.

using System.Security.Cryptography;

var rsa = RSA.Create();

var publicKeyBytes = Convert.FromBase64String(publicKey);
rsa.ImportRSAPublicKey(publicKeyBytes, out var _);
var encryptedBytes = rsa.Encrypt(new byte[] {}, RSAEncryptionPadding.Pkcs1);

var privateKeyBytes = Convert.FromBase64String(privateKey);
rsa.ImportRSAPrivateKey(privateKeyBytes, out var _);
var decryptedBytes = rsa.Decrypt(encryptedBytes, RSAEncryptionPadding.Pkcs1);

si el par de claves pública y privada no coinciden, la descodificación fallará con “CryptographicException”.

¿Existe una forma más elegante de validar este par utilizando las propiedades integradas en .NET (System.Security)?

PD: Es un poco irrelevante para la pregunta, pero ¿está bien hacer esta validación al inicio de la aplicación?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, existe una manera más elegante de validar el par de claves utilizando las herramientas incluidas en .NET (System.Security). La clase RSA proporciona el método VerifyData y el enum RSASignaturePadding para permitir la verificación de la corrección del par de claves. Aquí hay un ejemplo:

    using System.Security.Cryptography;
    
    var rsa = RSA.Create();
    
    var publicKeyBytes = Convert.FromBase64String(publicKey);
    rsa.ImportRSAPublicKey(publicKeyBytes, out var _);
    
    // Datos de ejemplo para firmar/verificar
    var data = new byte[] { 1, 2, 3, 4 };
    
    var signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    
    var privateKeyBytes = Convert.FromBase64String(privateKey);
    rsa.ImportRSAPrivateKey(privateKeyBytes, out var _);
    
    var isValidSignature = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    

    isValidSignature será true si el par de claves es correcto y los datos no han sido manipulados.

    En cuanto a realizar esta validación al inicio de la aplicación, debería estar bien siempre y cuando el par de claves no cambie con frecuencia. Sin embargo, sería mejor realizar esta validación una vez y guardar el resultado en lugar de hacerlo en cada inicio.

Comments are closed.