2012-01-25 3 views
3

У меня есть файл, зашифрованный с помощью Java-приложения с использованием AES. У меня также есть ключ, который был зашифрован. Но я не могу понять, как использовать ключ для дешифрования файла. Большинство учебников и примеров создают временный случайный ключ, шифруют файл и расшифровывают его в одном месте. Итак, вопрос как указать ключ, который необходимо использовать для расшифровки?Расшифровать зашифрованный файл AES в java

EDIT: Образцы я нашел применение следующий код для генерации ключа. Я понятия не имею, где я могу использовать свой ключ здесь.

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey key = kgen.generateKey(); 
+2

Разве вы не можете просто бросить ключ в учебник вместо случайного ключа? Или вам действительно нужно преобразовать пароль и соль в бит ключа? Если вы укажете нам то же учебное пособие, на которое вы смотрите (и/или цитируете немного кода здесь), мы могли бы помочь выяснить, как его изменить. – Rup

+0

см. Мое редактирование выше –

+0

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

ответ

2

Просто подведем свои комментарии к ответу Люцифера.

  1. Если вы не знаете, какое дополнение использовалось для шифрования, тогда расшифруйте с помощью набора «no padding». Это расшифровывает все, включая прописку, и не будет вызывать ошибку из-за несоответствующего заполнения.

  2. Когда вы расшифровали cyphertext, посмотрите на последний блок вывода и посмотрите, какое дополнение было использовано. Различные paddings оставляют разные байтовые шаблоны, поэтому их обычно достаточно легко рассказать.

  3. Установите метод расшифровки, чтобы ожидать нужного типа заполнения, и он будет автоматически удален для вас.

+0

Спасибо всем. Выведенный результат дешифрования был GZIP-ed. Теперь я ожидал результата. Еще раз спасибо! –

+1

Для адептов unix никогда не помешает запустить команду «файл» против вывода, который вы не можете понять ... –

0

Пожалуйста, попробуйте следующие методы, если они могут быть полезны для вас.

private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) 
     throws Exception 
{ 
    int minSize = cipher.getOutputSize(data.length); 
    byte[] outBuf = new byte[minSize]; 
    int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); 
    int length2 = cipher.doFinal(outBuf, length1); 
    int actualLength = length1 + length2; 
    byte[] result = new byte[actualLength]; 
    System.arraycopy(outBuf, 0, result, 0, result.length); 
    return result; 
} 

private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception 
{ 
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
      new AESEngine())); 
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); 
    aes.init(false, ivAndKey); 
    return cipherData(aes, cipher); 
} 

private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception 
{ 
    PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(
      new AESEngine())); 
    CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); 
    aes.init(true, ivAndKey); 
    return cipherData(aes, plain); 
} 
+0

У меня есть «org.bouncycastle.crypto.InvalidCipherTextException: блок блокировки поврежден». –

+0

Убедитесь, что для расшифровки указано такое же дополнение, как и для шифрования. Если вы этого не знаете, укажите «no padding» для дешифрования и посмотрите на конец последнего блока, чтобы определить, какое дополнение используется для шифрования. – rossum

+0

@rossum: если я знал только прокладку, которую они использовали для шифрования. –

2

Ответ может быть просто поставить ключевые данные, как байты в SecretKeySpec, как это:

SecretKeySpec aesKey = new SecretKeySpec(myKeyData, "AES"); 

Обратите внимание, что SecretKeySpec реализует ключевой интерфейс, так что вы можете использовать его непосредственно в методе Cipher.init() , Поэтому нет необходимости в SecretKeyFactory, который вы бы использовали в противном случае.

+0

Спасибо, это полезно. Я расшифровал файл, но это содержимое двоичного беспорядка. Очевидно, что я сделал что-то не так. –

+0

Является ли все сообщение беспорядком, или только первые 16 байт? Можете ли вы дать нам немного больше информации об используемом алгоритме, и если вы указали вектор IV (если режим = CBC)? Что такое прокладка? Они задаются в 'Cipher.getInstance ();' –

+0

Весь файл - беспорядок. Вот история: файл, который я хочу расшифровать, - это файл .script из базы данных HSQLDB. Обычно это обычный текстовый файл, содержащий журнал изменений. Но какой-то парень решил использовать шифрование базы данных, как описано в [link] (http://www.coderanch.com/t/515884/JDBC/java/Encrypted-database-HSQL). Какая-то база данных повреждена, и клиент хочет восстановить данные. Поэтому я не знаю никаких параметров шифрования hsqldb, используемых для шифрования. Параметры, заданные для механизма БД, - «AES» и 128-битный ключ. Ничего другого. –

0

Полный пример шифрование/дешифрованиеогромный видео без метания JavaOutOfMemoryException и использование Java SecureRandom для вектора инициализации поколения. Также изображено хранение ключевых байтов в базе данных, а затем восстановление одного и того же ключа из этих байтов.

https://stackoverflow.com/a/18892960/185022