0

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

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

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

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

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

4

1 回答 1

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 自动选择;有几个是内置的,更多可以使用通用 API 类Cipher, Signature,等添加,例如 www.BouncyCastle.org 中的“bcprov”)MessageDigest,然后使用所需参数(例如键或 IV 和方向)初始化该实例,然后调用方法以获取输入数据和以单独的(可能是多个)步骤或简单的组合doFinal(这对您的情况很好)返回输出。适用 API 类的 JCA 手册http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#Cipherjavax.crypto.Cipher和 javadoc (位于http://docs.oracle.com/javase/8/docs/api/index.html并且还自动显示在领先的 IDE 中)对此有相当完整的详细信息。

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

于 2015-03-21T04:43:42.597 回答