2016-09-19 11 views
2

В процессе дешифрования зашифрованных данных у меня есть небольшая проблема с ним. Я буду так рад, если кто-нибудь сможет помочь мне.Расшифруйте данные с помощью 3DES-128 бит Режим CBC (добавочный ноль)) с помощью java

Хотя, я уже изучил алгоритм при выполнении этой операции, так как я, чтобы мои данные из устройства, которое уже имеет свою Base ДИФФЕРЕНЦ Key (BDK), Первоначально загружен серийный номер ключа и первоначально загруженный ключ устройства ввода-вывода.

В документации, которая была были даны, мы имеем Первоначально загружен серийный номер ключа, шифрования данных варианта ключ и трека 2 данные (который находится в незашифрованном виде).

В этом примере я был проинформирован о том, что они на самом деле использовали метод CBC Mode (добавочный ноль) для 3DES-128 бит.

Вопрос теперь в том, как был получен открытый текст из зашифрованных данных. Я буду так рад, если кто-нибудь сможет меня опробовать (указав поток или алгоритм для использования в расшифровке этих данных).

Буду признателен за ваше время.

+0

3DES - 168 бит. Иногда часть ключа используется повторно, так что это 112 бит. Разница заключается в том, что используются только MS 7-бит на байт, сначала бит LS был использован для контроля четности, но обычно игнорируется в текущем использовании. Но DES и 3DES не должны использоваться в новой работе, вместо этого используйте AES, который заменяет DES. Если никакого дополнения не используется, входные данные должны всегда ** быть кратным размеру блока, обычно используется 8-байтная для DES, PKCS # 5. – zaph

+0

Ваши тестовые данные говорят о том, что вы говорите о ключах DUKPT.Это довольно сложный процесс. Я нашел большую помощь в [этом блоге] (https://www.parthenonsoftware.com/blog/how-to-decrypt-magnetic-stripe-scanner-data-with-dukpt/), когда ее реализации. –

+1

@zaph, но, в процессе его шифрования, я был ознакомлен с тем, что 3DES фактически использовался для его шифрования. Означает ли это, что можно использовать AES для дешифрования зашифрованных данных 3Des? –

ответ

1

Поскольку вы хотите попробовать метод 3D-128 бит CBC Mode (padding zero), попробуйте этот 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 заключается в том, что SecretKeyFactory не поддерживает ключи DES ABA, также известные как «ключи с двумя ключами».

Эти ключи для операции Triple-DES состоят из одного DES-ключа A, за которым следует один ключ DES DES. Клавиша A используется как для первой, так и для последней итерации DES в DES EDE (Encrypt-Decrypt-Encrypt).

Если вы остаетесь в рамках программного обеспечения, вы можете создать способ создания таких ключей. Проблема в том, что в результате у ключей на самом деле есть 192 бита, что просто неверно - это делает невозможным различать размеры ключей.

Во всяком случае, следующий код может быть использован для создания DES ABA ключей:

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); 
    } 
} 

ОК, так что оставляет нас с шифрованием CBC (без заполнения и нулевого IV):

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)); 
} 

Я использовал шестнадцатеричный кодек Bouncy Castle, но также можно использовать другие шестнадцатеричные кодеки.

+0

Большое спасибо за ваше объяснение, и я хотел бы знать, что вы использовали шестнадцатеричный кодек Bouncy Castle, bcprov-jdk15-130.jar, а также bcprov-1.45.jar, но до сих пор не видим метода .toHexString. спасибо за ваше время еще раз. –

+0

и, как я могу расшифровать и зашифрованные данные, которые были зашифрованы с помощью KSN и ключа BDK? –

+0

Я прочитаю кодек дома, но это не имеет большого значения. Я не знаю протокол, поэтому я не уверен, как обращаться с другими ключами. –