Расшифровать зашифрованный файл AES в Java - PullRequest
3 голосов
/ 25 января 2012

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

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

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

Ответы [ 4 ]

2 голосов
/ 26 января 2012

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

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

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

2 голосов
/ 28 января 2012

Просто, чтобы суммировать мои комментарии к ответу Люцифера.

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

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

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

0 голосов
/ 20 сентября 2013

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

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

0 голосов
/ 25 января 2012

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

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);
}
...