

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 导出密钥
<a name="keys-export"></a>

**Contents**
+ [导出对称密钥](#keys-export-symmetric)
  + [使用非对称技术导出密钥(TR-34)](#keys-export-tr34)
  + [使用非对称技术 (ECDH) 导出密钥](#keys-export-ecdh)
  + [使用非对称技术（RSA Wrap）导出密钥](#keys-export-rsawrap)
  + [使用预先建立的密钥交换密钥导出对称密钥 (TR-31)](#keys-export-tr31)
+ [导出 DUKPT 初始密钥 (IPEK/IK)](#keys-export-ipek)
+ [指定要导出的密钥块标题](#keys-export-optionalheaders)
  + [常用标题](#keys-export-commonheaders)
+ [导出非对称 (RSA) 密钥](#keys-export-publickey)

## 导出对称密钥
<a name="keys-export-symmetric"></a>

**重要**  
 在开始 AWS CLI 之前，请确保您拥有最新版本的。要升级，请参阅[安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

### 使用非对称技术导出密钥(TR-34)
<a name="keys-export-tr34"></a>

TR-34 使用 RSA 非对称加密技术对对称密钥进行加密和签名以进行交换。加密可保护机密性，而签名可确保完整性。当您导出密钥时，Paym AWS ent Cryptography 充当密钥分发主机 (KDH)，而您的目标系统将成为密钥接收设备 (KRD)。

**注意**  
如果您的 HSM 支持 TR-34 导出但不支持 TR-34 导入，我们建议您首先使用 TR-34 在 HSM 和 AWS 支付密码学之间建立共享 KEK。然后，您可以使用 TR-31 转移剩余的密钥。

1. 

****初始化导出流程****  
运行**get-parameters-for-export**为密钥导出生成密钥对。我们使用这个 key pair 对 TR-34 有效载荷进行签名。在 TR-34 术语中，这是 KDH 签名证书。这些证书的有效期很短，并且仅在中`ParametersValidUntilTimestamp`指定的期限内有效。
**注意**  
所有证书均采用 base64 编码。  
**Example**  

   ```
   $ aws payment-cryptography get-parameters-for-export \
       --signing-key-algorithm RSA_2048 \
       --key-material-type TR34_KEY_BLOCK
   ```

   ```
   {
     "SigningKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2RENDQXFTZ0F3SUJ...",
     "SigningKeyCertificateChain": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS....",
     "SigningKeyAlgorithm": "RSA_2048",
     "ExportToken": "export-token-au7pvkbsq4mbup6i",
     "ParametersValidUntilTimestamp": "2023-06-13T15:40:24.036000-07:00"
   }
   ```

1. 

****将 AWS 付款密码学证书导入您的收款系统****  
将步骤 1 中的证书链导入您的接收系统。

1. 

****设置接收系统的证书****  
为了保护传输的有效载荷，发送方 (KDH) 对其进行加密。您的接收系统（通常是您的 HSM 或合作伙伴的 HSM）需要生成公钥并创建 X.509 公钥证书。您可以使用 AWS 私有 CA 生成证书，但可以使用任何证书颁发机构。

   获得证书后，使用**ImportKey**命令将根证书导入 “ AWS 支付密码学”。将 `KeyMaterialType` 设置为 `RootCertificatePublicKey`，将 `KeyUsageType` 设置为 `TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE`。

   我们之所以用`TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE`作，`KeyUsageType`是因为这是签名叶证书的根密钥。您无需将树叶证书导入 P AWS ayment Cryptography，您可以内联传递它们。
**注意**  
如果您之前导入了根证书，请跳过此步骤。对于中间证书，请使用`TrustedCertificatePublicKey`。

1. 

****导出您的密钥****  
在`KeyMaterialType`设置为**ExportKey**的情况下调用 API `TR34_KEY_BLOCK`。你需要提供：
   + 步骤 3 中根 CA 的 keyArn 是 `CertificateAuthorityPublicKeyIdentifier`
   + 第 3 步中的树叶证书作为 `WrappingKeyCertificate`
   + 要导出的密钥的 keyArn（或别名）`--export-key-identifier`
   + 步骤 1 中的导出代币  
**Example**  

   ```
   $ aws payment-cryptography export-key \
       --export-key-identifier "example-export-key" \
       --key-material '{"Tr34KeyBlock": { \
       "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/4kd6xud22e64wcbk", \
       "ExportToken": "export-token-au7pvkbsq4mbup6i", \
       "KeyBlockFormat": "X9_TR34_2012", \
       "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2RENDQXFXZ0F3SUJBZ0lSQ..."} \
       }'
   ```

   ```
   {
     "WrappedKey": {
       "KeyMaterial": "308205A106092A864886F70D010702A08205923082058...",
       "WrappedKeyMaterialFormat": "TR34_KEY_BLOCK"
     }
   }
   ```

### 使用非对称技术 (ECDH) 导出密钥
<a name="keys-export-ecdh"></a>

![\[AWS 使用 ECDH 的支付密码学密钥加密密钥导入流程\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/images/keyimport-ecdh-export.png)


Elliptic Curve Diffie-Hellman（ECDH）使用 ECC 非对称加密技术在双方之间建立共享密钥，无需预先交换密钥。ECDH 密钥是临时性的，因此 AWS 支付密码学不会存储它们。在此过程中，使用 ECDH 导出一次性的 [KBPK/KEK](terminology.md#terms.kbpk)。该派生密钥会立即用于封装您要传输的密钥，该密钥可能是另一个 KBPK、BDK、IPEK 密钥或其他密钥类型。

导出时， AWS 支付密码学被称为U方（发起方），接收系统称为第五方（响应方）。

**注意**  
ECDH 可用于交换任何对称密钥类型，但如果尚未建立 KEK，它是唯一可用于传输 AES-256 密钥的方法。

1. 

****生成 ECC 密钥对****  
调用`create-key`为该过程创建 ECC key pair。此 API 为密钥导入或导出生成密钥对。在创建时，请指定使用此 ECC 密钥可以派生哪种密钥。使用 ECDH 交换（封装）其他密钥时，请使用值。`TR31_K1_KEY_BLOCK_PROTECTION_KEY`
**注意**  
 尽管低级 ECDH 会生成可用于任何目的的派生密钥，但 P AWS ayment Cryptography 允许密钥仅用于单一派生密钥类型，从而限制了出于多种目的意外重复使用密钥。

   ```
   $ aws payment-cryptography create-key --exportable --key-attributes KeyAlgorithm=ECC_NIST_P256,KeyUsage=TR31_K3_ASYMMETRIC_KEY_FOR_KEY_AGREEMENT,KeyClass=ASYMMETRIC_KEY_PAIR,KeyModesOfUse='{DeriveKey=true}' --derive-key-usage "TR31_K1_KEY_BLOCK_PROTECTION_KEY"
   ```

   ```
   {
           "Key": {
               "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/wc3rjsssguhxtilv",
               "KeyAttributes": {
                   "KeyUsage": "TR31_K3_ASYMMETRIC_KEY_FOR_KEY_AGREEMENT",
                   "KeyClass": "ASYMMETRIC_KEY_PAIR",
                   "KeyAlgorithm": "ECC_NIST_P256",
                   "KeyModesOfUse": {
                       "Encrypt": false,
                       "Decrypt": false,
                       "Wrap": false,
                       "Unwrap": false,
                       "Generate": false,
                       "Sign": false,
                       "Verify": false,
                       "DeriveKey": true,
                       "NoRestrictions": false
                   }
               },
               "KeyCheckValue": "2432827F",
               "KeyCheckValueAlgorithm": "CMAC",
               "Enabled": true,
               "Exportable": true,
               "KeyState": "CREATE_COMPLETE",
               "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY",
               "CreateTimestamp": "2025-03-28T22:03:41.087000-07:00",
               "UsageStartTimestamp": "2025-03-28T22:03:41.068000-07:00"
           }
       }
   ```

1. 

****获取公钥证书****  
`get-public-key-certificate`致电接收由您账户的 CA 签署的 X.509 证书的公钥，该证书特定于特定地区的 AWS 支付密码学。  
**Example**  

   ```
   $ aws payment-cryptography get-public-key-certificate \
              --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/wc3rjsssguhxtilv
   ```

   ```
   {
         "KeyCertificate": "LS0tLS1CRUdJTi...",
         "KeyCertificateChain": "LS0tLS1CRUdJT..."
       }
   ```

1. 

****在交易对手系统上安装公共证书（第五方）****  
对于许多证书 HSMs，您需要安装、加载或信任步骤 1 中生成的公共证书才能建立密钥。这可能包括整个证书链，也可以仅包括根证书，具体取决于 HSM。有关具体说明，请参阅您的 HSM 文档。

1. 

****在源系统上生成 ECC key pair 并为 AWS 支付密码学提供证书链****  
在 ECDH 中，各方生成一个密钥对，并就公用密钥达成一致。为了让 AWS 支付密码学派生密钥，它需要交易对手的公钥采用 X.509 公钥格式。

   从 HSM 传输密钥时，请在该 HSM 上创建密钥对。对于 HSMs 该支持按键块，按键标题将类似于`D0144K3EX00E0000`。创建证书时，通常会在 HSM 上生成 CSR，然后 HSM、第三方或诸如之类的服务 AWS 私有 CA 可以生成证书。

   使用带 KeyMaterialType 有 of `RootCertificatePublicKey` 和 of 的`importKey`命令将根证书加载到 AWS 支付密码中 KeyUsageType 。`TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE`

   对于中间证书，请使用带有 `importKey` of `TrustedCertificatePublicKey` 和 of KeyMaterialType KeyUsageType 的命令`TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE`。对多个中间证书重复此过程。使用链`KeyArn`中最后一次导入的证书作为后续导出命令的输入。
**注意**  
不要导入树叶证书。在导出命令期间直接提供它。

1. 

****从 AWS 支付密码学中获取密钥和导出密钥****  
导出时，该服务使用 ECDH 派生密钥，然后立即将其用作 [KBPK](terminology.md#terms.kbpk) 来封装密钥以使用 TR-31 进行导出。要导出的密钥可以是任何受 TR-31 有效组合约束的 TDES 或 AES 密钥，前提是包装密钥的强度至少与要导出的密钥一样强。

   ```
   $ aws payment-cryptography export-key \
               --export-key-identifier arn:aws:payment-cryptography:us-west-2:529027455495:key/e3a65davqhbpjm4h \
               --key-material='{
                 "DiffieHellmanTr31KeyBlock": {
                   "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/swseahwtq2oj6zi5",
                   "DerivationData": {
                     "SharedInformation": "ADEF567890"
                   },
                   "DeriveKeyAlgorithm": "AES_256",
                   "KeyDerivationFunction": "NIST_SP800",
                   "KeyDerivationHashAlgorithm": "SHA_256",
                   "PrivateKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/wc3rjsssguhxtilv",
                   "PublicKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FUR..."
                 }
               }'
   ```

   ```
   {
               "WrappedKey": {
                   "WrappedKeyMaterialFormat": "TR31_KEY_BLOCK",
                   "KeyMaterial": "D0112K1TB00E00007012724C0FAAF64DA50E2FF4F9A94DF50441143294E0E995DB2171554223EAA56D078C4CFCB1C112B33BBF05597EE700",
                   "KeyCheckValue": "E421AD",
                   "KeyCheckValueAlgorithm": "ANSI_X9_24"
               }
           }
   ```

1. 

****在第五方 HSM 上使用 ECDH 获取一次性密钥****  
许多 HSMs 相关系统都支持使用 ECDH 建立密钥。将步骤 1 中的公钥指定为公钥，将步骤 3 中的密钥指定为私钥。有关允许的选项，例如派生方法，请参阅 [API](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ExportDiffieHellmanTr31KeyBlock.html) 指南。
**注意**  
 诸如哈希类型之类的派生参数在两边都必须完全匹配。否则，您将生成不同的密钥。

1. 

****将密钥导入目标系统****  
最后，使用标准的 TR-31 命令从 “ AWS 支付密码学” 中导入密钥。将 ECDH 派生的密钥指定为 KBPK，并使用之前从 Payment Cryptography 中 AWS 导出的 TR-31 密钥块。

### 使用非对称技术（RSA Wrap）导出密钥
<a name="keys-export-rsawrap"></a>

 当 TR-34 不可用时，您可以使用 RSA wrap/unwrap 进行密钥交换。与 TR-34 一样，此方法使用 RSA 非对称加密来加密对称密钥。但是，RSA 包装不包括：
+ 发送方对有效载荷进行签名
+ 在传输过程中保持密钥元数据完整性的密钥块

**注意**  
你可以使用 RSA 封装来导出 TDES 和 AES-128 密钥。

1. 

****在接收系统上创建 RSA 密钥和证书****  
创建或标识用于接收封装密钥的 RSA 密钥。我们要求密钥采用 X.509 证书格式。确保证书由根证书签名，您可以将其导入 AWS 支付密码学。

1. 

****将根公共证书导入 AWS 支付密码学****  
**import-key**与导入证书的`--key-material`选项一起使用

   ```
   $ aws payment-cryptography import-key \
       --key-material='{"RootCertificatePublicKey": { \
       "KeyAttributes": { \
       "KeyAlgorithm": "RSA_4096", \
       "KeyClass": "PUBLIC_KEY", \
       "KeyModesOfUse": {"Verify": true}, \
       "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE"}, \
       "PublicKeyCertificate": "LS0tLS1CRUdJTiBDRV..."} \
       }'
   ```

   ```
   {
     "Key": {
       "CreateTimestamp": "2023-09-14T10:50:32.365000-07:00",
       "Enabled": true,
       "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/nsq2i3mbg6sn775f",
       "KeyAttributes": {
         "KeyAlgorithm": "RSA_4096",
         "KeyClass": "PUBLIC_KEY",
         "KeyModesOfUse": {
           "Decrypt": false,
           "DeriveKey": false,
           "Encrypt": false,
           "Generate": false,
           "NoRestrictions": false,
           "Sign": false,
           "Unwrap": false,
           "Verify": true,
           "Wrap": false
         },
         "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE"
       },
       "KeyOrigin": "EXTERNAL",
       "KeyState": "CREATE_COMPLETE",
       "UsageStartTimestamp": "2023-09-14T10:50:32.365000-07:00"
     }
   }
   ```

1. 

****导出您的密钥****  
让 Pay AWS ment Cryptography 使用你的叶子证书导出你的密钥 你需要指定：
   + 您在步骤 2 中导入的根证书的 ARN
   + 出口的叶子证书
   + 要导出的对称密钥

   输出是对称密钥的十六进制编码二进制包装（加密）版本。  
**Example 示例-导出密钥**  

   ```
   $ cat export-key.json
   ```

   ```
   {
     "ExportKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi",
     "KeyMaterial": {
       "KeyCryptogram": {
         "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/zabouwe3574jysdl",
         "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDEXAMPLE...",
         "WrappingSpec": "RSA_OAEP_SHA_256"
       }
     }
   }
   ```

   ```
   $ aws payment-cryptography export-key \
       --cli-input-json file://export-key.json
   ```

   ```
   {
     "WrappedKey": {
       "KeyMaterial": "18874746731E9E1C4562E4116D1C2477063FCB08454D757D81854AEAEE0A52B1F9D303FA29C02DC82AE7785353816EFAC8B5F4F79CC29A1DDA80C65F34364373D8C74E5EC67E4CB55DEA7F091210DCACD3C46FE4A5DAA0F0D9CAA7C959CA7144A5E7052F34AAED93EF44C004AE7ABEBD616C955BBA10993C06FB905319F87B9B4E1B7A7C7D17AF15B6154E807B9C574387A43197C31C6E565554437A252EFF8AC81613305760D11F9B53B08A1BA79EC7E7C82C48083C4E2D0B6F86C34AB83647BDD7E85240AD1AF3C0F6CA8C5BF323BB2D3896457C554F978F4C9436513F494130A6FADBC038D51898AAD72E02A89FF256C524E7B5D85B813751B718C4933D9DC6031F2C5B2E13351A54B6021B2DB72AA0C7EA54727FBCD557E67E5E7CC2E165576E39DB4DA33510BA9A3C847313103A18EF3B23A3440471864D58C79C569D5CD2A653AC16043CA9A61E6878F74C18EE15F9AB23754C37A945B68C0437C19F0079F74B573D9B59DAC25A20781DBE8075C947C9EDC76177A1B0794288CBF89567A541E8401C74E85B8E1C3E501860AF702F641CAA04327018A84EF3A82932A2BCF37047AB40FE77E0A6F68D0904C7E60983CD6F871D5E0E27EEF425C97D39E9394E8927EEF5D2EA9388DF3C5C241F99378DF5DADE8D0F0CF453C803BA38BA702B9651685FAFA6DCB4B14333F8D3C57F2D93E0852AA94EEC3AF3217CAE5873EFD9",
       "WrappedKeyMaterialFormat": "KEY_CRYPTOGRAM"
     }
   }
   ```

1. 

****将密钥导入您的接收系统****  
许多 HSMs 及相关系统都支持使用 RSA unwrap（包括 AWS 支付加密）导入密钥。导入时，请指定：
   + 步骤 1 中的公钥作为加密证书
   + 格式为 RSA
   + 填充模式为 PKCS \$11 v2.2 OAEP（使用 SHA 256）
**注意**  
我们以 HexBinary 格式输出封装后的密钥。如果您的系统需要不同的二进制表示形式（例如 base64），则可能需要转换格式。

### 使用预先建立的密钥交换密钥导出对称密钥 (TR-31)
<a name="keys-export-tr31"></a>

交换多个密钥或支持密钥轮换时，通常首先使用 paper 密钥组件交换初始密钥加密密钥 (KEK)，或者在使用 AWS 支付密码学时使用 [TR-34](#keys-export-tr34) 交换初始密钥加密密钥 (KEK)。建立 KEK 后，您可以使用它来传输后续密钥，包括其他密钥 KEKs。我们使用 ANSI TR-31 支持这种密钥交换，HSM 供应商广泛支持该密钥交换。

1. 

****设置您的密钥加密密钥 (KEK)****  
确保你已经交换了 KEK 并有 KeyArn（或 KeyAlias）可用。

1. 

****在 “ AWS 支付密码学” 上创建您的密钥****  
如果密钥尚不存在，请创建该密钥。或者，您可以在其他系统上创建密钥并使用 [impor](#keys-export-tr31) t 命令。

1. 

****从 “ AWS 支付密码学” 中导出您的密钥****  
以 TR-31 格式导出时，请指定要导出的密钥和要使用的包装密钥。  
**Example 示例-使用密钥块导出 TR31 密钥**  

   ```
   $ aws payment-cryptography export-key \
       --key-material='{"Tr31KeyBlock": \
       { "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza" }}' \
       --export-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/5rplquuwozodpwsp
   ```

   ```
   {
     "WrappedKey": {
       "KeyCheckValue": "73C263",
       "KeyCheckValueAlgorithm": "ANSI_X9_24",
       "KeyMaterial": "D0144K0AB00E0000A24D3ACF3005F30A6E31D533E07F2E1B17A2A003B338B1E79E5B3AD4FBF7850FACF9A3784489581A543C84816C8D3542AE888CE6D4EDDFD09C39957B131617BC",
       "WrappedKeyMaterialFormat": "TR31_KEY_BLOCK"
     }
   }
   ```

1. 

****将密钥导入您的系统****  
使用系统的导入密钥实现来导入密钥。

## 导出 DUKPT 初始密钥 (IPEK/IK)
<a name="keys-export-ipek"></a>

使用 [DUKPT](terminology.md#terms.dukpt) 时，您可以为一组终端生成单个基本派生密钥 (BDK)。这些终端无法直接访问 BDK。相反，每个终端都会收到一个唯一的初始终端密钥，称为 IPEK 或初始密钥 (IK)。每个 IPEK 都使用唯一的密钥序列号 (KSN) 从 BDK 派生。

KSN 结构因加密类型而异：
+ 对于 TDES：10 字节的 KSN 包括：
  + 密钥集 ID 为 24 位
  + 终端 ID 为 19 位
  + 交易计数器为 21 位
+ 对于 AES：12 字节的 KSN 包括：
  + BDK ID 为 32 位
  + 派生标识符 (ID) 为 32 位
  + 32 位用于交易计数器

我们提供了一种生成和导出这些初始密钥的机制。您可以使用 TR-31、TR-34 或 RSA 封装方法导出生成的密钥。请注意，IPEK 密钥不会永久保存，也不能用于支付密码学的后续 AWS 操作。

我们不强制在KSN的前两个部分之间进行分割。如果要将派生标识符与 BDK 一起存储，则可以使用 AWS 标签。

**注意**  
KSN 的计数器部分（AES DUKPT 为 32 位）不用于 IPEK/IK 推导。例如，输入 12345678901234560001 和 1234567890123456999 将生成相同的 IPEK。

```
$ aws payment-cryptography export-key \
    --key-material='{"Tr31KeyBlock": { \
    "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza"}} ' \
    --export-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/tqv5yij6wtxx64pi \
    --export-attributes 'ExportDukptInitialKey={KeySerialNumber=12345678901234560001}'
```

```
{
"WrappedKey": {
    "KeyCheckValue": "73C263",
    "KeyCheckValueAlgorithm": "ANSI_X9_24",
    "KeyMaterial": "B0096B1TX00S000038A8A06588B9011F0D5EEF1CCAECFA6962647A89195B7A98BDA65DDE7C57FEA507559AF2A5D601D1",
    "WrappedKeyMaterialFormat": "TR31_KEY_BLOCK"
}
}
```

## 指定要导出的密钥块标题
<a name="keys-export-optionalheaders"></a>

以 ASC TR-31 或 TR-34 格式导出时，您可以修改或附加密钥块信息。下表描述了 TR-31 密钥块格式以及在导出过程中可以修改哪些元素。


| 按键方块属性 | 用途 | 你能在导出过程中修改吗？ | 注意 | 
| --- | --- | --- | --- | 
| 版本 ID |  定义用于保护密钥材料的方法。该标准包括： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 否 |  我们对 TDES 封装密钥使用版本 B，将 D 版本用于 AES 封装密钥。我们仅支持版本 A 和 C 进行导入操作。  | 
| 密钥块长度 | 指定剩余消息的长度 | 否 |  我们会自动计算这个值。在解密有效载荷之前，长度可能看起来不正确，因为我们可以根据规范的要求添加密钥填充。  | 
| 密钥用法 |  定义密钥的允许用途，例如： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 否 |  | 
| 算法 |  指定底层密钥的算法。我们支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 否 | 我们按原样导出此值。 | 
| 密钥用法 |  定义允许的操作，例如： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 是\$1 |  | 
| 密钥版本 | 表示密钥替换/轮换的版本号。如果未指定，则默认为 00。 | 是-可以追加 |  | 
| 密钥可导出性 |  控制是否可以导出密钥： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 是\$1 |  | 
| 可选的按键块 | 是-可以追加 |  可选密钥块是以加密方式绑定到密钥的 name/value 对。例如，DUKPT 密钥的 KeySet ID。我们会根据您的 name/value 配对输入自动计算方块数、每个方块的长度和填充块 (PB)。  |  | 

*\$1修改值时，您的新值必须比 AWS 付款密码学中的当前值更具限制性。*例如：
+ 如果当前的密钥使用模式是 Generate=True、Verify=True，你可以将其更改为 Generate=True、Verify=False
+ 如果密钥已设置为不可导出，则无法将其更改为可导出

当您导出密钥时，我们会自动应用正在导出的密钥的当前值。但是，在将这些值发送到接收系统之前，您可能需要修改或附加这些值。以下是一些常见的情况：
+ 将密钥导出到支付终端时，请将其可导出性设置为，`Not Exportable`因为终端通常只导入密钥而不应导出密钥。
+ 当您需要将关联的密钥元数据传递给接收系统时，请使用 TR-31 可选标头以加密方式将元数据绑定到密钥，而不是创建自定义负载。
+ 使用`KeyVersion`字段设置密钥版本以跟踪密钥轮换。

TR-31/X9.143 定义了常用标头，但您可以使用其他标头，前提是它们符合 AWS 付款加密参数并且您的接收系统可以接受它们。有关导出期间密钥块标头的更多信息，请参阅 API 指南中的[密钥块标头](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_KeyBlockHeaders.html)。

以下是按照以下规范导出 BDK 密钥（例如，导出 KIF）的示例：
+ 密钥版本：02
+ KeyExportability: 不可出口
+ KeySetID：00ABCDEFAB（00 表示 TDES 密钥，ABCDEFABCD 是初始密钥）

 由于我们没有指定密钥的使用模式，因此此密钥继承了 arn: aws: payment-cryptography: us-east-2:111122223333: key/5rplquuwozodpwsp (= true) 的使用模式。DeriveKey 

**注意**  
即使在本示例中将可导出性设置为 “不可导出”，[K](terminology.md#terms.kif) IF 仍可以：  
派生密钥，例如 DUKPT 中使用的 [IPEK/IK](terminology.md#terms.ipek)
导出这些派生密钥以安装在设备上
这是标准特别允许的。

```
$ aws payment-cryptography export-key \
    --key-material='{"Tr31KeyBlock": { \
    "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza", \
    "KeyBlockHeaders": { \
    "KeyModesOfUse": { \
    "Derive": true}, \
    "KeyExportability": "NON_EXPORTABLE", \
    "KeyVersion": "02", \
    "OptionalBlocks": { \
    "BI": "00ABCDEFABCD"}}} \
    }' \
    --export-key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/5rplquuwozodpwsp
```

```
{
"WrappedKey": {
    "WrappedKeyMaterialFormat": "TR31_KEY_BLOCK",
    "KeyMaterial": "EXAMPLE_KEY_MATERIAL_TR31",
    "KeyCheckValue": "A4C9B3",
    "KeyCheckValueAlgorithm": "ANSI_X9_24"
    }
}
```

### 常用标题
<a name="keys-export-commonheaders"></a>

X9.143 为常见用例定义了某些标头。除了 HM（HMAC Hash）标头外，P AWS ayment Cryptography 不解析或使用这些标头。


| 标头名称 | 用途 | 典型验证 | 注意 | 
| --- | --- | --- | --- | 
| BI | DUKPT 的基本派生密钥标识符 | 2 个十六进制字符（TDES 为 00，AES 为 11）然后 TDES KSI 为 10 个十六进制字符或 BDK ID（AES DUKPT）为 8 个十六进制字符。 | 包含（BDK ID，对于 AES DUKPT）或密钥集标识符（KSI，用于 TDES DUKPT）。可以在交换 BDK ID 或 KSI 时使用，但不需要交换 IK 和 KS 区块中包含的其他数据。通常，在向 KIF 传输时使用 BI，而向终端本身注入时使用 IK 或 KS。 | 
| HM | 指定 HMAC 操作的哈希类型 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/payment-cryptography/latest/userguide/keys-export.html)  | 该服务在导出时会自动填充此字段，并在导入时对其进行解析。服务不支持的哈希类型，例如 SHAKE128 可以导入，但可能不适用于加密函数。 | 
| IK |  AES DUKPT 的初始密钥序列号 | 16 十六进制字符  | 此值用于实例化接收设备上初始 DUKPT 密钥的使用，并标识从 BDK 派生的初始密钥。此字段通常包含派生数据，但不包含计数器。使用 KS 获得 TDES DUKPT。 | 
| KS |  TDES DUKPT 的初始密钥序列号 | 20 个十进制字符  | 此值用于实例化接收设备上初始 DUKPT 密钥的使用，并标识从 BDK 派生的初始密钥。此字段通常包含派生数据 \$1 一个归零的计数器值。使用 IK 获得 AES DUKPT。 | 
| KP | 包装@@ [密钥的 KCV](terminology.md#terms.kcv) | 2 个十六进制字符表示 KCV 方法（0 表示 X9.24 方法，01 表示 CMAC 方法）。后面是 KCV 值，通常为 6 个十六进制字符。例如，010 FA329 表示使用 01 (CMAC) FA329 方法计算得出的 0 的 KCV。  | 此值用于实例化接收设备上初始 DUKPT 密钥的使用，并标识从 BDK 派生的初始密钥。此字段通常包含派生数据 \$1 一个归零的计数器值。使用 IK 获得 AES DUKPT。 | 
| PB | 填充块 | 随机可打印的 ASCII 字符  | 该服务在导出时会自动填充此字段，以确保可选标头是加密区块长度的倍数 | 

## 导出非对称 (RSA) 密钥
<a name="keys-export-publickey"></a>

要以证书形式导出公钥，请使用**get-public-key-certificate**命令。此命令返回：
+ 该证书
+ 根证书

两个证书均采用 base64 编码。

**注意**  
此操作不是等效的，即使使用相同的底层密钥，后续调用也可能会生成不同的证书。

**Example**  

```
$ aws payment-cryptography get-public-key-certificate \
     --key-identifier arn:aws:payment-cryptography:us-east-2:111122223333:key/5dza7xqd6soanjtb
```

```
{
"KeyCertificate": "LS0tLS1CRUdJTi...",
"KeyCertificateChain": "LS0tLS1CRUdJT..."
}
```