2013-09-24 1 views
0

Я относительно новичок в java, и за последние несколько дней я ломаю голову, чтобы закончить задачу, и все прошло хорошо до последнего «квеста».Как кодировать TO 4 цифры или числовую строку в JAVA?

Более конкретно:

Я хочу создать зашифрованное/закодированный номер 4 цифры из 3 строковых полей. Вы можете представить это как попытку создать 4-значный CVV-номер, например, в кредитных карточках, с помощью (в зависимости от) номера карты, exp. даты и кода обслуживания. Чтобы добиться этого, я сначала зашифровал номер карты с помощью DES со случайным ключом, затем зашифровал (DES) дату с использованием номера зашифрованной карты в качестве ключа, а в качестве последнего шага - код службы шифрования (DES) с использованием зашифрованной даты проверки как ключ. До сих пор, так хорошо, я могу получить на каждом шаге необходимые данные. Проблема в том, что зашифрованный служебный код, который будет моим окончательным результатом, должен иметь длину 4 и содержать только цифры. После двух дней исследования в сети, после попытки несколько попыток, как:

  • хэширования: проблема там не было расшифровывать назад от хэш-значения для зашифрованного кода сервиса
  • Base64 Трансформация: не мог» т достичь длины и только цифры
  • обивка: утратит жизненно важной информации
  • дальнейшего шифрования: не удалось найти алгоритм р создавая такой короткий (с точки зрения длины) ключ.

Есть ли другие решения?

Вот последние 2 шага алгоритма, просто чтобы вы поняли, как он работает.

desCipher.init (Cipher.ENCRYPT_MODE, myDesKey_2);

 // Sensitive information - message to be encrypted 
     byte[] date_of_exp = "032019".getBytes(); // Date of Expiration in form MMYYYY 

     //System.out.println("Card Number : " + card_number); // Print original message 

     // Encrypt the text 
     byte[] date_of_expEncrypted = desCipher.doFinal(date_of_exp); 

     System.out.println(""); 
     System.out.println("Date of Expiration Encrypted : " + date_of_expEncrypted); // Print the encrypted message 
     System.out.println(""); 

     // Initialize the same cipher for decryption 
     desCipher.init(Cipher.DECRYPT_MODE, myDesKey_2); 

     String date_of_expEncrypted_; 
     date_of_expEncrypted_ = DatatypeConverter.printBase64Binary(date_of_expEncrypted); 
     // SecretKey card_numberEncrypted_key; 
     // card_numberEncrypted_key = stringToSecretKey (card_numberEncrypted_, "DES"); 
     SecretKey date_of_expEncrypted_key; 
     date_of_expEncrypted_key = new SecretKeySpec(date_of_expEncrypted, 0, 8, "DES"); 
     System.out.println(""); 
     System.out.println("Date of expiration as secret key :" + date_of_expEncrypted_key); 
     System.out.println(""); 

     // Decrypt the text 
     byte[] date_of_expDecrypted = desCipher.doFinal(date_of_expEncrypted); 

     System.out.println("Original Date of Expiration (decrypted) : " + new String(date_of_expDecrypted)); // Print the decrypted Text 
     System.out.println(""); 
     System.out.println(""); 
     System.out.println("-----------------------------------------------------------------------------------"); 
     System.out.println("Further to Step 3"); // Print the decrypted Text 
     System.out.println("-----------------------------------------------------------------------------------"); // Print the decrypted Text 
     System.out.println(""); 
     System.out.println(""); 




    SecretKey myDesKey_3 = date_of_expEncrypted_key; 

    //Cipher desCipher_2; // New Cipher for iteration 2 

     // Create the cipher 
     //desCipher_2 = Cipher.getInstance("DES/ECB/PKCS5Padding"); 

     // Initialize the cipher for encryption 
     desCipher.init(Cipher.ENCRYPT_MODE, myDesKey_3); 

     // Sensitive information - message to be encrypted 
     byte[] service_code = "318".getBytes(); 

     // Encrypt the text 
     byte[] service_codeEncrypted = desCipher.doFinal(service_code); 
     System.out.println(""); 
     System.out.println("Service Code Encrypted : " + service_codeEncrypted); // Print the encrypted message 
     System.out.println(""); 
     // Initialize the same cipher for decryption 
     desCipher.init(Cipher.DECRYPT_MODE, myDesKey_3); 

     // Decrypt the text 
     byte[] service_codeDecrypted = desCipher.doFinal(service_codeEncrypted); 

     System.out.println("Service Code decrypted : " + new String(service_codeDecrypted)); // Print the decrypted Text 
     System.out.println(""); 
     System.out.println(""); 
     System.out.println("-----------------------------------------------------------------------------------"); 
     System.out.println("Finish!!!"); // Print the decrypted Text 
     System.out.println("-----------------------------------------------------------------------------------"); // Print the decrypted Text 
     System.out.println(""); 
     System.out.println(""); 


     //Integer bigInt = new Integer("Bwwhw34".getBytes()); 
     // int service_codeEncrypted_hashed = service_codeEncrypted.hashCode(); 
     // System.out.println("hash code for Service Code Encrypted : " + service_codeEncrypted_hashed); 
     // int service_codeEncrypted_hashed_2 = service_codeEncrypted_hashed.hashCode(); 

     // byte[] service_code__ = service_codeEncrypted.getBytes(); 
     // System.out.println("hash code for Service Code Encrypted and baseD : " + service_code__); 



    }catch(NoSuchAlgorithmException e){ 
     e.printStackTrace(); 
    }catch(NoSuchPaddingException e){ 
     e.printStackTrace(); 
    }catch(InvalidKeyException e){ 
     e.printStackTrace(); 
    }catch(IllegalBlockSizeException e){ 
     e.printStackTrace(); 
    }catch(BadPaddingException e){ 
     e.printStackTrace(); 
    } 

} 

Выход "Service Code Encrypted" будет в форме [B @ 84abc9, которым бесполезно для моих целей.

Thanx заранее и извините за мой плохой английский!

+0

Ваша задача принципиально невозможна: существует бесконечно много строк символов, но только 10000 4-значных чисел. – Joni

+0

Tahnk вы за ответ. Я был почти уверен в этом, просто хотел быть на 100% уверен. Время поиска альтернативного подхода. – kiko77

ответ

1

«Я хочу создать зашифрованный/закодированный 4-значный номер из 3 строковых полей».

Ваш единственный выбор - хэш, иначе вам понадобится Гарри Поттер, чтобы помочь вам. Или вы ожидали, что вы сможете преобразовать 4 цифры обратно в любые 3 возможные строки? Я боюсь, что такого сжатия не существует.

Что касается вашего «[B @ 84abc9». Это значение по умолчанию дляString() для массива байтов. Перед его отображением вы захотите включить его в шестнадцатеричный или Base64.

+0

Я уже создал строку из трех строковых полей, и на данный момент безопасность не является опцией, так как я закрыт от шифрования на предыдущих шагах. Фактический вопрос заключается в том, как закодировать строку на 4 цифры и как ее восстановить. Хэш мог быть идеальным, если бы существовала функция «дехаширования» ... – kiko77

+0

@ kiko77 Вы просите о невозможных вещах.Вы не можете вернуть исходные строки с 4 цифр. Поэтому единственный способ - либо разрешить более 4-х цифр, либо использовать хэш и сократить его до 4 символов (или цифр). – Kayaman

+0

Я думал, что это почти невозможно, но просто хотел быть уверенным. Хэш работает только одним способом (насколько я знаю) и поэтому на самом деле не помогает мне. – kiko77