簡體   English   中英

3DES和DUKPT的Java實現,用於通過鍵盤仿真解密信用卡讀取器數據?

[英]Java implementation of 3DES and DUKPT for decryption of credit card reader data through keyboard emulation?

我們有一個在線鍵入界面,並且支持信用卡刷卡功能。 在當今的行業中,讀卡器應該先對信息進行加密,然后再將其編碼為ASCII,然后由服務器端進行解密。 (因此本地計算機永遠不會看到卡信息)

我在鍵盤仿真模式下使用MagTek讀卡器,並插入了ANSI標准密鑰以進行測試。 解碼成功后,我們將在MagTek中注冊自己的密鑰,並訂購一些生產用讀卡器。

我知道這種解密以前是用C#和其他語言實現的,但是需要Java或Java Webapp附帶的其他一些可通過CLI訪問的程序。 我將繼續將一些C#代碼移植到Java,但首先需要設置一個C#環境。 (我以前從未做過。)

一旦確保C#版本運行良好,便知道可以使用常規調試技術消除移植期間的任何錯誤。

在進行所有這些操作之前,如果有更簡單的方法,請告訴我。 我認為這已經在Java中完成,但也許還沒有...

部分答案,任何人都可以添加的CW。

首先,(對我而言)尚不清楚,是要在可能下載了滑動設備的PC或類似設備上運行(例如applet或webstart),還是要獲取加密的滑動數據(在Web表單中?)並發送它到您的服務器解密。 我建議后者使PCI DSS合規性更容易。

Java crypto當然使用名稱為DESede的3DES (不區分大小寫,就像所有JCA Cipher名稱一樣)。 一點不太明顯的觀點: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類CipherSignatureMessageDigest等被添加,例如來自www.BouncyCastle.org的“ bcprov”,然后使用所需的參數(例如key或IV和direction)初始化該實例,然后調用要采用的方法輸入數據並以單獨(可能是多個)步驟或以簡單的組合doFinal (適合您的情況)返回輸出。 適用於API類javax.crypto.Cipher的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中的步驟進行編碼雖然很繁瑣,但卻很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM