什么是 DUKPT 密钥派生函数?

信息安全 密码学 加密 密钥管理 密钥生成 信用卡
2021-08-23 10:39:15

我的任务是解密从加密读卡器获取的密文。读卡器采用 DUKPT(每次交易派生唯一密钥)方案和 3DES 加密。我对 3DES 加密没有问题,因为它是由 BouncyCastle 和 Java JCE 等知名库实现的通用算法。

在这项任务之前,我根本没有遇到过 DUKPT,所以我完全是新手。

从我目前所读到的内容来看,DUKPT 使用了一种基于基本派生密钥 (BDK) 的密钥派生机制,该密钥派生密钥基本上是特定交易的共享密钥和密钥序列号。在读卡器的情况下,每次我刷卡(即使是同一张卡),密文都会不同,KSN也会不同。知道了 BDK、KSN、加密算法(在这种情况下是 3DES)和密文,我如何根据这些信息推导出交易的密钥?我想有某种密钥派生功能对吗?

3个回答

它基本上是这样工作的:服务器有一个主密钥(BDK),每个客户端设备都有一个唯一的序列号和一个计数器(组合起来就是 KSN)。

要设置新设备,您使用主密钥(BDK,Yoav 答案中的链接中描述的过程)加密 KSN,并获得一个新密钥(IPEK)。这有点像您需要两个人(服务器和客户端)用两个密钥(BDK 和 KSN)打开一个包含另一个密钥的保险库。另一个密钥是 IPEK,是您安装在设备本身上的密钥。

客户端设备使用 IPEK 提出未来密钥表,然后丢弃 IPEK。所以客户端设备现在拥有它的原始序列号、一个计数器(组合为 KSN)和一个未来密钥列表。

为了加密数据,客户端设备从列表中获取第一个未来密钥并将其用作加密密钥。然后它将加密数据和它的 KSN(包含计数器)发送到服务器。

在服务器端,服务器知道它自己的秘密(BDK)并且现在拥有客户端设备的 KSN。服务器使用这两个密钥生成 IPEK(再次打开该保管库)。使用 IPEK,服务器可以重新创建未来密钥表并知道客户端提供的计数器(KSN 的最后 5 个字符),它知道要使用表中的哪个密钥。

至于所有技术细节,我建议查看 Andy Orrock 的博客(链接到 Yoav 的答案),也许可以获取一份具有完整规范的 ANSI X9.24 副本。

无法在网上找到很多资源,但我想这应该在某个地方进行相当全面的规范。然而,我确实发现了对推导过程的描述

如果我理解正确的话,推导函数的工作原理大致如下:

  1. 使用某种形式的填充对其KSN进行标准化
  2. 归一化KSN然后BDK
  3. 此过程的输出是事务的派生密钥

希望我没有误导你。这可能值得更熟悉实际规格的人回答。

如何创建未来密钥的细节非常可怕,但它们包含在 ANSI 规范中。该规范尚未正式在线提供,但如果您在 Google 中搜索“Baidu ansi x9.24”,您将获得 2004 版本的链接(当前为 2009)。在百度(谷歌的中文回答)网站上阅读它令人不快,但 ANSI 想要收取的 140 美元更令人不快。在将钱投入到当前版本的规范之后(在百度玩了几天之后),我可以证明这个过程并不明显。