# Thales 密钥块格式：头部、TLV 与 TR-31 对比

> 了解 Thales 专有密钥块格式——头部字段、TLV 结构、与 TR-31 的区别，以及实际编码示例。

Canonical: https://hsmkit.com/zh/guides/thales-key-block-format-guide/

Last updated: 2026-05-21

Thales 密钥块是 Thales payShield HSM 用于安全存储和传输密码密钥的专有格式。虽然 TR-31 是行业标准，但 Thales 密钥块仍被广泛使用。本指南介绍格式结构、头部布局以及与 TR-31 的区别。

## 什么是 Thales 密钥块？

Thales 密钥块是一个结构化容器，将密码密钥与元数据、完整性检查和加密包装在一起。它提供：

- 在 LMK 变体下加密密钥
- 密钥类型标识
- 完整性验证
- 格式版本控制

### Thales 密钥块的应用场景

- Thales payShield 10K 及旧型号
- 支付处理网络
- ATM 密钥管理
- 银行间密钥交换
- 传统支付基础设施

## Thales 密钥块结构

Thales 密钥块有特定的布局：

```
+------------------+
| 头部             |  2字节：版本 + 密钥类型
+------------------+
| 密钥长度         |  2字节：加密密钥的长度
+------------------+
| 加密密钥         |  可变长度：LMK 变体下的密钥
+------------------+
| KCV              |  3字节：密钥校验值
+------------------+
| 填充             |  可选：用于对齐
+------------------+
```

### 头部格式

头部标识密钥块格式和密钥类型：

| 字段 | 长度 | 描述 |
|------|------|------|
| 版本 | 1字节 | 格式版本标识符 |
| 密钥类型 | 1字节 | 密钥用途 |
| 密钥长度 | 2字节 | 加密密钥数据的长度 |

### 密钥类型代码

| 代码 | 密钥类型 | 描述 |
|------|----------|------|
| 00 | ZMK | 区域主密钥 |
| 01 | ZPK | 区域 PIN 密钥 |
| 02 | TPK | 终端 PIN 密钥 |
| 03 | TMK | 终端主密钥 |
| 04 | PVK | PIN 验证密钥 |
| 05 | CVK | 卡验证密钥 |
| 06 | DEK | 数据加密密钥 |
| 07 | BDK | 基础派生密钥（DUKPT） |
| 08 | IKK | 初始密钥（DUKPT） |

## 头部详解

### 版本字节

版本字节表示格式版本：

| 值 | 版本 | 备注 |
|-----|------|------|
| 0x00 | 版本 0 | 原始格式 |
| 0x01 | 版本 1 | 包含额外标志 |
| 0x02 | 版本 2 | 扩展属性 |

### 密钥长度编码

密钥长度编码为 2 字节，大端序：

```
0x0010 = 16字节（双长度密钥）
0x0018 = 24字节（三长度密钥）
```

## 加密密钥部分

加密密钥是密钥块的核心。

### LMK 变体加密

密钥在 LMK 变体下加密：

```
加密密钥 = E(LMK XOR 变体, 明文密钥)
```

不同密钥类型使用不同变体（参见 [Thales LMK 指南](/zh/guides/thales-lmk-key-encryption/)）。

### 密钥填充

密钥可能被填充以满足对齐要求：
- DES 密钥：8 字节对齐
- AES 密钥：16 字节对齐

## 密钥校验值（KCV）

密钥块末尾的 KCV 用作完整性检查。

### KCV 计算

标准方法：
```
KCV = E(Key, 0000000000000000) 的前 3 字节
```

### KCV 用途

- 导入后验证密钥完整性
- 交换期间确认密钥匹配
- 检测传输过程中的损坏

## TLV 结构

一些 Thales 密钥块使用标签-长度-值（TLV）结构来存储扩展属性。

### TLV 格式

```
标签（1-2字节）| 长度（1-2字节）| 值（可变长度）
```

### 常见标签

| 标签 | 描述 |
|------|------|
| 0x01 | 密钥类型 |
| 0x02 | 密钥长度 |
| 0x03 | 密钥用途 |
| 0x04 | 可导出性 |
| 0x05 | 算法 |

## Thales 密钥块与 TR-31 对比

了解差异对于迁移和互操作性很重要。

### 格式对比

| 特性 | Thales 密钥块 | TR-31 |
|------|---------------|-------|
| 标准 | 专有 | ANSI X9.143 |
| 厂商 | 仅 Thales | 厂商中立 |
| 头部 | 固定 4 字节 | 可变长度 |
| 密钥绑定 | 基本 | 密码学绑定 |
| 属性 | 有限 | 全面 |
| 版本控制 | 简单 | 详细 |

### 属性对比

| 属性 | Thales | TR-31 |
|------|--------|-------|
| 密钥用途 | 类型代码 | A-Z 代码 |
| 算法 | 隐含 | 显式 |
| 可导出性 | 标志 | 多种模式 |
| 有效性 | 不包含 | 可选 |

### 迁移考虑

从 Thales 迁移到 TR-31 时：

1. 将密钥类型代码映射到 TR-31 用途代码
2. 添加算法属性
3. 设置可导出性标志
4. 以 TR-31 格式重新生成密钥块
5. 转换后验证 KCV

## 实际应用场景

### 密钥导入

导入 Thales 密钥块：

1. 解析头部获取密钥类型
2. 提取加密密钥
3. 在适当的 LMK 变体下解密
4. 重新加密以存储
5. 验证 KCV

### 密钥导出

将密钥导出为 Thales 密钥块：

1. 从请求获取密钥类型
2. 从存储中解密密钥
3. 在目标 LMK 变体下加密
4. 使用密钥类型构建头部
5. 计算 KCV
6. 组装密钥块

### 密钥交换

在 HSM 之间交换 Thales 密钥块：

1. 从源 HSM 导出密钥块
2. 传输密钥块（安全通道）
3. 导入目标 HSM
4. 目标验证 KCV
5. 双方现在拥有相同的密钥

## 常见问题

### 版本不匹配

如果导入失败：
- 检查版本字节兼容性
- 确保 HSM 支持该版本
- 可能需要降级格式

### 密钥类型混淆

错误的密钥类型会导致：
- 解密失败（错误的变体）
- KCV 不匹配
- 操作错误

### 长度错误

常见长度问题：
- 字节序错误
- 包含/排除填充
- 头部长度计算错误

## 最佳实践

1. **始终验证 KCV**，密钥导入后
2. **记录使用的密钥类型**，在您的系统中
3. **使用一致的格式**，跨 HSM
4. **计划迁移到 TR-31**，以面向未来
5. **测试密钥交换**，在生产前

## 在线体验

使用我们的 [Thales 密钥块工具](/thales-key-block)：

- 解析 Thales 密钥块头部
- 提取密钥类型和长度
- 了解 TLV 结构
- 与 TR-31 格式对比

该工具完全在浏览器中运行——数据不会离开您的设备。
