Pregunta

Tengo que poner en práctica un sobre digital usando un algoritmo AES y RSA, pero estoy teniendo problemas con la aplicación .NET del algoritmo RSA.

He conseguido para cifrar los datos (AES) con la clave simétrica aleatoria, pero ahora tengo para cifrar la clave con RSA.

La clave es una matriz de bytes (byte[]) y la clave pública que tengo me dice que sólo el módulo y el exponente público, ambas matrices de bytes (byte[]).

Usando sólo estos dos parámetros, ¿cómo puedo encriptar mi AES clave generada con RSA?

El siguiente código recupera el mensaje del archivo y lo cifra con AES. Posteriormente, la clave pública se lee desde el archivo de clave pública y el módulo y el exponente se encuentran en sus matrices de bytes correspondientes. ¿Cómo iba a continuar para cifrar el symmetricKey con RSA?

String msgString = Systematic.GetFileContents(messagePath);
Byte[] initVector = new byte[] { 50, 60, 70, 80, 90, 40, 50, 60, 70, 80, 90, 40, 60, 80, 70, 90 };
Byte[] symetricKey = AesCrypt.GenerateRandomKey();
Byte[] encryptedMessage = AesCrypt.Encrypt(msgString, symetricKey, initVector, mode);
Byte[] modulus = null;
Byte[] publicExp = null; 
DataFormatHelper.ReadPublicKey(publicKeyPath, "RSA", ref modulus, ref publicExp);

P.S. En respuesta a la rsa.ImportParameters mencionar respuesta: He tratado con el rsa.ImportParameters(keyInfo) pero lanza una CryptographicException ("Bad Data"). ¿Qué hay de tamaños de matriz? Actualmente, el módulo es de 128 bytes y el exponente de 64 bytes.

¿Fue útil?

Solución

Uso RSACryptoServiceProvider

static public byte[] RSAEncrypt(byte[] data,
    RSAParameters keyInfo, 
    bool doOAEPPadding)
{
    byte[] encryptedData;
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        //Import the RSA Key information. This only needs
        //toinclude the public key information.
        rsa.ImportParameters(keyInfo);

        //Encrypt the passed byte array and specify OAEP padding.  
        //OAEP padding is only available on Microsoft Windows XP or later.  
        encryptedData = rsa.Encrypt(data, doOAEPPadding);
    }
    return encryptedData;       
}

Así que lo que necesita son los RSAParameters pero todo lo que necesita para establecer son el módulo y el exponente para cifrar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top