Как создать секретный ключ в Java один раз и использовать этот ключ в 2 разных программах

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

        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: [B@52b2a2d8

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

2 ответа

Решение

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

Это можно сделать, просто используя javax.crypto.spec.SecretKeySpecконструктор как таковой:

byte[] encoded = //Key data

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

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

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

byte[] a = {-120, 17, 42,121};
for (byte b : a)
{
    System.out.printf("%2X",b);
}
System.out.println();
Другие вопросы по тегам