Я относительно новичок в 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 заранее и извините за мой плохой английский!
Ваша задача принципиально невозможна: существует бесконечно много строк символов, но только 10000 4-значных чисел. – Joni
Tahnk вы за ответ. Я был почти уверен в этом, просто хотел быть на 100% уверен. Время поиска альтернативного подхода. – kiko77