【问题标题】:How to decrypt safeNet wrapped exported keys?如何解密 safeNet 包装的导出密钥?
【发布时间】:2020-08-23 16:13:08
【问题描述】:

我已使用名为 KMU 的工具将 3DES 密钥从我的 SafeNet HSM 导出到文件中。此工具在提取之前使用另一个 3DES 密钥包装密钥。我可以访问第二个键的纯文本值。

问题是“如何解密打包文件以获得打包密钥的纯文本值?”

更新:

仅供参考:最终导出的文件如下所示:

L1: 000001f4 000001a800000001000001a0
L2: 00000020 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
L3: 00000140 0000001b0000010300000001010100000162000000010101800001290000000101010000016500000001010000000164000000010100000000010000000101010000000200000001010100000170000000010101000000030000000f014949494949494949494949494949490000010c000000010101000001040000000101010000010a000000010101000001060000000101010000010500000001010100000108000000010101000001070000000101018000012b000000010100000001610000000401000000100000000000000004010000000400000100000000040100000014800001030000000000000001020000000000000001100000000000000001110000000000800001280000000101000000016300000001010080000102000000100132303131313232383136323032313030000000000000000000000000
L4: 00000010 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
L5: 00000020 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxx
L6: 00000020 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
L7: 00000020 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

“x”部分是在原始文件中看起来加密的数据,因此我将它们替换为“x”。我还添加了行号、空格和换行符,以使内容更具可读性!

【问题讨论】:

  • 如果您能够使用工具导出密钥,则可以使用该工具解密(解包)导出的密钥(前提是它支持)。检查该工具是否有unwrap 键的选项。如果没有,则需要编写代码来进行解包操作。
  • 如果您只需将密钥导入 HSM,则无需按照我的回答中所述手动解包。您可以通过“从组件输入密钥”功能导入“第二个密钥”(如果您有明文值,请使用 2 个组件并为第二个组件键入零),然后将此密钥用于“导入密钥”

标签: pkcs#11 hsm safenet


【解决方案1】:

整体方案说明请参见文档Key Management Utility User (KMU) Reference中的“密钥备份功能教程”一章。

很遗憾,该文档尚未更新到使用 AES tK 和 HMAC 用于 M_mK 的方案的最新版本。

据我所知,可以通过 -3 命令行选项告诉 KMU 使用较旧的 DES3 方案。


我有一个可行的实现,但遗憾的是无法提供代码。

关键恢复步骤总结:

  • 检查整体文件结构(magic 0x000001f4 | varLen 编码负载 | 4 字节 MAC | varLen 封装的 MAC 密钥 | varLen 封装的传输密钥)

  • 解包 AES 传输密钥(使用包装密钥及其特定于密钥类型的算法,例如 CKM_RSA_PKCS

  • 解开通用 MAC 密钥(使用 AES 传输密钥和CKM_AES_ECB。长度为 32)

  • 验证编码负载的 MAC(使用带有CKM_SHA512_HMAC_GENERAL 的 MAC 密钥)

  • 从负载中解包所有备份密钥(使用带有CKM_WRAPKEY_AES_CBC 和零 IV 的 AES 传输密钥)


您可能希望使用 PKCS#11 记录器库(请参阅 PTK-C 编程指南)并在密钥还原期间记录 KMU 实用程序的活动以验证是否正常算法细节。

祝你的项目好运!


EDIT> 文件的整体结构(给定您的示例数据):

000001f4 // Magic
000001a8 // Length of encoded payload
    00000001 // Number of keys
    000001a0 // Wrapped key #1 length
        xxxx...xxxx // Wrapped key #1 data for CKM_WRAPKEY_AES_CBC
xxxxxxxx // Payload MAC
00000020 // Wrapped MAC key cryptogram length
    xxxx...xxxx // Wrapped MAC key cryptogram
00000020 // Wrapped transport key cryptogram length
    xxxx...xxxx // // Wrapped transport key cryptogram

请参阅CKM_WRAPKEY_AES_CBCCKM_WRAPKEY_DES3_CBC,了解用于对已编码负载中的单个导出密钥数据 (#1..#n) 进行编码的格式。

【讨论】:

  • 非常感谢亲爱的vlp。我已经用导出文件的审查视图更新了问题。我的文件似乎比您在回答中提到的结构有更多的部分。我错过了什么吗?此外,在我的情况下,原始密钥和包装密钥都是 3DES 密钥。 KMU 工具是否也在备份过程中使用另一个 AES 类型的密钥?为什么要在文件中写入Transport Key?
  • @Abraham 阅读密钥备份功能摘要部分(请注意几年前它从 DES3 切换到 AES+HMAC ——以防您的文档较旧或泰雷兹尚未更新)。使用随机传输密钥是一种常见做法。您导出的密钥使用此随机 AES 传输密钥进行包装,该密钥附加在您的“真实”导出密钥(在您的情况下为 3DES)下的文件中。
  • @Abraham KMU 文档是公开的,所以我添加了link to it。他们没有修复 DES3 与 AES+HMAC 的变化。我会相应地更新答案...
  • 再次感谢亲爱的vlp。我打包的导出文件已有 7 年的历史。 (更准确地说,该文件来自 2013 年!)。你知道泰雷兹是哪一年用 AES+HMAC 代替 3DES 的吗?
  • 亲爱的@Abraham,我敢打赌L1-L5包含magic+payload+mac(mac是L5的最后一部分)。我想你错误地将 L1-L5 解释为单独的块,但实际上它们是有效载荷块内的块,它从 L1 开始,长度为 0x1a0(424 字节)。请注意我的答案中的缩进——编码的有效负载(424 字节)包含键数(4 字节)、第一个键数据的长度(4 个字节)和第一个键数据(416 个字节)。请参阅CKM_WRAPKEY_DES3_CBC 的链接描述。如果您的魔法与我的魔法匹配,则应该使用 AES+HMAC。
猜你喜欢
  • 1970-01-01
  • 2016-11-02
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2018-02-21
相关资源
最近更新 更多