# TR-31 密钥块格式详解

> ANSI X9.143 / TR-31 密钥块格式完整指南，包括结构、密钥用途代码和实际编码示例。

Canonical: https://hsmkit.com/zh/guides/what-is-tr31-key-block/

Last updated: 2026-04-03

TR-31（也称为 ANSI X9.143）是安全封装和传输加密密钥的行业标准格式。本指南提供该格式的全面概述。

## 什么是 TR-31？

TR-31 是一种密钥块规范，提供：

- **密钥加密**：在传输过程中保护密钥
- **密钥绑定**：将密钥属性与密钥材料密码学绑定
- **完整性保护**：检测篡改
- **密钥用途控制**：定义密钥的使用方式

TR-31 旨在替代不安全的做法——将密钥作为纯密文传输（在 KEK 下加密，但不绑定任何属性）。它现在是 PCI PIN 的要求，并被 Thales、Futurex 和 Atalla 等 [HSM 厂商](/zh/guides/hsm-key-management-overview/) 广泛采用。

## 密钥块结构

TR-31 密钥块由以下几部分组成：

```
[版本][块长度][密钥用途][算法][模式][密钥版本][可导出性][可选块][密钥数据][MAC]
```

### 头部字段

| 字段 | 长度 | 描述 |
|------|------|------|
| 版本 ID | 1 | 'A'（TDES）、'B'（TDES-KD）、'C'（TDES-V）、'D'（AES） |
| 块长度 | 4 | 总块长度（十六进制字节数） |
| 密钥用途 | 2 | 密钥用途（P0、K0、B0 等） |
| 算法 | 1 | 密钥算法（T=TDES，A=AES） |
| 使用模式 | 1 | 密钥使用方式（E=仅加密等） |
| 密钥版本 | 2 | 版本号 |
| 可导出性 | 1 | 导出限制（E、N、S） |
| 可选块数 | 2 | 可选块数量 |

### 密钥用途代码

常见密钥用途代码：

| 代码 | 描述 |
|------|------|
| P0 | PIN 加密密钥——用于加密 [PIN 块](/zh/guides/pin-block-formats-iso9564/) |
| B0 | BDK 基础派生密钥——用于 [DUKPT](/zh/guides/dukpt-key-derivation-tutorial/) |
| K0 | 密钥加密/封装密钥 |
| M0 | ISO 9797-1 MAC（算法 1） |
| M3 | ISO 9797-1 MAC（算法 3）——参见 [MAC 指南](/zh/guides/mac-algorithms-payment-security/) |
| D0 | 数据加密对称密钥 |
| V0 | PIN 验证密钥（VISA PVV） |

### 使用模式

| 代码 | 描述 |
|------|------|
| B | 加密和解密均可 |
| C | 计算（仅 MAC 生成） |
| D | 仅解密 |
| E | 仅加密 |
| G | 生成密钥 |
| N | 无特殊限制 |
| S | 仅签名 |
| V | 验证（仅 MAC 验证） |
| X | 密钥派生 |

### 可导出性

| 代码 | 描述 |
|------|------|
| E | 可导出（在受信任密钥块中） |
| N | 不可导出 |
| S | 敏感（仅可导出到不可导出目标） |

## 版本差异

### 版本 A（原始 TDES）
- 使用 TDES 密钥封装
- 16 字节 MAC
- 基本安全性

### 版本 B（TDES 密钥派生）
- 封装前使用密钥派生
- 改进的密码学绑定
- 16 字节 MAC

### 版本 C（TDES 变体）
- 使用 CMAC 替代 X9.19 MAC——参见 [CMAC 工具](/payments-mac-cmac)
- 更好的完整性保护

### 版本 D（AES）
- 使用 AES 进行密钥封装（AES-256 KBPK）
- CMAC 用于认证
- 最强安全性
- **新实现推荐使用**

关于 AES 与 TDES 安全性的背景，参见 [AES 指南](/zh/guides/aes-encryption-explained/) 和 [DES/3DES 指南](/zh/guides/des-3des-legacy-encryption/)。

## TR-31 与 Thales 密钥块

Thales HSM 也有专有的"Thales 密钥块"格式。TR-31 是开放标准，而 Thales 密钥块专用于 Thales payShield HSM。使用 [Thales 密钥块工具](/thales-key-block) 处理 Thales 专有格式，使用 [TR-31 工具](/tr31-key-block) 处理标准格式。

## 安全最佳实践

1. **使用版本 D**：基于 AES 的保护最强
2. **强 KBPK**：使用 256 位 AES KBPK
3. **使用前验证**：解密前始终验证 MAC
4. **遵守限制**：尊重可导出性和模式标志
5. **密钥轮换**：定期轮换 KBPK

关于将 KBPK 加载到 HSM 的密钥分片，参见 [密钥分片与 KCV 指南](/zh/guides/understanding-key-splitting-kcv/)。

## 常见问题

### "MAC 验证失败"
- KBPK 不匹配
- 密钥块损坏
- 版本解码错误

### "无效密钥长度"
- 算法不匹配
- 填充问题

### "未知密钥用途"
- 不支持或厂商特定代码

## 亲自尝试

使用 [TR-31 密钥块工具](/tr31-key-block)：

- 将密钥编码为 TR-31 格式
- 解码和验证现有密钥块
- 查看所有头部字段和属性
- 支持所有版本（A、B、C、D）

所有处理在您的浏览器本地完成，确保最大安全性。
