2016-09-19 11 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가 ​​실제로 암호화에 사용되었음을 알게되었습니다. 암호화 된 데이터를 3DES로 해독 할 때 AES를 사용할 수 있다는 것을 의미합니까? –

답변

1

3DES-128 비트 CBC 모드 (패딩 제로) 방법을 수행하려고하므로 암호문에서 일반 텍스트를 가져 오는 데이 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

오라클 구현에 대해 바보 같은 점은 SecretKeyFactory이 "2 키"DES 키라고도하는 DES ABA 키를 지원하지 않는다는 것입니다.

트리플 DES 조작을위한 이러한 키는 하나의 DES 키 A와 하나의 DES 키 B로 구성됩니다. 키 A는 DES EDE (DES)에서 DES의 첫 x 째 W 마지막 반복 모두에 사용됩니다.

소프트웨어 내에 있으면 이러한 키를 만드는 방법을 만들 수 있습니다. 문제는 결과 키가 실제로 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

집에서 코덱을 깎아 낼 테지만 그건 중요하지 않습니다. 프로토콜을 모르므로 다른 키를 처리하는 방법을 모르겠습니다. –