> For the complete documentation index, see [llms.txt](https://docs.payments.thalescloud.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.payments.thalescloud.io/classic-push-provisioning/es/guia-del-desarrollador/cifrado-y-autenticacion-de-datos/cifrado-de-datos-de-la-tarjeta-formato-pkcs-7.md).

# Cifrado de datos de la tarjeta (formato PKCS#7)

Los datos de la tarjeta enviados al SDK de Provisionamiento Push están encriptados. Use el certificado TSH Issuer Gateway proporcionado durante la incorporación.

### Carga útil de datos encriptada <a href="#encrypted-data-payload" id="encrypted-data-payload"></a>

La carga útil es el objeto JSON serializado como una cadena antes de la encriptación. La estructura JSON contiene los siguientes campos:

| Nombre del campo JSON   | Descripción                                                                                                                                                                                                            | MOC | Comentario                                                                                      |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | ----------------------------------------------------------------------------------------------- |
| issuerCardRefId         | <p>Un identificador único de la tarjeta física.<br>Este valor es el mismo que el valor proporcionado en <code>authorizationCode</code> (reclamo 'sub' del JWT).</p>                                                    | M   | Nota: Este no es el valor PAN.                                                                  |
| fpan                    | Número de cuenta principal (PAN) de la tarjeta de financiación.                                                                                                                                                        | M   |                                                                                                 |
| exp                     | La fecha de vencimiento en formato MMYY.                                                                                                                                                                               | M   |                                                                                                 |
| cardHolderName          | El nombre del titular tal como aparece impreso en la tarjeta. Para MasterCard, la longitud máxima del nombre es de 27 caracteres.                                                                                      | M   |                                                                                                 |
| postalAddress           | <p>Objeto que representa la dirección postal del titular de la tarjeta.<br><em>Vea la siguiente definición.</em></p>                                                                                                   | C   | Es **requerido** para Click to Pay.                                                             |
| phoneNumber             | <p>El número de teléfono del titular de la tarjeta.<br>La longitud máxima es 16.</p>                                                                                                                                   | C   | <p>Nota: No contiene el código de país.<br>Es <strong>requerido</strong> para Click to Pay.</p> |
| phoneNumberCountryCode  | <p>El código de país del número de teléfono.<br>Ejemplo: "1" para EE. UU., "33" para Francia, "44" para Reino Unido.<br>La longitud máxima es 4.</p>                                                                   | C   | Es **requerido** para Click to Pay.                                                             |
| email                   | <p>El correo electrónico del titular de la tarjeta.<br>La longitud máxima es 48.</p>                                                                                                                                   | C   | Es **requerido** para Click to Pay.                                                             |
| issuerClientInformation | <p>El objeto que representa la información del cliente compartida desde el emisor con el solicitante del token según la información capturada en los sistemas del emisor.<br><em>Vea la siguiente definición</em>.</p> | C   | Es **requerido** para Click to Pay.                                                             |
| termsAndConditionsId    | Este ID representa el identificador único asociado a los “Términos y condiciones” generados por Discover TSP durante el proceso de incorporación.                                                                      | C   | Es **requerido** para Discover – push a Google/Samsung Pay.                                     |

#### estructura postalAddress <a href="#postaladdress-structure" id="postaladdress-structure"></a>

| Nombre del campo JSON | Descripción                                                                                                                                | MOC |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | --- |
| line1                 | <p>Primera línea de la dirección de facturación.<br>La longitud máxima es 64.</p>                                                          | M   |
| line2                 | <p>Segunda línea de la dirección de facturación.<br>La longitud máxima es 64.</p>                                                          | O   |
| city                  | <p>La ciudad de la dirección de facturación.<br>La longitud máxima es 32.</p>                                                              | M   |
| postalCode            | <p>El código postal (por ejemplo, código postal en EE. UU.) de la dirección de facturación.<br>La longitud máxima es 10.</p>               | M   |
| country               | <p>El país de la dirección de facturación.<br>Se expresa como un código de país de 3 letras (alpha-3) tal como se define en ISO 3166-1</p> | M   |

#### estructura issuerClientInformation <a href="#issuerclientinformation-structure" id="issuerclientinformation-structure"></a>

| Nombre del campo JSON | Descripción                                                                                                                                                                                              | MOC | Comentario                                                                               |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --- | ---------------------------------------------------------------------------------------- |
| issuerAccountID       | <p>Identificador de la cuenta del cliente capturado desde los sistemas del emisor.<br>La longitud máxima permitida es de 24 caracteres.</p>                                                              | C   | <p>Nota: Este no es el PAN de la tarjeta.<br>Es <strong>requerido</strong> por VISA.</p> |
| firstName             | <p>Nombre del cliente capturado desde los sistemas del emisor<br>La longitud máxima permitida es de 80 caracteres.</p>                                                                                   | M   |                                                                                          |
| middleName            | <p>Segundo nombre del cliente capturado desde los sistemas del emisor<br>La longitud máxima permitida es de 80 caracteres.</p>                                                                           | O   |                                                                                          |
| lastName              | <p>Apellido del cliente capturado desde los sistemas del emisor<br>La longitud máxima permitida es de 80 caracteres.</p>                                                                                 | M   |                                                                                          |
| country               | Código de país del cliente en formato ISO 3166-1 alpha-2.                                                                                                                                                | O   | Si no se proporciona, el valor por defecto es "US"                                       |
| locale                | <p>Idioma en el que la aplicación se comunica con el cliente.<br>Este es el código de idioma ISO639-1 seguido del separador "\_" y luego el código de país ISO 3166-1 alpha-2.<br>Ejemplo: "en\_US".</p> | O   | Si no se proporciona, el valor por defecto es "en\_US".                                  |

### Cifrado <a href="#encryption" id="encryption"></a>

#### Claves y certificados <a href="#keys-and-certificates" id="keys-and-certificates"></a>

Se proporciona un certificado TSH al emisor durante la incorporación. Úselo para encriptar la carga útil JSON que contiene las credenciales de la tarjeta y los datos personales.

#### Formato PKCS7 <a href="#pkcs7-format" id="pkcs7-format"></a>

Los datos sensibles según PCI y la información personal se encriptan usando el formato PKCS#7 de tipo enveloped-data. Esto garantiza confidencialidad.

El esquema de encriptación PKCS#7 está definido en [RFC 2315](https://tools.ietf.org/html/rfc2315) y [RFC 5652](https://tools.ietf.org/html/rfc5652). Es compatible con las principales bibliotecas criptográficas.

Use estos parámetros de encriptación:

* El algoritmo de encriptación del contenido usado es `AES256/CBC/PKCS7Padding` que utiliza una clave AES generada aleatoriamente.
* El algoritmo de encriptación de la clave es `RSA/NONE/OAEPWithSHA256AndMGF1Padding` (Nota: `MGF1` el relleno usa `SHA256`) usando el certificado TSH proporcionado durante el proceso de incorporación.
* El resultado de la encriptación se proporciona luego como una cadena hexadecimal.

{% tabs %}
{% tab title="Java" %}

```java
package com.gemalto.test.pkcs7;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Security;
import java.security.spec.MGF1ParameterSpec;
import java.util.Collection;
import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PSource;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;

import org.bouncycastle.cms.CMSAlgorithm;
import org.bouncycastle.cms.CMSEnvelopedData;
import org.bouncycastle.cms.CMSEnvelopedDataGenerator;
import org.bouncycastle.cms.CMSProcessableByteArray;
import org.bouncycastle.cms.KeyTransRecipientInformation;
import org.bouncycastle.cms.RecipientInformation;
import org.bouncycastle.cms.bc.BcCMSContentEncryptorBuilder;
import org.bouncycastle.cms.jcajce.JceKeyTransEnvelopedRecipient;
import org.bouncycastle.cms.jcajce.JceKeyTransRecipientInfoGenerator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.jcajce.JcaAlgorithmParametersConverter;
import org.bouncycastle.util.encoders.Hex;

public class TpcEncryptPkcs7 {

    private static final String DATA_TO_ENCRYPT = "{\"fpan\":\"987654321123456789\",\"issuerCardRefId\":\"abc1245784219\",\"exp\":\"1223\",\"cardholderName\":\"John\""
            + ",\"postalAddress\":{\"line1\":\"address1\",\"line2\":\"address2\",\"city\":\"City1\",\"postalCode\":\"12345\",\"state\":\"state1\",\"country\":\"Country1\"}}";

    private static final String KEY_IDENTIFIER = "a_key_id";

    private static final BouncyCastleProvider bcProvider;
    private static PrivateKey privKey;
    private static PublicKey pubKey;

    static {
        bcProvider = new BouncyCastleProvider();
        Security.addProvider(bcProvider);
    }

    public static void main(String[] args) throws Exception {

        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        KeyPair kp = kpg.generateKeyPair();
        privKey = kp.getPrivate();
        pubKey = kp.getPublic();

        // Encrypt
        byte[] encData = encryptPKCS7(DATA_TO_ENCRYPT.getBytes("UTF-8"), pubKey);
        System.out.println("Encrypted data = " + Hex.toHexString(encData));

        // Decrypt
        byte[] result = decryptPKCS7(encData, privKey);
        System.out.println("Decrypted data = " + new String(result));

    }

    private static byte[] encryptPKCS7(byte[] plainData, PublicKey pubKey) throws Exception {

        CMSEnvelopedDataGenerator gen = new CMSEnvelopedDataGenerator();

        JcaAlgorithmParametersConverter paramsConverter = new JcaAlgorithmParametersConverter();
        OAEPParameterSpec oaepParamSpec = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
        AlgorithmIdentifier algoId = paramsConverter.getAlgorithmIdentifier(PKCSObjectIdentifiers.id_RSAES_OAEP, oaepParamSpec);

        JceKeyTransRecipientInfoGenerator recipInfo = new JceKeyTransRecipientInfoGenerator(KEY_IDENTIFIER.getBytes(), algoId, pubKey)
                .setProvider(bcProvider);

        gen.addRecipientInfoGenerator(recipInfo);

        CMSProcessableByteArray data = new CMSProcessableByteArray(plainData);
        BcCMSContentEncryptorBuilder builder = new BcCMSContentEncryptorBuilder(CMSAlgorithm.AES256_CBC);

        CMSEnvelopedData enveloped = gen.generate(data, builder.build());

        return enveloped.getEncoded();
    }

    private static byte[] decryptPKCS7(byte[] encryptedData, PrivateKey privKey) throws Exception {
        CMSEnvelopedData enveloped = new CMSEnvelopedData(encryptedData);
        Collection<RecipientInformation> recip = enveloped.getRecipientInfos().getRecipients();
        KeyTransRecipientInformation rinfo = (KeyTransRecipientInformation) recip.iterator().next();
        return rinfo.getContent(new JceKeyTransEnvelopedRecipient(privKey).setProvider(bcProvider));
    }

}
```

{% endtab %}

{% tab title="C#" %}

```csharp
AsymmetricCipherKeyPair keyPair;

using (var txtreader = new StringReader(privateKey))
{
    keyPair = (AsymmetricCipherKeyPair)new PemReader(txtreader).ReadObject();
}

var bytesToDecrypt = Convert.FromBase64String(base64Input);

CmsEnvelopedData env = new CmsEnvelopedData(bytesToDecrypt);

KeyTransRecipientInformation recip = (KeyTransRecipientInformation)new System.Collections.ArrayList(env.GetRecipientInfos().GetRecipients())[0];

var message = recip.GetContent(keyPair.Private);

return System.Text.Encoding.GetEncoding("ISO-8859-1").GetString(message);
```

{% endtab %}
{% endtabs %}

Ejemplo de carga útil encriptada:

```
308006092A864886F70D010703A0803080020102318201513082014D0201028006497373756572303C06092A864886F70D010107302FA00F300D06096086480165030402010500A11C301A06092A864886F70D010108300D060960864801650304020105000482010014B297DCE72EBA08152514FE422FC66D7F1E216F685C1DF38E8335B4921098BB0FBFDCA33D0B7936F9810FD8E042DC2BED366B699351E0E4A55139504A469DCBA7E826C9E6C2FCB4766CC58E83C4DC21E2F5368D6FBB048354ADBAC2F121C9956E1CFDA5CE400D07D0088F847E32A2DFAD3A9BDC98A298EF78BF76262ECA387149BD9AA99C6C1B9875AD07828F00EE091F8F8598292F3A723B31FD1125F0B391595C08D249BEA1CF9F66E543CD69EB4509C191562EF6C96CF6FDDF6594B2B8EB1560C79F843FF1E16FB1313D9959605F3B99F2F18F56197D20501DED5311764FEE4E23E2F9A1CB1E9D7B507A536B254B7D8E3F50A642B73A4B2E73D4F045B2A7308006092A864886F70D010701301D060960864801650304012A041044581CF583193FD8E155FAAD73E3D817A080048180798EC2C1B0EFB6A6160B033DAED79FADBDD0DAB7139384A2CF85A85D309939744C36FE20868231C3EDEB9CE9DF3BA481344026838E65E9729519D6353472E2CE04871212FA68BFF57F2E86BD7718FCD4107E60F97170579982E129573652F7F8D7144825D1B22282305A0FA342F207641C7A2A0FE7FA9AEF5E4DA2CA718BFFAA00000000000000000000
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.payments.thalescloud.io/classic-push-provisioning/es/guia-del-desarrollador/cifrado-y-autenticacion-de-datos/cifrado-de-datos-de-la-tarjeta-formato-pkcs-7.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
