从 tr31 密钥块中提取密钥(从 HSM Thales 9000 导出)

Extract Key from a tr31 key block (exporting from HSM Thales 9000)

使用 HSM 命令 A0(生成密钥),我得到以下响应。

HEADA100U7D4213E0422F4E08E9455D9837E09FDDRA0072B1TX00S000073C35FF96F7A8C7D35D440CCBDA06FFED3AC7017F27B0A0E8896FFC971F0B9
HEAD (Message Header)
A1   (Response Code)
00   (Error Code)
U7D4213E0422F4E08E9455D9837E09FDD (Key under LMK)
RA0072B1TX00S000073C35FF96F7A8C7D35D440CCBDA06FFED3AC7017F27B0A0E8896FFC9 (Key under TMK - export tr31 key block)
71F0B9 (Key Check Value)

我的问题是:

如何从 tr31 密钥块中提取密钥(在 tmk 下)?

有谁知道如何解码 tr31 密钥块?

看看 TR31 标准(在法律上不能免费获得,因为 ANSI 想让你的生活变得悲惨)。

  • R 似乎不是 TR31 区块的一部分,我只能假设是 Thales 特有的东西
  • A 是密钥块版本 ID(header 的第一个字段),描述了正在使用的密钥绑定方法。 A 已弃用并使用密钥变体绑定方法。
  • 0072 是整个 TR31 密钥块的十进制数字长度,如果我们忽略前导 R
  • ,则恰好适合
  • B1是key的用法,是一个Initial DUKPT Key
  • T是密钥的算法,即Triple-DES(或TR31表示法中的Triple-DEA)
  • X是使用模式,也就是"Key used to derive other key(s)"
  • 00是key的版本号,表示这个key没有使用key的版本控制
  • S是key的exportability,也就是"Sensitive"
  • 00 是可选块的十进制数。
  • 00 保留供将来使用,并且始终必须是两个 ASCII 零。由于没有可选块,此字段是 header.
  • 的最后一个字段
  • 73C35FF96F7A8C7D35D440CCBDA06FFED3AC7017F27B0A0E 是十六进制编码的加密密钥(header 之后的所有内容,最后 8 个字符除外)。它是 24 字节长,适合 16 字节长的密钥(2 字节密钥长度,16 字节密钥,6 字节填充以获得完整的 8 字节块大小)。
  • 8896FFC9 是 MAC(最后 8 个字符(对于密钥块版本 ID A)是 Triple-DES [=60] 的最左边 32 位=])

要更进一步(解密加密密钥),我需要密钥块保护密钥(可能是 TMK?)。

'R'是Thales使用的scheme flag,表示密钥的格式是TR-31。这通常不会包含在发送给对等设备的任何消息中,因为它不是 TR-31 格式的一部分。