0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
1

Байты, BufferedImage, AES, GUI

03.06.2015, 09:01. Показов 942. Ответов 4
Метки нет (Все метки)

В проекте используются зашифрованные в AES изображения, стоит задача загрузить байты из потока "is", раскодировать их, байты запихать в BAOS, и затем в ImageIO.read.
Что я делаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static BufferedImage DecryptImage(InputStream is) {
        try {
            SecretKeySpec skey = new SecretKeySpec(Settings.stylesSalt.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.DECRYPT_MODE, skey);
 
            byte[] buffer = new byte[1024];
            int bytesRead;
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            while ((bytesRead = is.read(buffer)) != -1) {
                output.write(buffer, 0, bytesRead);
            }
            
            byte[] outputBytes = cipher.doFinal(output.toByteArray());
            
            ByteArrayInputStream baos = new ByteArrayInputStream(outputBytes);
            BufferedImage result = ImageIO.read(baos);
 
            return result;
        } catch (NoSuchPaddingException | NoSuchAlgorithmException
                | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException | IOException ex) {
            ex.printStackTrace();
        }
 
        return null;
    }
Однако ByteArrayInputStream ограничен, или ещё какая проблема, у меня выскакивает ошибка:
Input length must be multiple of 16 when decrypting with padded cipher.
На строке
byte[] outputBytes = cipher.doFinal(output.toByteArray());
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.06.2015, 09:01
Ответы с готовыми решениями:

AES 192 и AES 256
Добрый день! Возможно ли в Java сделать шифрование с помощью AES 256- или 192-битными ключами?...

BufferedImage to video
Доброго времени суток. Может кто подсказать оптимальный способ создания видео файла (формат не...

BufferedImage не сохраняется в файл
Доброго времени суток! есть такой код: private static Painter p; private BufferedImage img;...

Огромный BufferedImage и OutOfMemoryError
Есть код, который вызывает ошибку Exception in thread "main" java.lang.OutOfMemoryError: Java heap...

4
2882 / 2294 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
03.06.2015, 09:09 2
а как-же подумать головой?
наверное эту ошибку кидает метод doFinal(), значит надо смотреть там...хотя что там смотреть - он же говорит ясно, что количество чего-то там должно быть кратно 16
0
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 33
03.06.2015, 09:18  [ТС] 3
Вау, какое умное замечание! А то ж я сам не догадался! Проблема в том, что я шифровал другой своей программой, там где оперировать нужно файловыми потоками. Здесь же мне необходимо дешифровать не в файл, а в картинку. ByteArrayOutputStream не получает все байты, я уже сверял. Если ответов по существу нет, советую выйти из темы.

В другой программе за шифровку и дешифровку отвечает этот класс:


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class EncodeDecode {
    private static final String ALGORITHM = "AES";
    private static final String TRANSFORMATION = "AES";
 
    public static void encrypt(String key, File inputFile, File outputFile)
            throws Exception {
        doCrypto(Cipher.ENCRYPT_MODE, key, inputFile, outputFile);
    }
 
    public static void decrypt(String key, File inputFile, File outputFile)
            throws Exception {
        doCrypto(Cipher.DECRYPT_MODE, key, inputFile, outputFile);
    }
 
    private static void doCrypto(int cipherMode, String key, File inputFile,
            File outputFile) throws Exception {
        try {
            Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(cipherMode, secretKey);
 
            FileInputStream inputStream = new FileInputStream(inputFile);
            byte[] inputBytes = new byte[(int) inputFile.length()];
            inputStream.read(inputBytes);
 
            byte[] outputBytes = cipher.doFinal(inputBytes);
 
            FileOutputStream outputStream = new FileOutputStream(outputFile);
            outputStream.write(outputBytes);
 
            inputStream.close();
            outputStream.close();
 
        } catch (NoSuchPaddingException | NoSuchAlgorithmException
                | InvalidKeyException | BadPaddingException
                | IllegalBlockSizeException | IOException ex) {
            throw new Exception("Error encrypting/decrypting file", ex);
        }
    }
}
0
KEKCoGEN
03.06.2015, 09:46
  #4
 Комментарий модератора 
Прекращаем оффтоп
0
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 1
12.06.2015, 20:54 5
Товарищ, такая же проблема, входные данные для расшифровки не кратны 16, как я понял, байтам (Алгоритм работает с блоками по 128 бит(16 байт)). Не нашел, в чем мб проблема?
Вопрос такой еще: зашифрованные картинки больше по размеру выходят?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2015, 20:54
Помогаю со студенческими работами здесь

Image -> BufferedImage изменяется изображение
Есть процедура которая возвращает Image объект, в данном случае это картинка с графом, само...

Доступ к объектам Вектора как к BufferedImage, а не Object
Подскажите, пожалуйста: если у меня хранятся картинки в Vectore, как бы мне обращатся к его...

BufferedImage
Есть программа, которая рисует по JPanel, имитация карандаша, также собираюсь добавить линию,...

BufferedImage
Добрый день! Уверен что об этом уже писалось, но, не судите строго, у меня проблема немного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru