【问题标题】:Java implementation of 3DES and DUKPT for decryption of credit card reader data through keyboard emulation?3DES和DUKPT的Java实现,用于通过键盘仿真解密信用卡读卡器数据?
【发布时间】:2015-05-24 09:20:18
【问题描述】:

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

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

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

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

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

【问题讨论】:

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


【解决方案1】:

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

首先,不清楚(对我来说)您是想在 PC 或类似设备上运行(可能已下载)滑动设备(如小程序或 webstart),还是仅获取加密的滑动数据(在网络表单中?)并将其发送到您的服务器进行解密。我建议后者使 PCI DSS 合规性更容易。

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

如果您一般不熟悉 Java 加密,则模式是您从“提供者”获取特定算法或模式的“实例”(您可以指定一个或让 Java 自动选择;有几个是内置的还可以添加更多内容,例如 www.BouncyCastle.org 中的“bcprov”)使用通用 API 类 CipherSignatureMessageDigest 等,然后使用所需参数(例如密钥或 IV,和方向),然后调用方法来获取输入数据并以单独的(可能是多个)步骤或以简单的组合doFinal(这对您的情况很好)返回输出。 JCA 手册 http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipher 和适用 API 类 javax.crypto.Cipher 的 javadoc(在 http://docs.oracle.com/javase/8/docs/api/index.html 并自动显示在领先的 IDE 中)对此有相当完整的详细信息。

我还没有看到 DUKPT 的任何开放/免费实现,但这并不能证明不存在。从 X9.24 开始编写步骤很简单,虽然有点乏味,如果没有人提供更好的代码的话。

【讨论】:

  • 谢谢,这是有用的信息。我最终继续使用端口,并且进展顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-12
  • 2014-03-03
  • 2015-11-02
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多