# Thales LMK 密钥加密：方案、变体与密钥类型

> 深入探讨 Thales 基于 LMK 的密钥加密——密钥方案格式（ZMK、TMK、ZPK）、变体加密原理和密钥块标准。

Canonical: https://hsmkit.com/zh/guides/thales-lmk-key-encryption/

Last updated: 2026-05-21

Thales（前身为 nCipher 和 SafeNet）是支付 HSM 市场的领导者，其 payShield 系列广泛使用。Thales LMK（本地主密钥）系统是这些设备密钥管理的基础。本指南解释 Thales LMK 加密的工作原理、密钥方案和基于变体的密钥保护。

## 什么是 Thales LMK？

本地主密钥（LMK）是存储在 Thales HSM 内部的根密钥。它是保护系统中所有其他密钥的主密钥。

### 主要特性

- 存储在防篡改硬件中
- 永远不会以明文形式离开 HSM
- 在密钥仪式期间分成多个组件
- 用于加密/解密所有工作密钥
- 不同密钥类型使用不同变体

## LMK 变体系统

Thales 使用**基于变体的加密**系统，将不同的 XOR 掩码应用于 LMK，为不同密钥类型创建不同的加密上下文。

### 变体工作原理

```
有效密钥 = LMK XOR 变体掩码
加密密钥 = E(有效密钥, 明文密钥)
```

这确保不同类型的密钥在密码学上相互隔离。

### 标准变体掩码

| 密钥类型 | 变体代码 | XOR 掩码 |
|----------|----------|----------|
| ZMK | 00 | LMK XOR 00000000 00000000 00000000 00000000 |
| ZMK（变体） | 01 | LMK XOR 00000000 00000000 00000000 000000FF |
| ZPK | 02 | LMK XOR 00000000 00000000 00000000 0000FF00 |
| TPK | 03 | LMK XOR 00000000 00000000 00000000 00FF0000 |
| TMK | 04 | LMK XOR 00000000 00000000 00000000 FF000000 |
| PVK | 05 | LMK XOR 00000000 00000000 000000FF 00000000 |
| CVK | 06 | LMK XOR 00000000 00000000 0000FF00 00000000 |
| DEK | 07 | LMK XOR 00000000 00000000 00FF0000 00000000 |

## 密钥方案格式

Thales 使用特定格式表示加密密钥，称为密钥方案。

### ZMK 方案

区域主密钥方案用于 HSM 之间的密钥交换：

```
ZMK 方案：[变体] [加密密钥] [KCV]
```

示例：
```
U 1A2B3C4D5E6F7890 ABCD12
```

其中：
- `U` = 双长度密钥
- `1A2B3C4D5E6F7890` = LMK 加密的 ZMK
- `ABCD12` = 密钥校验值

### ZPK 方案

区域 PIN 密钥方案保护 PIN 加密密钥：

```
ZPK 方案：[变体] [加密密钥] [KCV]
```

### TMK/TPK 方案

终端密钥使用类似格式：

```
TMK 方案：[变体] [加密密钥] [KCV]
```

## 密钥类型详解

### 区域主密钥（ZMK）

- 用于在 HSM 之间建立安全通道
- 手动或通过安全协议交换
- 加密其他密钥以进行传输
- 也称为密钥交换密钥（KEK）

### 区域 PIN 密钥（ZPK）

- 在 ATM 和 POS 终端加密 PIN
- 用于区域之间的 PIN 翻译
- 在 LMK 变体下保护

### 终端主密钥（TMK）

- 特定终端的主密钥
- 在终端初始化期间加载
- 保护终端特定密钥

### 终端 PIN 密钥（TPK）

- 终端用于 PIN 加密
- 从 TMK 派生或受 TMK 保护
- 每个终端专用

### PIN 验证密钥（PVK）

- 用于离线验证 PIN
- 生成 PVV（PIN 验证值）
- 两端必须相同

### 卡验证密钥（CVK）

- 生成 CVV/CVC/CID 值
- 印在卡磁条或芯片上
- 用于无卡交易验证

### 数据加密密钥（DEK）

- 加密持卡人数据
- 用于 PAN 加密
- PCI DSS 要求

## 密钥校验值（KCV）

KCV 验证对所有 Thales 密钥操作至关重要。

### 标准 KCV 计算

```
KCV = E(Key, 0000000000000000) 的前 3 字节
```

### 密钥交换中的 KCV

交换密钥时：
1. 从源 HSM 导出密钥并附带 KCV
2. 将密钥导入目标 HSM
3. 目标 HSM 计算 KCV
4. 比较 KCV——必须完全匹配
5. 如果不匹配，密钥在传输过程中损坏

## 密钥导入和导出

### 导入密钥

将密钥导入 Thales HSM：

1. 接收在 ZMK 加密下的密钥
2. HSM 使用 LMK 变体解密 ZMK
3. HSM 使用 ZMK 解密密钥
4. HSM 在适当的 LMK 变体下重新加密密钥
5. 存储密钥并附带 KCV

### 导出密钥

从 Thales HSM 导出密钥：

1. 从 LMK 变体中解密密钥
2. 在目标 ZMK 下加密密钥
3. 计算 KCV
4. 返回加密密钥和 KCV

## 实际应用场景

### 银行之间的密钥交换

当银行 A 向银行 B 发送 ZPK 时：

1. 银行 A 在 HSM 中生成 ZPK
2. 银行 A 在 ZMK 加密下导出 ZPK
3. ZMK 之前已交换（手动或自动）
4. 银行 B 将 ZPK 导入他们的 HSM
5. 双方验证 KCV 匹配

### ATM 密钥加载

向 ATM 加载密钥：

1. 在 HSM 中生成 TMK
2. 在 ZMK 加密下导出 TMK
3. 通过主密钥加载将 TMK 加载到 ATM
4. 为 ATM 生成 TPK
5. 在 TMK 加密下导出 TPK
6. 将 TPK 加载到 ATM

## 常见问题

### 变体不匹配

使用错误变体是常见问题：
- 操作前验证密钥类型
- 检查变体掩码文档
- 先用已知密钥测试

### KCV 不匹配

如果交换后 KCV 不匹配：
- 验证 ZMK 是否正确加载
- 检查传输错误
- 确保双方使用相同的密钥类型
- 确认变体代码匹配

### 密钥长度混淆

Thales 支持单长度、双长度和三长度密钥：
- 单长度：8 字节（16 个十六进制字符）
- 双长度：16 字节（32 个十六进制字符）
- 三长度：24 字节（48 个十六进制字符）

确保方案中的长度指示符正确。

## 在线体验

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

- 在 LMK 变体下加密和解密密钥
- 为任何密钥计算 KCV
- 了解密钥方案格式
- 练习密钥导入/导出场景

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