> 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/ja/gaido/dtanoto/kdodtanopkcs7.md).

# カードデータの暗号化（PKCS#7形式）

Push Provisioning SDK に渡されるカード情報は暗号化されています。オンボーディング時に提供された TSH イシュア ゲートウェイ証明書を使用してください。

### 暗号化されたデータペイロード <a href="#encrypted-data-payload" id="encrypted-data-payload"></a>

ペイロードは暗号化前に文字列としてシリアライズされた JSON オブジェクトです。JSON 構造には以下のフィールドが含まれます：

| JSON フィールド名             | 説明                                                                                                | MOC | コメント                                                                 |
| ----------------------- | ------------------------------------------------------------------------------------------------- | --- | -------------------------------------------------------------------- |
| issuerCardRefId         | <p>物理カードの一意の識別子。<br>この値は に提供された値と同じです。 <code>authorizationCode</code> (JWT の 'sub' クレーム)。</p>     | M   | 注: これは PAN 値ではありません。                                                 |
| fpan                    | ファンディングカードの主要口座番号（Primary Account Number）。                                                        | M   |                                                                      |
| exp                     | 有効期限を MMYY 形式で表したもの。                                                                              | M   |                                                                      |
| cardHolderName          | カードに印刷されているカード所有者の氏名。MasterCard の場合、氏名の最大長は 27 文字です。                                              | M   |                                                                      |
| postalAddress           | <p>カード所有者の郵送先住所を表すオブジェクト。<br><em>次の定義を参照してください。</em></p>                                          | C   | それは **必須です** Click to Pay に対して。                                      |
| phoneNumber             | <p>カード所有者の電話番号。<br>最大長は 16 です。</p>                                                                | C   | <p>注: 国番号は含みません。<br>それは <strong>必須です</strong> Click to Pay に対して。</p> |
| phoneNumberCountryCode  | <p>電話番号の国番号。<br>例: 米国は "1"、フランスは "33"、英国は "44"。<br>最大長は 4 です。</p>                                 | C   | それは **必須です** Click to Pay に対して。                                      |
| email                   | <p>カード所有者の電子メール。<br>最大長は 48 です。</p>                                                               | C   | それは **必須です** Click to Pay に対して。                                      |
| issuerClientInformation | <p>イシュアのシステムでキャプチャされた情報に従い、イシュアからトークンリクエスタに共有されるクライアント情報を表すオブジェクト。<br><em>次の定義を参照してください</em>.</p> | C   | それは **必須です** Click to Pay に対して。                                      |
| termsAndConditionsId    | この ID は、オンボーディングプロセス中に Discover TSP によって生成された「利用規約」に関連付けられた一意の ID を表します。                          | C   | それは **必須です** Discover の場合 – Google/Samsung Pay へのプッシュ。               |

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

| JSON フィールド名 | 説明                                                             | MOC |
| ----------- | -------------------------------------------------------------- | --- |
| line1       | <p>請求先住所の第1行。<br>最大長は 64 です。</p>                               | M   |
| line2       | <p>請求先住所の第2行。<br>最大長は 64 です。</p>                               | O   |
| city        | <p>請求先住所の市区町村。<br>最大長は 32 です。</p>                              | M   |
| postalCode  | <p>請求先住所の郵便番号（例：米国の zipcode）。<br>最大長は 10 です。</p>               | M   |
| country     | <p>請求先住所の国。<br>ISO 3166-1 で定義される 3 文字（alpha-3）国コードで表現されます。</p> | M   |

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

| JSON フィールド名     | 説明                                                                                                            | MOC | コメント                                                                      |
| --------------- | ------------------------------------------------------------------------------------------------------------- | --- | ------------------------------------------------------------------------- |
| issuerAccountID | <p>イシュアのシステムから取得した顧客口座の識別子。<br>許容される最大長は 24 文字です。</p>                                                         | C   | <p>注: これはカードの PAN ではありません。<br>それは <strong>必須です</strong> VISA によるものです。</p> |
| firstName       | <p>イシュアのシステムから取得した顧客の名。<br>許容される最大長は 80 文字です。</p>                                                             | M   |                                                                           |
| middleName      | <p>イシュアのシステムから取得した顧客のミドルネーム。<br>許容される最大長は 80 文字です。</p>                                                        | O   |                                                                           |
| lastName        | <p>イシュアのシステムから取得した顧客の姓。<br>許容される最大長は 80 文字です。</p>                                                             | M   |                                                                           |
| country         | 顧客の国コード（ISO 3166-1 alpha-2 形式）。                                                                               | O   | 指定されない場合のデフォルトは "US" です                                                   |
| locale          | <p>アプリが顧客と通信する言語。<br>これは ISO639-1 言語コードに続けて "\_" 区切り、その後に ISO 3166-1 alpha-2 国コードを付けたものです。<br>例："en\_US"。</p> | O   | 指定されない場合のデフォルトは "en\_US" です。                                              |

### 暗号化 <a href="#encryption" id="encryption"></a>

#### 鍵と証明書 <a href="#keys-and-certificates" id="keys-and-certificates"></a>

TSH 証明書はオンボーディング時にイシュアに提供されます。カード資格情報および個人データを含む JSON ペイロードを暗号化するためにそれを使用してください。

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

PCI に敏感なデータと個人情報は PKCS#7 の enveloped-data 形式を使用して暗号化されます。これにより機密性が確保されます。

PKCS#7 暗号化方式は 次の文書で定義されています。 [RFC 2315](https://tools.ietf.org/html/rfc2315) および [RFC 5652](https://tools.ietf.org/html/rfc5652)。主要な暗号ライブラリでサポートされています。

これらの暗号化パラメータを使用してください：

* 使用されるコンテンツ暗号化アルゴリズムは `AES256/CBC/PKCS7Padding` で、ランダムに生成された AES 鍵を使用します。
* 鍵暗号化アルゴリズムは `RSA/NONE/OAEPWithSHA256AndMGF1Padding` （注： `MGF1` パディングは `SHA256`を使用します）オンボーディングプロセス中に提供された TSH 証明書を使用します。
* 暗号化の結果は 16 進文字列として提供されます。

{% 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 %}

暗号化されたペイロードの例：

```
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/ja/gaido/dtanoto/kdodtanopkcs7.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.
