我的任务是解密从加密读卡器获得的密文。读卡器采用DUKPT(每次事务导出唯一密钥)方案和3 3DES加密。我对3 3DES加密没有任何问题,因为它是由众所周知的库(如BouncyCastle和Java )实现的常见算法。
在此之前,我从来没有遇到过DUKPT,所以我是一个完整的新手。
根据我到目前为止所读到的,DUKPT使用了基于基本派生密钥(BDK)的密钥派生机制,它基本上是特定事务的共享密钥和密钥序列号。在读卡器的情况下,每次我刷卡(即使是用同一张卡),密码文本将是不同的,KSN将是不同的。了解BDK、KSN、加密算法(在本例中是3 3DES)和密码文本,如何根据这些信息导出事务的密钥?我可以想象有某种关键的派生函数,对吗?
发布于 2012-03-31 03:54:07
它基本上是这样工作的:服务器有一个主密钥( BDK),每个客户端设备都有一个唯一的序列号和一个计数器(组合起来就是KSN)。
要设置一个新设备,您可以使用主密钥( BDK,Yoav的答案中的链接中描述的过程)加密KSN,然后得到一个新的密钥( IPEK)。这有点像你需要两个人(服务器和客户端)用两个密钥( BDK和KSN)来打开一个包含另一个密钥的金库。另一个密钥是IPEK,是您在设备本身上安装的。
客户端设备使用IPEK生成未来密钥表,然后丢弃IPEK。因此,客户端设备现在有它的原始序列号、计数器(合并为KSN)和未来密钥列表。
为了加密数据,客户端设备从列表中获取第一个未来密钥,并将其用作加密密钥。然后,它发送加密的数据,它是KSN (包含计数器)到服务器。
在服务器端,服务器知道自己的秘密( BDK),现在拥有clent设备的KSN。服务器使用这两个密钥来生成IPEK (再次打开那个金库)。使用IPEK,服务器可以重新创建未来密钥表,并知道客户端提供的计数器(KSN的最后5个字符),它知道表中要使用哪个键。
至于所有的技术细节,我建议看看Andy的博客(链接在Yoav的答案中),也许可以得到一份ANSIX9.24的副本,它有完整的规范。
发布于 2012-03-30 21:01:44
在网上找不到很多资源,但我想应该在某个地方详细说明一下。然而,我发现的是这种对派生过程的描述。
如果我正确理解了这一点,派生函数的工作原理大致如下:
KSN
使用某种形式的填充进行规范化。KSN
将使用BDK
加密。希望我没有误导你。这可能值得更熟悉实际规范的人回答。
发布于 2012-04-19 05:30:45
关于如何创建未来密钥的细节是相当可怕的,但它们包含在ANSI规范中。规范在网上还没有正式发布,但是如果你在谷歌上搜索“百度ansi x9.24”,你会得到2004年版本的链接(当前是2009年)。在百度(谷歌的中文答案)网站上读到它是令人不快的,但ANSI想要收取的140美元更令人不快。在投资了目前版本的规范(在和百度玩了几天之后),我可以证明这个过程一点也不明显。
https://security.stackexchange.com/questions/13309
复制相似问题