用于通过键盘仿真解密信用卡读卡器数据的3DES和DUKPT的Java实现?

时间:2015-03-20 20:39:37

标签: java credit-card 3des credit-card-track-data dukpt

我们有一个在线键入界面,并支持信用卡刷卡功能。在今天的行业中,读卡器应该在将信息编码为ASCII之前加密信息,然后由服务器端解密。 (所以本地机器永远不会看到卡片信息)

我在键盘仿真模式下使用MagTek读卡器,并且为了测试目的而注入ANSI标准密钥。一旦解码&解密成功后,我们将自己的密钥注册到MagTek并订购一些生产用户。

我知道这个解密以前是在C#和其他语言中实现的,但需要Java中的东西,或者可能包含在Java webapp中的其他一些CLI可访问的程序。我将继续将一些C#代码移植到Java,但首先需要设置一个C#环境。 (我之前从未这样做过。)

一旦我确保C#版本运行良好,那么我知道我可以使用我常用的调试技术消除移植过程中的任何错误。

在我完成所有这些之前,如果有更简单的方法,请告诉我。我认为这已经在Java中完成了,但也许不是......

1 个答案:

答案 0 :(得分:1)

部分答案,CW为任何人添加。

首先,我不清楚(对我而言)是否要在可能已下载(如applet或webstart)的滑动设备的PC或类似设备上运行,或只是获取加密的滑动数据(在一个webform?)并将其发送到您的服务器进行解密。我建议后者使PCI DSS合规更容易。

Java加密确实以名称DESede(不区分大小写,与所有JCA密码名称一样)执行 3DES 。一个稍微不明显的观点:SunJCE中的实现只处理完整的24字节密钥。 DUKPT使用"双键3DES",因此您需要复制" left"字节0-7,"右"到8-15,"离开"再次到16-23。如果你使用BouncyCastle(就像我的商店那样),它可以使用一个16字节的密钥并在内部进行复制,这稍微方便一些。 (Java中的对称密钥是瘦包装类中的字节数组,通常为javax.crypto.spec.SecretKeySpec。)

如果您一般不熟悉Java加密,那么模式就是您获得了一个"实例"来自"提供商的特定算法或模式" (您可以指定一个或让Java自动选择;可以使用通用API类Cipher添加一些内容,并且可以添加更多内容,例如" bcprov"来自www.BouncyCastle.org,{{1 },Signature等,然后使用所需参数(例如键或IV和方向)初始化该实例,然后调用方法获取输入数据并以单独(可能是多个)步骤或在简单组合MessageDigest(这适用于您的情况)。适用的API类doFinal的JCA手册http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipher和javadoc(位于http://docs.oracle.com/javase/8/docs/api/index.html并且也自动显示在主要IDE中)具有相当详尽的详细信息。

我还没有看到 DUKPT 的任何公开/免费实施,但这并不能证明没有。如果没有人提供更好的代码,只需编写X9.24中的步骤就可以直截了当,虽然有点单调乏味。