2013-11-27 2 views
4

Моя цель - написать программу Java для шифрования текстового файла (cipher text) с использованием AES algorithm. Затем напишите еще одну программу для дешифрования этого зашифрованного файла (cipher text), чтобы вернуть текст. Я хочу использовать тот же ключ (тот же ключ, генерировать один раз, сохранять его где-то и использовать его как в программе шифрования, так и для дешифрования) для шифрования и дешифрования. Если я сгенерирую ключ и выполняю шифрование и дешифрование по строкам в одной и той же программе, тогда он отлично работает. Вот рабочий фрагмент кода для этого:Как генерировать секретный ключ в Java один раз и использовать этот ключ в двух разных программах

 String strDataToEncrypt = new String(); 
     String strCipherText = new String(); 
     String strDecryptedText = new String(); 

     KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
     keyGen.init(128); 
     SecretKey secretKey = keyGen.generateKey(); 

     Cipher aesCipher = Cipher.getInstance("AES"); 
     aesCipher.init(Cipher.ENCRYPT_MODE,secretKey); 

     strDataToEncrypt = "any text input"; 
     byte[] byteDataToEncrypt = strDataToEncrypt.getBytes(); 
     byte[] byteCipherText = aesCipher.doFinal(byteDataToEncrypt); 
     strCipherText = new BASE64Encoder().encode(byteCipherText); 
     System.out.println("cipher text: " +strCipherText); 
     aesCipher.init(Cipher.DECRYPT_MODE,secretKey,aesCipher.getParameters()); 
     byte[] byteDecryptedText = aesCipher.doFinal(new BASE64Decoder().decodeBuffer(strCipherText)); 
     strDecryptedText = new String(byteDecryptedText); 
     System.out.println("plain text again: " +strDecryptedText); 

Но, мне нужно иметь две разные программы (Java-файлы) для шифрования и дешифрования. Итак, я должен как-то сгенерировать ключ и сохранить это где-то. Затем используйте тот же ключ для программы шифрования и дешифрования. Как я могу это сделать?

EDIT_1

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(128); 
SecretKey secretKey = keyGen.generateKey(); 
byte[] encoded = secretKey.getEncoded(); 
System.out.println("key: "+encoded);// key: [[email protected] 

я могу получить кодированный ключ с помощью приведенной выше программы. Но мой вопрос заключается в том, как генерировать SecretKey, используя это значение в моей программе дешифрования?

+0

Вы создали ключ, что мешает вам записать его в файл, а затем прочитать его во второй программе? –

+0

@JimGarrison, пожалуйста, посмотрите мое редактирование. –

+0

Ключ - это 'byte []', для которого система использует 'Object # toString()', который просто записывает внутреннее удостоверение. Вам нужно написать отдельный байт _values_ в файл, возможно, сначала преобразовать их в шестнадцатеричный. –

ответ

11

Простите меня, если я неправильно понял ваш вопрос, но я верю, что вы хотите восстановить SecretKey объект из существующего ключа закодированных в массиве байтов.

Это может быть выполнено просто с помощью конструктора по javax.crypto.spec.SecretKeySpec «ы, как, например:

byte[] encoded = //Key data 

SecretKey secretKey = new SecretKeySpec(encoded, "AES"); 

Поскольку SecretKeySpec является подклассом SecretKey не требуется литья. Если ваш алгоритм шифрования/декодирования изменится, обязательно измените строковый литерал, используемый в конструкторе AES, любому алгоритму, который вы решили использовать в будущем.

+1

Спасибо, я использовал Base64Coder для преобразования ключа в Hex String и сохранил его в настройках, затем извлек ключ и расшифровал его с помощью Base64Coder, и он отлично работал. – Diljeet

1

Вот один способа напечатать значения в byte[] массиве в шестнадцатеричном:

byte[] a = {-120, 17, 42,121}; 
for (byte b : a) 
{ 
    System.out.printf("%2X",b); 
} 
System.out.println(); 
+0

Я тоже могу использовать это: Arrays.toString (byte []) , чтобы получить содержимое массива байтов. Но я не уверен, как инициализировать SecretKey, используя это значение. Все еще копаю в нем. –

+0

Если вы используете 'Arrays.toString (byte [])', вы пройдете преобразование кодировки с байтовым символом, которое не может быть обратимым. –

+0

['Arrays.toString (byte [])'] (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#toString (byte [])) определяется как создать стандартное представление массива, которое вряд ли изменится. Однако я согласен, что это определенно не идеально для этой цели. @KeenLearner Рассмотрите кодировку hex или Base64, если вам нужно представить ключ в ASCII, и имейте в виду, что файлы могут содержать двоичные данные. – ntoskrnl

Смежные вопросы