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 reescribir estas llamadas de OpenSSL en PHP en la criptografía de .NET?

Necesitamos cifrar datos para un servicio de terceros. El servicio proporciona este código de muestra en PHP. La salida del código de muestra son dos valores: $encryptedText y $aesKeyEncrypted.

$plainText = 'Carga de prueba';
$privateKeyPem = '-----BEGIN RSA PRIVATE KEY----- ... ';

$aesKey = openssl_random_pseudo_bytes(16);
$encryptedText = openssl_encrypt($plainText, "AES-128-ECB", $aesKey, OPENSSL_RAW_DATA);

$privateKey = openssl_pkey_get_private($privateKeyPem);
openssl_private_encrypt($aesKey, $aesKeyEncrypted, $privateKey);

Sin embargo, nuestro código está en .NET 6. ¿Cómo puedo hacer lo mismo usando las clases de criptografía de .NET 6?

He encontrado que puedo usar RandomNumberGenerator.GetBytes(16) en lugar de openssl_random_pseudo_bytes(16), pero no tengo idea de cómo implementar el resto.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para cifrar datos para un servicio de terceros en .NET 6, puedes utilizar la clase Aes del espacio de nombres System.Security.Cryptography. Aquí tienes un ejemplo de fragmento de código para lograr el mismo resultado que el código PHP:

    using System.Security.Cryptography;
    
    string plainText = "Carga de prueba";
    byte[] aesKey = new byte[16];
    using (var randomNumberGenerator = RandomNumberGenerator.Create())
    {
        randomNumberGenerator.GetBytes(aesKey);
    }
    
    byte[] encryptedText;
    using (var aes = Aes.Create())
    {
        aes.Key = aesKey;
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.PKCS7;
    
        using (var encryptor = aes.CreateEncryptor())
        {
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
            encryptedText = encryptor.TransformFinalBlock(plainTextBytes, 0, plainTextBytes.Length);
        }
    }
    
    string privateKeyPem = "-----BEGIN RSA PRIVATE KEY----- ...";
    using (var privateKey = RSA.Create())
    {
        privateKey.ImportFromPem(privateKeyPem);
    
        byte[] aesKeyEncrypted = privateKey.Encrypt(aesKey, RSAEncryptionPadding.OaepSHA1);
    }
    

    En este código, primero generamos una clave AES aleatoria de 16 bytes usando RandomNumberGenerator.GetBytes(16) como reemplazo de openssl_random_pseudo_bytes(16).

    Luego utilizamos la clase Aes para cifrar el texto plano con la clave AES generada usando el modo ECB y el relleno PKCS7, tal como se especifica en el código PHP.

    A continuación, cargamos la clave privada RSA desde la cadena con formato PEM utilizando RSA.Create() e ImportFromPem(). Luego ciframos la clave AES con la clave privada RSA utilizando privateKey.Encrypt() y el esquema de relleno RSAEncryptionPadding.OaepSHA1. El resultado del cifrado de la clave AES es similar a $aesKeyEncrypted en el código PHP.

Comments are closed.