技术文章
支付设备集成工具:加密/解密工具
ID TECH 为使用我们产品开发支付应用的人员提供了多款出色的免费实用工具。在近期的几篇文章中,我介绍了 Parsomatic(我们以网页表单形式实现的免费数据解析器),以及 UDemo——这款通用 SDK 测试应用兼容我们所有非传统产品(基于 C# 在 Windows 平台上实现)。在此,我还要向您推荐 Encrypt/Decrypt Tool(加密/解密工具),点击 此链接.
即可在浏览器中加载该工具。Encrypt/Decrypt Tool 是一款功能强大、独立运行的单页 HTML 应用,原生 JavaScript 实现了 AES 加密、三重 DES、DUKPT 密钥派生、SHA 哈希、HMAC 等众多功能。所有逻辑均包含在单一页面中(不依赖任何服务端代码),这意味着您可以下载该 HTML 文件,并直接在浏览器中(例如借助 Chrome 出色的开发者工具)查看其逻辑实现。
正如上方截图所示,Encrypt/Decrypt Tool 顶部按钮会展开一个下拉菜单,列出该工具的部分功能。客户经常会问的一个问题是:"如何解密从读卡器读取的磁道数据?"(指磁条数据中或 EMV 标签中可能包含的信用卡磁道信息)。此类数据通常采用 AES 或三重 DES 加密(不过 ID TECH 也支持其他加密算法)。解密这类数据可能会有些棘手,但难点不在于解密操作本身,而在于密钥的生成和使用方式。
在行业内的大多数信用卡场景中,读卡器会使用一个针对当次交易唯一的一次性密钥来加密敏感卡片数据。这就是所谓的 DUKPT 方案。在 DUKPT(每笔交易派生唯一密钥)机制中,每笔交易都会派生一个 新密钥 ,使任何密钥都不会被重复使用(从而防止重放攻击)。读卡器初始时拥有一个唯一的 128 位密钥,每次刷卡时计数器都会递增。该计数器存储在一个名为密钥序列号(KSN)的值中。请注意,KSN 本身是公开的。(在实际解密场景中,KSN 会与加密数据一同发送给解密方。)交易发生时,KSN 会通过一种特殊算法与读卡器的 原始 加密密钥相结合,以派生出一个唯一的 新 密钥(使用单向哈希,因此即使某个特定密钥被盗,也无法据此计算出其他密钥)。该算法由 ANSI X.9-24 标准定义。这是一种相当巧妙的对称密钥管理方案,但实现起来也颇有难度。所以我们已经为您完成了实现工作。(注: 我上一篇文章 中提到的 UDemo 程序同样包含可完成 DUKPT 密钥派生的解密功能,但不附带源代码。)
要解密加密后的磁道数据,您需要该笔交易的 KSN、一个 BDK 以及加密数据。使用 Encrypt/Decrypt Tool 时,您需按上方截图所示选择"Encrypt or decrypt data"(加密或解密数据),然后点击随即出现的小按钮 派生…… 。此时会弹出一个小对话框,让您输入 KSN(10 字节十六进制)和一个 16 字节的基础派生密钥(BDK,代表用于生成在读卡器出厂时注入其中的初始 PIN 加密密钥 IPEK 的原始密钥)。在测试和开发中,大多数人使用所谓的 ANSI 标准测试密钥(值为 0123456789ABCDEFFEDCBA9876543210)作为 BDK。Encrypt/Decrypt Tool 中的默认 BDK 值即为此值(不过可以轻松覆盖)。
输入 10 字节的 KSN(以十六进制字节形式,可带空格也可不带)后,您可以选择要生成的密钥变体(PIN、Data 或 MAC),然后点击较大的 派生密钥 按钮。系统将计算出一个 16 字节的密钥(并显示在主界面上)。如果您正在跟着操作,可以尝试输入 KSN 为 62 99 49 01 19 00 00 00 00 02(并接受默认 BDK),然后点击该按钮 派生密钥 ,验证您是否得到派生数据密钥值 1A994C3E09D9ACEF3EA9BD4381EFA334。
利用得到的密钥,便可解密如下原始数据块:
DA 7F 2A 52 BD 3F 6D D8 B9 6C 50 FC 39 C7 E6 AF 22 F0 6E D1 F0 33 BE 0F B2 3D 6B D3 3D C5 A1 F8 08 51 2F 7A E1 8D 47 A6 0C C3 F4 55 9B 1B 09 35 63 BE 7E 07 45 90 72 AB F8 FA AB 53 38 C6 CC 88 15 FF 87 79 7A E3 A7 BE
如下方 Output(输出)所示,解密后的数据以"%B42"开头(请注意工具提示,其中包含解密数据的 ASCII 显示),并包含一位 George W. Bush, Jr. 先生的卡片数据:
即使密钥中仅有 一个比特 错误,解密结果也会是无法识别的乱码。(不妨亲自试试:在工具中运行此示例,并随机翻转密钥中的一个比特。)
以上只是 Encrypt/Decrypt Tool 功能的一小部分示例。如需进一步了解 DUKPT 的工作原理(以及如何解密信用卡数据),请务必阅读我此前关于此主题的两篇连载文章, 从此处开始.
对密钥注入有疑问?还是加密、MSR 或 EMV 方面的问题?欢迎联系我们的专家。随时致电: 1-800-984-1010.
