

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 一般函數
<a name="use-cases-issuers.generalfunctions"></a>

**Topics**
+ [產生隨機接腳和相關聯的 PVV，然後驗證值](use-cases-issuers.generalfunctions.pvv.md)
+ [產生或驗證指定卡片的 CVV](use-cases-issuers.generalfunctions.cvv.md)
+ [產生或驗證特定卡片的 CVV2](use-cases-issuers.generalfunctions.cvv2.md)
+ [產生或驗證特定卡片的 iCVV](use-cases-issuers.generalfunctions.icvv.md)
+ [驗證 EMV ARQC 並產生 ARPC](use-cases-issuers.generalfunctions.arqc.md)
+ [產生和驗證 EMV MAC](use-cases-issuers.generalfunctions.emvmac.md)
+ [針對 PIN 變更產生 EMV MAC](use-cases-issuers.generalfunctions.emvpinchange.md)

# 產生隨機接腳和相關聯的 PVV，然後驗證值
<a name="use-cases-issuers.generalfunctions.pvv"></a>

**Topics**
+ [建立 key(s)](#use-cases-issuers.generalfunctions.pvv.setup)
+ [產生隨機 PIN 碼、產生 PVV 並傳回加密的 PIN 碼和 PVV](#use-cases-issuers.generalfunctions.pvv.generate)
+ [使用 PVV 方法驗證加密的 PIN](#use-cases-issuers.generalfunctions.pvv.verify)

## 建立 key(s)
<a name="use-cases-issuers.generalfunctions.pvv.setup"></a>

為了產生隨機接腳和 [PVV](terminology.md#terms.pvv)，您需要兩個金鑰：用於產生 PVV 的[接腳驗證金鑰 (PVK)](terminology.md#terms.pvk)，以及用於加密接腳的[接腳加密金鑰](terminology.md#terms.pek)。接腳本身會在服務內安全地隨機產生，且與任一金鑰的密碼編譯無關。

PGK 必須是以 PVV 演算法本身為基礎的演算法 TDES\$12KEY 金鑰。PEK 可以是 TDES\$12KEY、TDES\$13KEY 或 AES\$1128。在這種情況下，由於 PEK 旨在供系統內部使用，因此 AES\$1128 是不錯的選擇。如果 PEK 用於與其他系統 （例如，卡網路、收單機構、ATMs) 交換，或作為遷移的一部分進行移動，則基於相容性原因，TDES\$12KEY 可能是更適當的選擇。

### 建立 PEK
<a name="use-cases-issuers.generalfunctions.pvv.setup.pek"></a>

```
$ aws payment-cryptography create-key \
               --exportable 
               --key-attributes KeyAlgorithm=AES_128,KeyUsage=TR31_P0_PIN_ENCRYPTION_KEY,\
                   KeyClass=SYMMETRIC_KEY,\
                   KeyModesOfUse='{Encrypt=true,Decrypt=true,Wrap=true,Unwrap=true}' --tags='[{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
               "Key": {
                   "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt",
                   "KeyAttributes": {
                       "KeyUsage": "TR31_P0_PIN_ENCRYPTION_KEY",
                       "KeyClass": "SYMMETRIC_KEY",
                       "KeyAlgorithm": "AES_128",
                       "KeyModesOfUse": {
                           "Encrypt": false,
                           "Decrypt": false,
                           "Wrap": false,
                           "Unwrap": false,
                           "Generate": true,
                           "Sign": false,
                           "Verify": true,
                           "DeriveKey": false,
                           "NoRestrictions": false
                       }
                   },
                   "KeyCheckValue": "7CC9E2",
                   "KeyCheckValueAlgorithm": "CMAC",
                   "Enabled": true,
                   "Exportable": true,
                   "KeyState": "CREATE_COMPLETE",
                   "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                   "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00",
                   "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00"
               }
           }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/ivi5ksfsuplneuyt*。在下一個步驟中，您需要用到。

### 建立 PVK
<a name="use-cases-issuers.generalfunctions.pvv.setup.pvk"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_V2_VISA_PIN_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}'  --tags='[{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
                  "Key": {
                      "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza",
                      "KeyAttributes": {
                          "KeyUsage": "TR31_V2_VISA_PIN_VERIFICATION_KEY",
                          "KeyClass": "SYMMETRIC_KEY",
                          "KeyAlgorithm": "TDES_2KEY",
                          "KeyModesOfUse": {
                              "Encrypt": false,
                              "Decrypt": false,
                              "Wrap": false,
                              "Unwrap": false,
                              "Generate": true,
                              "Sign": false,
                              "Verify": true,
                              "DeriveKey": false,
                              "NoRestrictions": false
                          }
                      },
                      "KeyCheckValue": "51A200",
                      "KeyCheckValueAlgorithm": "ANSI_X9_24",
                      "Enabled": true,
                      "Exportable": true,
                      "KeyState": "CREATE_COMPLETE",
                      "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                      "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00",
                      "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00"
                  }
              }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/ov6icy4ryas4zcza*。在下一個步驟中，您需要用到。

## 產生隨機 PIN 碼、產生 PVV 並傳回加密的 PIN 碼和 PVV
<a name="use-cases-issuers.generalfunctions.pvv.generate"></a>

**Example**  
在此範例中，我們將產生新的 （隨機） 4 位數接腳，其中輸出將是加密的 `PIN block`(PinData.PinBlock) 和 `PVV`(pinData.VerificationValue). 金鑰輸入為 `PAN`、 `Pin Verification Key`（也稱為 PIN 產生金鑰）、 `Pin Encryption Key`和 [PIN 區塊](terminology.md#terms.pinblock)格式。  
 此命令要求金鑰類型為 `TR31_V2_VISA_PIN_VERIFICATION_KEY`。  

```
$ aws payment-cryptography-data generate-pin-data --generation-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/37y2tsl45p5zjbh2 --encryption-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt --primary-account-number 171234567890123 --pin-block-format ISO_FORMAT_0 --generation-attributes VisaPin={PinVerificationKeyIndex=1}
```

```
{
            "GenerationKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/37y2tsl45p5zjbh2",
            "GenerationKeyCheckValue": "7F2363",
            "EncryptionKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt",
            "EncryptionKeyCheckValue": "7CC9E2",
            "EncryptedPinBlock": "AC17DC148BDA645E",
            "PinData": {
                "VerificationValue": "5507"
            }
        }
```

## 使用 PVV 方法驗證加密的 PIN
<a name="use-cases-issuers.generalfunctions.pvv.verify"></a>

**Example**  
在此範例中，我們將驗證指定 PAN 的 PIN。PIN 通常由持卡人或使用者在驗證的交易時間提供，並與檔案上的值進行比較 （持卡人的輸入會以終端機或其他上游提供者的加密值提供）。為了驗證此輸入，也會在執行時間提供下列值 - 加密的接腳、用來加密輸入接腳的金鑰 （通常稱為 [IWK](terminology.md#terms.iwk))，`PAN`以及要驗證的值 ( `PVV`或 `PIN offset`)。  
如果 AWS 付款密碼編譯能夠驗證 PIN，則會傳回 http/200。如果未驗證 PIN 碼，則會傳回 http/400。  

```
$ aws payment-cryptography-data verify-pin-data --verification-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/37y2tsl45p5zjbh2 --encryption-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt --primary-account-number 171234567890123 --pin-block-format ISO_FORMAT_0  --verification-attributes VisaPin="{PinVerificationKeyIndex=1,VerificationValue=5507}" --encrypted-pin-block AC17DC148BDA645E 
```

```
{
        "VerificationKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/37y2tsl45p5zjbh2",
        "VerificationKeyCheckValue": "7F2363",
        "EncryptionKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt",
        "EncryptionKeyCheckValue": "7CC9E2",
}
```

# 產生或驗證指定卡片的 CVV
<a name="use-cases-issuers.generalfunctions.cvv"></a>

[CVV](terminology.md#terms.cvv) 或 CVV1 是傳統上內嵌在卡片磁性條紋中的值。它與 CVV2 不同 （持卡人可見並用於線上購買）。

第一步是建立金鑰。在本教學課程中，您會建立 [CVK](terminology.md#terms.cvk) 雙長度 3DES (2KEY TDES) 金鑰。

**注意**  
CVV、CVV2 和 iCVV 全都使用類似的演算法，但會改變輸入資料。所有 都使用相同的金鑰類型 TR31\$1C0\$1CARD\$1VERIFICATION\$1KEY，但建議針對每個用途使用不同的金鑰。這些可以使用別名和/或標籤來區分，如以下範例所示。

## 建立金鑰
<a name="use-cases-issuers.generalfunctions.cvv.setup"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_C0_CARD_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}' --tags='[{"Key":"KEY_PURPOSE","Value":"CVV"},{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
            "Key": {
                "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/r52o3wbqxyf6qlqr",
                "KeyAttributes": {
                    "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY",
                    "KeyClass": "SYMMETRIC_KEY",
                    "KeyAlgorithm": "TDES_2KEY",
                    "KeyModesOfUse": {
                        "Encrypt": false,
                        "Decrypt": false,
                        "Wrap": false,
                        "Unwrap": false,
                        "Generate": true,
                        "Sign": false,
                        "Verify": true,
                        "DeriveKey": false,
                        "NoRestrictions": false
                    }
                },
                "KeyCheckValue": "DE89F9",
                "KeyCheckValueAlgorithm": "ANSI_X9_24",
                "Enabled": true,
                "Exportable": true,
                "KeyState": "CREATE_COMPLETE",
                "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00",
                "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00"
            }
        }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/r52o3wbqxyf6qlqr*。在下一個步驟中，您需要用到。

## 產生 CVV
<a name="use-cases-issuers.generalfunctions.cvv.generate"></a>

**Example**  
在此範例中，我們將為指定的 PAN 產生 [CVV](terminology.md#terms.cvv)，其輸入為 `PAN`，服務碼 （如 ISO/IEC 7813 所定義） 為 121，卡片過期日期。  
如需所有可用的參數，請參閱 API 參考指南中的 [CardVerificationValue1](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue1.html)。  

```
$ aws payment-cryptography-data generate-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/r52o3wbqxyf6qlqr --primary-account-number=171234567890123 --generation-attributes CardVerificationValue1='{CardExpiryDate=1127,ServiceCode=121}'
```

```
                  {
                      "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/r52o3wbqxyf6qlqr",
                      "KeyCheckValue": "DE89F9",
                      "ValidationData": "801"
                  }
```

## 驗證 CVV
<a name="use-cases-issuers.generalfunctions.cvv.verify"></a>

**Example**  
在此範例中，我們將使用 [CVK](terminology.md#terms.cvv)`PAN`、、服務代碼 121、卡片過期日期和交易期間提供的 CVV 輸入來驗證指定 PAN 的 CVV。  
如需所有可用的參數，請參閱 API 參考指南中的 [CardVerificationValue1](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue1.html)。  
CVV 不是使用者輸入的值 （例如 CVV2)，但通常內嵌在磁條上。應考慮是否應一律在提供時驗證。

```
$ aws payment-cryptography-data verify-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/r52o3wbqxyf6qlqr --primary-account-number=171234567890123 --verification-attributes CardVerificationValue1='{CardExpiryDate=1127,ServiceCode=121} --validation-data 801
```

```
{
                    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/r52o3wbqxyf6qlqr",
                    "KeyCheckValue": "DE89F9",
                    "ValidationData": "801"
}
```

# 產生或驗證特定卡片的 CVV2
<a name="use-cases-issuers.generalfunctions.cvv2"></a>

[CVV2](terminology.md#terms.cvv2) 是傳統上在卡片背面提供的值，用於線上購買。對於虛擬卡，它也可能顯示在應用程式或螢幕上。密碼編譯方式與 CVV1 相同，但具有不同的服務代碼值。

## 建立金鑰
<a name="use-cases-issuers.generalfunctions.cvv2.setup"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_C0_CARD_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}' --tags='[{"Key":"KEY_PURPOSE","Value":"CVV2"},{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
               "Key": {
                   "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/7f7g4spf3xcklhzu",
                   "KeyAttributes": {
                       "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY",
                       "KeyClass": "SYMMETRIC_KEY",
                       "KeyAlgorithm": "TDES_2KEY",
                       "KeyModesOfUse": {
                           "Encrypt": false,
                           "Decrypt": false,
                           "Wrap": false,
                           "Unwrap": false,
                           "Generate": true,
                           "Sign": false,
                           "Verify": true,
                           "DeriveKey": false,
                           "NoRestrictions": false
                       }
                   },
                   "KeyCheckValue": "AEA5CD",
                   "KeyCheckValueAlgorithm": "ANSI_X9_24",
                   "Enabled": true,
                   "Exportable": true,
                   "KeyState": "CREATE_COMPLETE",
                   "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                   "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00",
                   "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00"
               }
           }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/7f7g4spf3xcklhzu*。在下一個步驟中，您需要用到。

## 產生 CVV2
<a name="use-cases-issuers.generalfunctions.cvv2.generate"></a>

**Example**  
在此範例中，我們將為輸入 `PAN`和卡片過期日期的指定 PAN 產生 [CVV2](terminology.md#terms.cvv2)。  
如需所有可用的參數，請參閱 API 參考指南中的 [CardVerificationValue2](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue2.html)。  

```
$ aws payment-cryptography-data generate-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/7f7g4spf3xcklhzu --primary-account-number=171234567890123 --generation-attributes CardVerificationValue2='{CardExpiryDate=1127}'
```

```
                     {
                         "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/7f7g4spf3xcklhzu",
                         "KeyCheckValue": "AEA5CD",
                         "ValidationData": "321"
                     }
```

## 驗證 CVV2
<a name="use-cases-issuers.generalfunctions.cvv2.verify"></a>

**Example**  
在此範例中，我們將使用 CVK 的輸入、`PAN`卡片過期日期和交易期間提供的 CVV 來驗證指定 PAN 的 CVV[CVV2](terminology.md#terms.cvv2)。  
如需所有可用的參數，請參閱《 API 參考指南》中的 [CardVerificationValue2](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue2.html)。  
CVV2 和其他輸入是使用者輸入的值。因此，這不一定是定期無法驗證問題的跡象。

```
$ aws payment-cryptography-data verify-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/7f7g4spf3xcklhzu --primary-account-number=171234567890123 --verification-attributes CardVerificationValue2='{CardExpiryDate=1127} --validation-data 321
```

```
{
                       "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/7f7g4spf3xcklhzu",
                       "KeyCheckValue": "AEA5CD",
                       "ValidationData": "801"
   }
```

# 產生或驗證特定卡片的 iCVV
<a name="use-cases-issuers.generalfunctions.icvv"></a>

[iCVV ](terminology.md#terms.icvv)使用與 CVV/CVV2 相同的演算法，但 iCVV 內嵌在晶片卡中。其服務代碼為 999。

## 建立金鑰
<a name="use-cases-issuers.generalfunctions.icvv.setup"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_C0_CARD_VERIFICATION_KEY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{Generate=true,Verify=true}' --tags='[{"Key":"KEY_PURPOSE","Value":"ICVV"},{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
               "Key": {
                   "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/c7dsi763r6s7lfp3",
                   "KeyAttributes": {
                       "KeyUsage": "TR31_C0_CARD_VERIFICATION_KEY",
                       "KeyClass": "SYMMETRIC_KEY",
                       "KeyAlgorithm": "TDES_2KEY",
                       "KeyModesOfUse": {
                           "Encrypt": false,
                           "Decrypt": false,
                           "Wrap": false,
                           "Unwrap": false,
                           "Generate": true,
                           "Sign": false,
                           "Verify": true,
                           "DeriveKey": false,
                           "NoRestrictions": false
                       }
                   },
                   "KeyCheckValue": "1201FB",
                   "KeyCheckValueAlgorithm": "ANSI_X9_24",
                   "Enabled": true,
                   "Exportable": true,
                   "KeyState": "CREATE_COMPLETE",
                   "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                   "CreateTimestamp": "2023-06-05T06:41:46.648000-07:00",
                   "UsageStartTimestamp": "2023-06-05T06:41:46.626000-07:00"
               }
           }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/c7dsi763r6s7lfp3*。在下一個步驟中，您需要用到。

## 產生 iCVV
<a name="use-cases-issuers.generalfunctions.icvv.generate"></a>

**Example**  
在此範例中，我們將為指定的 PAN 產生 [iCVV，](terminology.md#terms.icvv)其輸入為 `PAN`、服務碼 （如 ISO/IEC 7813 所定義） 為 999 且卡片過期日期。  
如需所有可用的參數，請參閱 API 參考指南中的 [CardVerificationValue1](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue1.html)。  

```
$ aws payment-cryptography-data generate-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/c7dsi763r6s7lfp3 --primary-account-number=171234567890123 --generation-attributes CardVerificationValue1='{CardExpiryDate=1127,ServiceCode=999}'
```

```
                     {
                         "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/c7dsi763r6s7lfp3",
                         "KeyCheckValue": "1201FB",
                         "ValidationData": "532"
                     }
```

## 驗證 iCVV
<a name="use-cases-issuers.generalfunctions.icvv.verify"></a>

**Example**  
為了進行驗證，輸入為 CVK、`PAN`、999 的服務碼、卡片過期日期，以及交易期間提供的 iCVV 以進行驗證。  
如需所有可用的參數，請參閱《 API 參考指南》中的 [CardVerificationValue1](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_CardVerificationValue1.html)。  
iCVV 不是使用者輸入的值 （如 CVV2)，但通常內嵌在 EMV/晶片卡上。應考慮是否應一律在提供時驗證。

```
$ aws payment-cryptography-data verify-card-validation-data --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/c7dsi763r6s7lfp3 --primary-account-number=171234567890123 --verification-attributes CardVerificationValue1='{CardExpiryDate=1127,ServiceCode=999} --validation-data 532
```

```
{
                       "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/c7dsi763r6s7lfp3",
                       "KeyCheckValue": "1201FB",
                       "ValidationData": "532"
   }
```

# 驗證 EMV ARQC 並產生 ARPC
<a name="use-cases-issuers.generalfunctions.arqc"></a>

[ARQC](terminology.md#terms.arqc) (Authorization Request Cryptogram) 是由 EMV （晶片） 卡產生的密碼編譯，用於驗證交易詳細資訊以及授權卡的使用。它包含來自卡片、終端機和交易本身的資料。

在後端的驗證時間，相同的輸入會提供給 AWS 付款密碼編譯，密碼編譯會在內部重新建立，並與交易提供的值進行比較。就這個意義而言，它類似於 MAC。[EMV 4.4 Book 2](https://www.emvco.com/specifications/?post_id=80377) 定義此函數的三個層面：金鑰衍生方法 （稱為通用工作階段金鑰 - CSK)，以產生一次性交易金鑰、最低承載和產生回應的方法 (ARPC)。

 個別卡片方案可以指定要納入的其他交易欄位，或這些欄位出現的順序。其他 （通常已棄用） 方案特定的衍生方案也存在，並涵蓋在本文件的其他部分。

如需詳細資訊，請參閱 API 指南中的 [VerifyCardValidationData](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyCardValidationData.html)。

## 建立金鑰
<a name="use-cases-issuers.generalfunctions.arqc.setup"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_E0_EMV_MKEY_APP_CRYPTOGRAMS,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{DeriveKey=true}' --tags='[{"Key":"KEY_PURPOSE","Value":"CVN18"},{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
                "Key": {
                    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk",
                    "KeyAttributes": {
                        "KeyUsage": "TR31_E0_EMV_MKEY_APP_CRYPTOGRAMS",
                        "KeyClass": "SYMMETRIC_KEY",
                        "KeyAlgorithm": "TDES_2KEY",
                        "KeyModesOfUse": {
                            "Encrypt": false,
                            "Decrypt": false,
                            "Wrap": false,
                            "Unwrap": false,
                            "Generate": false,
                            "Sign": false,
                            "Verify": false,
                            "DeriveKey": true,
                            "NoRestrictions": false
                        }
                    },
                    "KeyCheckValue": "08D7B4",
                    "KeyCheckValueAlgorithm": "ANSI_X9_24",
                    "Enabled": true,
                    "Exportable": true,
                    "KeyState": "CREATE_COMPLETE",
                    "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
                    "CreateTimestamp": "2024-03-07T06:41:46.648000-07:00",
                    "UsageStartTimestamp": "2024-03-07T06:41:46.626000-07:00"
                }
            }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/pw3s6nl62t5ushfk*。在下一個步驟中，您需要用到。

## 產生 ARQC
<a name="use-cases-issuers.generalfunctions.arqc.generate"></a>

ARQC 僅由 EMV 卡產生。因此， AWS 付款密碼編譯沒有產生此類承載的設施。基於測試目的，許多程式庫可在線上使用，可產生適當的承載，以及各種方案通常提供的已知值。

## 驗證 ARQC
<a name="use-cases-issuers.generalfunctions.arqc.verify"></a>

**Example**  
如果 AWS 付款密碼編譯能夠驗證 ARQC，則會傳回 http/200。驗證 ARQC 之後，可以選擇提供 ARPC （回應） 並包含在回應中。  

```
$ aws payment-cryptography-data verify-auth-request-cryptogram --auth-request-cryptogram 61EDCC708B4C97B4 --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk --major-key-derivation-mode EMV_OPTION_A --transaction-data 00000000170000000000000008400080008000084016051700000000093800000B1F2201030000000000000000000000000000000000000000000000000000008000000000000000 --session-key-derivation-attributes='{"EmvCommon":{"ApplicationTransactionCounter":"000B", "PanSequenceNumber":"01","PrimaryAccountNumber":"9137631040001422"}}' --auth-response-attributes='{"ArpcMethod2":{"CardStatusUpdate":"12345678"}}'
```

```
{
    "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk",
    "KeyCheckValue": "08D7B4",
    "AuthResponseValue":"2263AC85"
}
```

# 產生和驗證 EMV MAC
<a name="use-cases-issuers.generalfunctions.emvmac"></a>

EMV MAC 是 MAC，使用 EMV 衍生金鑰的輸入，然後對產生的資料執行 ISO9797-3 （零售） MAC。EMV MAC 通常用於將命令傳送至 EMV 卡，例如解除封鎖指令碼。

**注意**  
 AWS 付款密碼編譯不會驗證指令碼的內容。如需要包含的特定命令詳細資訊，請參閱您的方案或卡片手冊。

如需詳細資訊，請參閱 API 指南中的 [MacAlgorithmEmv](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_MacAlgorithmEmv.html)。

**Topics**
+ [建立金鑰](#use-cases-issuers.generalfunctions.emvmac.setup)
+ [產生 EMV MAC](#use-cases-issuers.generalfunctions.emvmac.generate)

## 建立金鑰
<a name="use-cases-issuers.generalfunctions.emvmac.setup"></a>

```
$ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=TDES_2KEY,KeyUsage=TR31_E2_EMV_MKEY_INTEGRITY,KeyClass=SYMMETRIC_KEY,KeyModesOfUse='{DeriveKey=true}' --tags='[{"Key":"KEY_PURPOSE","Value":"CVN18"},{"Key":"CARD_BIN","Value":"12345678"}]'
```

回應會回傳請求參數，包括後續呼叫的 ARN 以及金鑰檢查值 (KCV)。

```
{
        "Key": {
            "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk",
            "KeyAttributes": {
                "KeyUsage": "TR31_E2_EMV_MKEY_INTEGRITY",
                "KeyClass": "SYMMETRIC_KEY",
                "KeyAlgorithm": "TDES_2KEY",
                "KeyModesOfUse": {
                    "Encrypt": false,
                    "Decrypt": false,
                    "Wrap": false,
                    "Unwrap": false,
                    "Generate": false,
                    "Sign": false,
                    "Verify": false,
                    "DeriveKey": true,
                    "NoRestrictions": false
                }
            },
            "KeyCheckValue": "08D7B4",
            "KeyCheckValueAlgorithm": "ANSI_X9_24",
            "Enabled": true,
            "Exportable": true,
            "KeyState": "CREATE_COMPLETE",
            "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
            "CreateTimestamp": "2024-03-07T06:41:46.648000-07:00",
            "UsageStartTimestamp": "2024-03-07T06:41:46.626000-07:00"
        }
    }
```

請記下代表金鑰`KeyArn`的 ，例如 *arn：aws：payment-cryptography：us-east-2：111122223333：key/pw3s6nl62t5ushfk*。在下一個步驟中，您需要用到。

## 產生 EMV MAC
<a name="use-cases-issuers.generalfunctions.emvmac.generate"></a>

典型的流程是後端程序會產生 EMV 指令碼 （例如卡片解除封鎖），使用此命令簽署它 （衍生特定卡片的一次性金鑰），然後傳回 MAC。然後，命令 \$1 MAC 會傳送至要套用的卡片。將命令傳送至卡片超出 AWS 付款密碼編譯的範圍。

**注意**  
 此命令適用於未傳送加密資料 （例如 PIN) 的命令。EMV Encrypt 可以與此命令結合，在呼叫此命令之前將加密的資料附加到發行者指令碼 

訊息資料  
訊息資料包含 APDU 標頭和命令。雖然這可能因實作而有所不同，但此範例是 unblock (84 24 00 00 08) 的 APDU 標頭，後面接著 ATC (0007)，然後是先前交易的 ARQC (999E57FD0F47CACE)。服務不會驗證此欄位的內容。

工作階段金鑰衍生模式  
此欄位定義工作階段金鑰的產生方式。EMV\$1COMMON\$1SESSION\$1KEY 通常用於新實作，而 EMV2000 \$1 AMEX \$1 MASTERCARD\$1SESSION\$1KEY \$1 VISA 也可以使用。

MajorKeyDerivationMode  
EMV 定義模式 A、B 或 C。模式 A 是最常見的，而 AWS 付款密碼編譯目前支援模式 A 或模式 B。

PAN  
帳戶號碼，通常可在晶片欄位 5A 或 ISO8583 欄位 2 中使用，但也可以從卡片系統擷取。

PSN  
卡片序號。如果未使用，請輸入 00。

SessionKeyDerivationValue  
這是每個工作階段衍生資料的 。它可以是欄位 9F26 的最後一個 ARQC(ApplicationCryptogram)，也可以是 9F36 的最後一個 ATC，具體取決於衍生方案。

填補  
填補會自動套用，並使用 ISO/IEC 9797-1 填補方法 2。

**Example**  

```
$ aws payment-cryptography-data generate-mac --message-data 84240000080007999E57FD0F47CACE --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk --message-data 8424000008999E57FD0F47CACE0007 --generation-attributes EmvMac="{MajorKeyDerivationMode=EMV_OPTION_A,PanSequenceNumber='00',PrimaryAccountNumber='2235521304123282',SessionKeyDerivationMode=EMV_COMMON_SESSION_KEY,SessionKeyDerivationValue={ApplicationCryptogram='999E57FD0F47CACE'}}"
```

```
{
"KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk",
"KeyCheckValue": "08D7B4",
"Mac":"5652EEDF83EA0D84"
}
```

# 針對 PIN 變更產生 EMV MAC
<a name="use-cases-issuers.generalfunctions.emvpinchange"></a>

EMV PIN 變更結合了兩個操作：為發行者指令碼產生 MAC，以及為 EMV 晶片卡上的離線 PIN 變更加密新的 PIN。只有在 PIN 碼存放在晶片卡上的某些國家/地區 （歐洲國家/地區通用），才需要此命令。當持卡人需要變更其 PIN 碼，且新的 PIN 碼必須與 MAC 一起安全地傳輸至卡片，以驗證命令的真實性時，通常會使用此功能。

**注意**  
 如果您只需要將命令傳送至卡片，但不需要變更 PIN 碼，請考慮改用 [ARPC CSU](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_VerifyAuthRequestCryptogram.html) 或[產生 EMV MAC](use-cases-issuers.generalfunctions.emvmac.md) 命令。

如需詳細資訊，請參閱 API 指南中的 [GenerateMacEmvPinChange](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GenerateMacEmvPinChange.html)。

## 針對 PIN 變更產生 EMV MAC 和加密 PIN
<a name="use-cases-issuers.generalfunctions.emvpinchange.generate"></a>

此操作需要兩個金鑰：用於產生 MAC 的 EMV 完整性金鑰 (KeyUsage： TR31\$1E2\$1EMV\$1MKEY\$1INTEGRITY)，以及用於 PIN 加密的 EMV 機密性金鑰 (KeyUsage： TR31\$1E4\$1EMV\$1MKEY\$1CONFIDENTIALITY)。典型的流程是後端程序會產生 EMV PIN 變更指令碼，其中包含發行者指令碼的 MAC 和加密的新 PIN。然後，命令和加密的 PIN 會傳送到卡片以更新離線 PIN。將命令傳送至卡片超出 AWS 付款密碼編譯的範圍。

訊息資料  
訊息資料包含發行者指令碼的 APDU 命令。服務不會驗證此欄位的內容。

新的加密 PIN 區塊  
將傳送至卡片的新加密 PIN 區塊。這必須使用 PIN 加密金鑰做為加密值提供。

新的 PIN PEK 識別符  
用來加密新 PIN 碼的金鑰，然後再傳遞至此 API。

安全傳訊完整性金鑰  
用於產生 MAC 的 EMV 完整性金鑰 (KeyUsage： TR31\$1E2\$1EMV\$1MKEY\$1INTEGRITY)。

安全傳訊機密性金鑰  
用於 PIN 加密的 EMV 機密性金鑰 (KeyUsage： TR31\$1E4\$1EMV\$1MKEY\$1CONFIDENTIALITY)。

MajorKeyDerivationMode  
EMV 定義了模式 A、B 或 C。模式 A 是最常見的，而 AWS 付款密碼編譯目前支援模式 A 或模式 B。

Mode  
加密模式，通常是用於 PIN 變更操作的 CBC。

PAN  
帳戶號碼，通常可在晶片欄位 5A 或 ISO8583 欄位 2 中使用，但也可以從卡片系統擷取。

PanSequenceNumber  
卡片序號。如果未使用，請輸入 00。

ApplicationCryptogram  
這是每個工作階段衍生資料，通常是欄位 9F26 的最後一個 ARQC。

PinBlockLengthPosition  
指定 PIN 區塊長度的編碼位置。通常設定為 NONE。如果您不確定，請檢查您的卡片方案規格。

PinBlockPaddingType  
指定 PIN 區塊的填補類型。通常設定為 NO\$1PADDING。如果您不確定，請檢查您的卡片方案規格。

**Example**  

```
$ aws payment-cryptography-data generate-mac-emv-pin-change \
    --message-data 00A4040008A000000004101080D80500000001010A04000000000000 \
    --new-encrypted-pin-block 67FB27C75580EFE7 \
    --new-pin-pek-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt \
    --pin-block-format ISO_FORMAT_0 \
    --secure-messaging-confidentiality-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi \
    --secure-messaging-integrity-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk \
    --derivation-method-attributes 'EmvCommon={ApplicationCryptogram=1234567890123457,MajorKeyDerivationMode=EMV_OPTION_A,Mode=CBC,PanSequenceNumber=00,PinBlockLengthPosition=NONE,PinBlockPaddingType=NO_PADDING,PrimaryAccountNumber=171234567890123}'
```

```
{
    "SecureMessagingIntegrityKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/pw3s6nl62t5ushfk",
    "SecureMessagingIntegrityKeyCheckValue": "08D7B4",
    "SecureMessagingConfidentialityKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi",
    "SecureMessagingConfidentialityKeyCheckValue": "C1EB8F",
    "Mac": "5652EEDF83EA0D84",
    "EncryptedPinBlock": "F1A2B3C4D5E6F7A8"
}
```