

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

# AS2805
<a name="advanced.regional.as2805"></a>

Australia Standard 2805 (AS2805) 是主要用於卡片付款交易之電子轉帳的標準。它由 [Standards Australia](https://www.standards.org.au/) 維護。標準包含 6 本書籍，涵蓋從訊息格式到加密標準的許多主題。

第 6 部分提供金鑰管理的指引host-to-host(node-to-node通訊和相關密碼編譯要求，而其他部分則涵蓋其他層面。此標準中的所有密碼編譯目前都以 TDES 為基礎。

**注意**  
 AS2805 目前可在 ap-southeast-2 區域中使用。它將在不久的將來推展到其他區域。

AS2805 與其他實作相比有許多差異，摘要如下。

*金鑰保護*  
依賴金鑰變體而不是 TR-31/X9.143. AWS Payment Cryptography 中的 等金鑰區塊，將所有金鑰存放為內部的金鑰區塊，但允許使用 AS2805 定義的變體進行匯入、匯出和計算。

*單向金鑰*  
AS2805 必須使用單向金鑰。如果兩個節點都需要產生訊息驗證碼 (MAC)，它們會使用兩個金鑰。

*Pin 區塊*  
AS2805 為每個交易定義唯一 PIN 加密金鑰的金鑰衍生技術。這可以用來取代 DUKPT。相較於 DUKPT 使用交易計數器，AS2805 方案依賴交易資料 （追蹤數目和交易金額）。

*金鑰交換驗證*  
定義程序來驗證 KEK，然後再開始交換工作金鑰，例如 PIN 金鑰。在其他方案中，KEK 不常交換，並使用 KCV 進行驗證。

AS2805 使用金鑰變體的概念，而不是金鑰區塊，以確保金鑰僅用於預期 （和唯一） 用途。以下是使用金鑰匯入、匯出或執行其他密碼編譯函數時， AWS 付款密碼編譯如何在變體和金鑰區塊之間映射。


| AS2805 金鑰類型 | AWS 付款密碼編譯金鑰類型 | 
| --- | --- | 
| TERMINAL\$1MAJOR\$1KEY\$1VARIANT\$100 |  TR31\$1K0\$1KEY\$1ENCRYPTION\$1KEY | 
| PIN\$1ENCRYPTION\$1KEY\$1VARIANT\$128 |  TR31\$1P0\$1PIN\$1ENCRYPTION\$1KEY | 
| MESSAGE\$1AUTHENTICATION\$1KEY\$1VARIANT\$124 |  TR31\$1M0\$1ISO\$116609\$1MAC\$1KEY | 
| DATA\$1ENCRYPTION\$1KEY\$1VARIANT\$122 |  TR31\$1D0\$1SYMMETRIC\$1DATA\$1ENCRYPTION\$1KEY | 
| VARIANT\$1MASK\$182、VARIANT\$1MASK\$182C0 |  KEK 驗證程序中可用的選項。這些金鑰類型是暫時性的，不會由 服務存放。 | 

假設有兩個節點，節點 1 和節點 2，下列範例是從節點 1 的角度來看。 AWS 付款密碼編譯支援程序兩側的 APIs。

**Topics**
+ [初始金鑰 (KEK) 交換](as2805.kekexchange.md)
+ [KEK 驗證](as2805.kekvalidation.md)
+ [建立和傳輸工作金鑰](as2805.workingkeys.create.md)
+ [匯出工作金鑰](as2805.workingkeys.export.md)
+ [接腳轉譯](as2805.pintranslation.md)
+ [Mac 產生和驗證](as2805.mac.md)

# 初始金鑰 (KEK) 交換
<a name="as2805.kekexchange"></a>

 在 AS2805 中，每一端都有自己的 KEK。KEK(s) 是指每當傳送端需要保護/包裝金鑰並將其傳送至 node2 時，將使用的傳送端金鑰。KEK(r) 是由 opposite(node2) 端建立的金鑰。

**注意**  
這些術語是相對的 - 一端建立金鑰 （傳送端），另一端接收到金鑰。因此，指定 KEY1，它在節點 1 上稱為 KEK(s)，在節點 2 上稱為 KEK(r)。

 AS2805 的 KEK 始終是金鑰類型 = TR31\$1K0\$1KEY\$1ENCRYPTION\$1KEY，因為它們用於保護密碼編譯，而不是金鑰區塊。這對應至 AS2805 6.1 中定義的 TERMINAL\$1MAJOR\$1KEY\$1VARIANT\$100 

步驟：

**1.建立金鑰**  
使用 [CreateKey](create-keys.md) api 建立金鑰。您將建立 TR31\$1K0\$1KEY\$1ENCRYPTION\$1KEY 類型的金鑰

**2.決定與 node2 交換金鑰的方法**  
決定如何[與對手方交換 KEK](keys-export.md)。對於 AS2805，最常見的互通方法是 RSA Wrap。

**3.匯出 KEKs**  
根據上述選擇，您將會從 node2 收到公有金鑰憑證。您將使用該憑證執行匯出以保護金鑰 （如果使用 ECDH，則衍生金鑰）。

**4. 匯入 KEKr**  
根據上述選擇，您會將公有金鑰憑證傳送至 node2。您將使用該憑證執行匯入至 ，將節點 2 的 KEKr 載入服務。

# KEK 驗證
<a name="as2805.kekvalidation"></a>

![\[使用 AWS 付款密碼編譯之 PIN 應用程式的高階網路圖表範例\]](http://docs.aws.amazon.com/zh_tw/payment-cryptography/latest/userguide/images/as2805/kek_validation.png)


當您的服務 (node1) 連線到 node2 時，每一端都會確保使用相同的 KEK 進行後續操作，並使用稱為 KEK 驗證的程序。

**1。驗證第一個金鑰的步驟**

**1.1 接收 KRs**  
Node2 KRs，並將其作為登入程序的一部分傳送給您。他們可以使用 AWS 付款密碼編譯來產生此值或其他解決方案。

**1.2 產生 KEK 驗證回應**  
您的節點將產生 KEK 驗證回應，並將輸入做為步驟 1 中提供的 KEK(r) 和 KRs。  

**Example**  

```
cat >> generate-kek-validation-response.json
{
    "KekValidationType": {
        "KekValidationResponse": {
            "RandomKeySend": "9217DC67B8763BABCFDF3DADFCD0F84A"
        }
    },
    "RandomKeySendVariantMask": "VARIANT_MASK_82",
    "KeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza"
}
```

```
$ aws payment-cryptography-data generate-as2805-kek-validation --cli-input-json file://generate-kek-validation-response.json
```

```
{
 "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza",
 "KeyCheckValue": "0A3674",
 "RandomKeyReceive": "A4B7E249C40C98178C1B856DB7FB76EB",
 "RandomKeySend": "9217DC67B8763BABCFDF3DADFCD0F84A"
}
```

**1.3 傳回計算的 KRr**  
將計算的 KRr 傳回至 node2。該節點會將其與步驟 1 的計算值進行比較。

**2.驗證第二個金鑰的步驟**

**2.1 產生 KRr KRs**  
您的節點將使用 AWS 付款密碼編譯產生隨機值和此值的反轉 （反轉） 副本。服務會輸出這兩個由 KEK 包裝的值 (KEK)。這些稱為 KR(s) 和 KR(r)。  

**Example**  

```
cat >> generate-kek-validation-request.json 
{
    "KekValidationType": {
        "KekValidationRequest": {
            "DeriveKeyAlgorithm": "TDES_2KEY"
        }
    },
"RandomKeySendVariantMask": "VARIANT_MASK_82",
    "KeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/rhfm6tenpxapkmrv"
}
```

```
$ aws payment-cryptography-data generate-as2805-kek-validation --cli-input-json file://generate-kek-validation-request.json
```

```
{
 "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/rhfm6tenpxapkmrv",
 "KeyCheckValue": "DC1081",
 "RandomKeyReceive": "A4B7E249C40C98178C1B856DB7FB76EB",
 "RandomKeySend": "9217DC67B8763BABCFDF3DADFCD0F84A"
}
```

**2.2 將 KRs傳送至 node2**  
將 KRs傳送至 node2。保留 KRr 以供稍後驗證。

**2.3 Node2 產生 KEK 驗證回應**  
Node2 使用 KEKr KRs、產生 KRr 並將其傳回給您的服務。

**2.4 驗證回應**  
比較步驟 1 的 KRr 和步驟 3 傳回的值。如果相符，請繼續。

# 建立和傳輸工作金鑰
<a name="as2805.workingkeys.create"></a>

AS2805 中使用的一般工作金鑰包含兩組金鑰：

節點之間的金鑰，例如：區域 PIN 金鑰 (ZPK)、區域加密金鑰 (ZEK) 和區域身分驗證金鑰 (ZAK)。

如果不使用 DUKPT，則終端機和節點之間的金鑰，例如：終端機主金鑰 (TMK) 和終端機接腳金鑰 (TPK)。

**注意**  
我們建議盡可能將每個終端金鑰的金鑰和利用 TR-34 和 DUKPT 等技術，盡可能使用較少數量的金鑰。

**Example**  
在此範例中，我們使用選用標籤來追蹤此金鑰的用途和使用方式。標籤不會用作系統密碼編譯函數的一部分，但可用於分類、財務追蹤，並可用於套用 IAM 政策。  

```
cat >> create-zone-pin-key.json 
{
    "KeyAttributes": {
        "KeyUsage": "TR31_P0_PIN_ENCRYPTION_KEY",
        "KeyClass": "SYMMETRIC_KEY",
        "KeyAlgorithm": "TDES_2KEY",
        "KeyModesOfUse": {
            "Encrypt": true,
            "Decrypt": true,
            "Wrap": true,
            "Unwrap": true,
            "Generate": false,
            "Sign": false,
            "Verify": false,
            "DeriveKey": false,
            "NoRestrictions": false
        }
    },
    "KeyCheckValueAlgorithm": "ANSI_X9_24",
    "Exportable": true,
    "Enabled": true,
    "Tags": [
        {
            "Key": "AS2805_KEYTYPE",
            "Value": "ZONE_PIN_KEY_VARIANT28"
        }
    ]
}
```

```
$ aws payment-cryptography-data create-key --cli-input-json file://create-zone-pin-key.json --region ap-southeast-2
```

```
{
 "Key": {
 "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/alsuwfxug3pgy6xh",
 "KeyAttributes": {
 "KeyUsage": "TR31_P0_PIN_ENCRYPTION_KEY",
 "KeyClass": "SYMMETRIC_KEY",
 "KeyAlgorithm": "TDES_2KEY",
 "KeyModesOfUse": {
 "Encrypt": true,
 "Decrypt": true,
 "Wrap": true,
 "Unwrap": true,
 "Generate": false,
 "Sign": false,
 "Verify": false,
 "DeriveKey": false,
 "NoRestrictions": false
 }
 },
 "KeyCheckValue": "9A325B",
 "KeyCheckValueAlgorithm": "ANSI_X9_24",
 "Enabled": true,
 "Exportable": true,
 "KeyState": "CREATE_COMPLETE",
 "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
 "CreateTimestamp": "2025-12-17T09:05:27.586000-08:00",
 "UsageStartTimestamp": "2025-12-17T09:05:27.570000-08:00"
 }
}
```

# 匯出工作金鑰
<a name="as2805.workingkeys.export"></a>

為了維持與其他方的相容性， AWS 付款密碼編譯支援 AS2805 對稱金鑰包裝技術，這些技術使用金鑰變體，而不是 TR-31 等金鑰區塊。如果各方之間共用多個金鑰，則每個金鑰都應個別匯出。如果資料是雙向傳送，則相同類型的各方之間可能會有兩個金鑰，例如 ZAK(s) 和 ZAK(r)，由每一端用來產生訊息驗證碼。

要以這些格式匯入和匯出的其他參數會在命令上指定。

```
cat >> export-zone-pin-key.json 
{
    "ExportKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/alsuwfxug3pgy6xh",
    "KeyMaterial": {
        "As2805KeyCryptogram": {
            "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/rhfm6tenpxapkmrv",
            "As2805KeyVariant: "PIN_ENCRYPTION_KEY_VARIANT_28"
        }
    }
}
```

```
$ aws payment-cryptography-data export-key --cli-input-json file://export-zone-pin-key.json --region ap-southeast-2
```

```
{
    "WrappedKey": {
        "KeyCheckValue": "DC1081",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "KeyMaterial": "HDC10AEF038E695DDD72AF08DC1BB422D",
        "WrappedKeyMaterialFormat": "KEY_CRYPTOGRAM",
        "WrappingKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/rhfm6tenpxapkmrv"
    }
}
```

# 接腳轉譯
<a name="as2805.pintranslation"></a>

AS2805 說明第 6.4 節中的工作階段特定金鑰衍生模式。它做為 DUKPT 提供相同的用途，而且任一演算法都可以做為 DUKPT 使用，如第 6.7 節所述。在此機制中，工作階段 PIN 金鑰 （稱為 KPE) 衍生自使用 SystemTraceAuditNumber(STAN) 和 TransactionAmount 作為衍生資料的終端機 Pin 金鑰。

翻譯接腳是一種常見函數，可以翻譯成各種格式或從中翻譯。在此範例中，我們會將接腳從 KPE 轉換為接腳加密金鑰 (PEK)，例如將接腳傳送到付款網路時。

```
cat >> translate-pin-as2805.json 
{
    "EncryptedPinBlock": "B3B34B43BAB5F81A",
    "IncomingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ivi5ksfsuplneuyt",
    "IncomingTranslationAttributes": {
        "IsoFormat0": {
            "PrimaryAccountNumber": "9999179999900013"
        }
    },
      "IncomingAs2805Attributes": {
        "SystemTraceAuditNumber": "000348",
        "TransactionAmount": "000000000328"
    },
    "OutgoingKeyIdentifier": "",
    "OutgoingTranslationAttributes": {    
        "IsoFormat0": {
            "PrimaryAccountNumber": "9999179999900013"
        }
    }
}
```

```
$ aws payment-cryptography-data translate-pin-data --cli-input-json file://translate-pin-as2805.json  --region ap-southeast-2
```

```
{
    "WrappedKey": {
        "KeyCheckValue": "DC1081",
        "KeyCheckValueAlgorithm": "ANSI_X9_24",
        "KeyMaterial": "HDC10AEF038E695DDD72AF08DC1BB422D",
        "WrappedKeyMaterialFormat": "KEY_CRYPTOGRAM",
        "WrappingKeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/rhfm6tenpxapkmrv"
    }
}
```

# Mac 產生和驗證
<a name="as2805.mac"></a>

產生和驗證 MAC 命令支援各種 MACs，包括 HMAC、CMAC、EMV MAC 等。對於 AS2805，AS2805.4.1 中定義了額外的變化。在 AS2805 中，通常會使用此 MAC 驗證傳入訊息，而傳出訊息也包含 MAC。

```
cat verify-mac.json 
{
    "KeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6",
    "Mac": "86304058",
    "MessageData": "73D8BA54D3852951DAEA41",
    "VerificationAttributes": {
        "Algorithm": "AS2805_4_1"
    }
}
```

```
$ aws payment-cryptography-data verify-mac --cli-input-json file://verify-mac.json --region ap-southeast-2
```

```
{
    "KeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/qnobl5lghrzunce6",
    "KeyCheckValue": "2976E7"
}
```