2016-09-19 7 views
2

暗号化されたデータを復号化する過程で、少し挑戦しています。誰かが私を助けることができるなら、私はとてもうれしいでしょう。Javaを使用して3DES-128ビットのCBCモード(パディングゼロ)でデータを復号する

、私はすでにそのベース導出キー(BDK)を持つデバイスからの私のデータを取得するには居ないので、私はすでに、この操作を行う際に、アルゴリズムを研究している、が、最初にロードキーのシリアル番号最初にロードされたピン入力デバイスキー。与えられたドキュメントで

、我々は最初にロードキーのシリアル番号データ暗号化キーバリアントトラック(平文である)2データを持っています。

この例では、実際に3DES-128ビットのCBCモード(パディングゼロ)メソッドを使用したことがわかりました。

私の質問は、暗号化されたデータから平文がどのように取得されたかです。もし誰かが私に(このデータを解読するのに使う流れやアルゴリズムを伝える)ことができれば、私はとてもうれしいでしょう。

あなたの時間を非常に感謝します。

+0

3DESは168ビットです。場合によってはキーの一部が再利用されるため、112ビットになります。違いは、バイト当たりのMS 7ビットのみが使用され、LSビットが最初はパリティに使用されたが、現在の使用では一般的に無視されるためである。しかし、DESと3DESは新しい作業に使用すべきではなく、代わりにDESに代わるAESを使用するべきです。パディングが使用されていない場合、入力データは必ず**ブロックサイズの倍数でなければなりません。DESの場合は8バイト、PKCS#5のパディングが通常使用されます。 – zaph

+0

あなたのテストデータは、あなたがDUKPTキーについて話していることを示唆しています。これはかなりのプロセスです。私は[このブログ](https://www.parthenonsoftware.com/blog/how-to-decrypt-magnetic-stripe-scanner-data-with-dukpt/)で多くのヘルプを見つけましたそれを実装する。 –

+1

@zaphですが、暗号化の過程で、3DESが実際にその暗号化に使用されたことを知りました。暗号化されたデータを暗号化する際にAESを使用することは可能ですか? –

答えて

1

3DES-128ビットのCBCモード(パディングゼロ)の方法を試したいので、このgit https://github.com/meshileya/dukptを使って暗号文から平文を取得してみましょう。

既にBDKとKSNがあるので、以下の方法を実行してみてください。

public static void main(String[] args) { 
    try { 
     String theksn = "This should be your KSN"; 
     String encrypted = "This should be the encrypted data"; 
     String BDK = "The BDK you mentioned up there"; 

      tracking= DukptDecrypt.decrypt(theksn, BDK, encrypted); 

      System.out.print("PlainText"+ tracking); 
     }catch (Exception e){System.out.print(e);} 

    } 
0

Oracle実装に関するさらに愚かなことの1つは、SecretKeyFactoryが「2キー」DESキーとも呼ばれるDES ABAキーをサポートしていないことです。

トリプルDES操作のこれらのキーは、単一のDESキーAとそれに続く単一のDESキーBで構成されます。キーAは、DES EDE(暗号化 - 復号化 - 暗号化)内のDESの最初と最後の繰り返しの両方に使用されます。

ソフトウェア内にいる場合は、そのようなキーを作成する方法を作成できます。問題は結果として得られるキーが実際には192ビットしか持たないことです。これは単に正しくないため、キーサイズを区別することが不可能になります。

private static final byte[] ENCRYPTION_KEY = Hex.decode("448D3F076D8304036A55A3D7E0055A78"); 
private static final byte[] PLAINTEXT = Hex.decode("1234567890ABCDEFFEDCBA0987654321"); 

public static void main(String[] args) throws Exception { 
    SecretKey desABAKey = createDES_ABAKey(ENCRYPTION_KEY); 
    Cipher desEDE = Cipher.getInstance("DESede/CBC/NoPadding"); 
    IvParameterSpec zeroIV = new IvParameterSpec(new byte[desEDE.getBlockSize()]); 
    desEDE.init(Cipher.ENCRYPT_MODE, desABAKey, zeroIV); 
    byte[] ciphertext = desEDE.doFinal(PLAINTEXT); 
    System.out.println(Hex.toHexString(ciphertext)); 
} 
:それはCBC暗号化(なしパディング、およびゼロIV)を私たちに残して、

private static final int DES_KEY_SIZE_BYTES = 64/Byte.SIZE; 
private static final int DES_ABA_KEY_SIZE_BYTES = 2 * DES_KEY_SIZE_BYTES; 
private static final int DES_ABC_KEY_SIZE_BYTES = 3 * DES_KEY_SIZE_BYTES; 

public static SecretKey createDES_ABAKey(byte[] key) { 
    if (key.length != DES_ABA_KEY_SIZE_BYTES) { 
     throw new IllegalArgumentException("128 bit key argument with size expected (including parity bits.)"); 
    } 
    try { 
     byte[] desABCKey = new byte[DES_ABC_KEY_SIZE_BYTES]; 
     System.arraycopy(key, 0, desABCKey, 0, DES_ABA_KEY_SIZE_BYTES); 
     System.arraycopy(key, 0, desABCKey, DES_ABA_KEY_SIZE_BYTES, DES_KEY_SIZE_BYTES); 
     SecretKeySpec spec = new SecretKeySpec(desABCKey, "DESede"); 
     SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); 
     SecretKey desKey = factory.generateSecret(spec); 
     return desKey; 
    } catch (GeneralSecurityException e) { 
     throw new RuntimeException("DES-EDE ABC key factory not functioning correctly", e); 
    } 
} 

OK:

とにかく、次のコードは、DESのABA鍵を生成するために使用することができます

私はBouncy Castleの16進コーデックを使用しましたが、他の16進コーデックも使用できます。

+0

ご説明いただきありがとうございます。使用したBouncy Castle Hexadecimalコーデック、bcprov-jdk15-130.jar、bcprov-1.45.jarについて知りたいですが、.toHexStringメソッドが表示されません。もう一度あなたの時間をありがとう。 –

+0

そして、私はどのようにしてKSNとBDK鍵で暗号化されたデータを解読し、暗号化することができますか? –

+0

私は自宅でコーデックを噛み締めますが、それは本当に問題ではありません。私はプロトコルを知らないので、他のキーをどのように扱うかわかりません。 –

関連する問題