Посоветуйте по производительности шифрования файлов в Java - PullRequest
6 голосов
/ 29 января 2012

Я делаю некоторую работу, связанную с шифрованием файлов.Я могу зашифровать / расшифровать файлы, но столкнулся с серьезной проблемой производительности.Когда я просто читаю / записываю видеофайл размером 700 МБ, мой код работает со скоростью 27-28 МБ / с.Но когда я выполняю шифрование (в настоящее время я использую PBEWithMD5AndDES, который я буду менять позже), код показывает скорость 9 МБ / с.Посоветуйте, пожалуйста, где можно улучшить.

Фрагмент кода:

    int c = 0, BUF_SIZE = 8192;
    byte[] b = new byte[BUF_SIZE];
    FileInputStream fis;
    DataInputStream dis;
    FileOutputStream fos;
    DataOutputStream dos;
    CipherOutputStream cos;


    try {
        // Create PBE parameter set
        pbeParamSpec = new PBEParameterSpec(salt, iterationCount);

        // Create PBE Cipher
        Cipher pbeCipher = Cipher.getInstance(algorithm);

        // get key
        key = generateKeyFromPassword(password);

        // Initialize PBE Cipher with key and parameters
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec);

        fis = new FileInputStream(inFile);
        dis = new DataInputStream(fis);
        fos = new FileOutputStream(outFile);
        dos = new DataOutputStream(fos);
        cos = new CipherOutputStream(fos, pbeCipher);


        while ((c = dis.read(b)) > 0) {
            cos.write(b);
            //dos.write(b);
        }

        fis.close();
        dis.close();
        //dos.close();
        cos.close();


    } catch (Exception e) {
        e.printStackTrace();
    }

Статистика без шифрования:
Скорость около 27,97 МБ / с
Точное время = 25,02 с
ФайлРазмер = 700 МБ

Статистика с шифрованием:
Скорость около 9,69 МБ / с
Точное время = 72,171 с
Размер файла = 700 МБ

Ответы [ 4 ]

4 голосов
/ 29 января 2012

Во-первых: если это вообще возможно, не делайте этого сами. Шифрование очень (очень!) Легко испортить способами, которые приводят к небезопасным результатам. Если это вообще возможно, используйте внешний компонент или библиотеку для выполнения максимально возможной работы по шифрованию.

Во-вторых, если вы собираетесь сделать это самостоятельно, как сейчас, не используйте DES. DES больше не является достаточно сильным шифром. Triple-DES - это нормально, но вы действительно хотите использовать AES. Он считается безопасным, при его проектировании учитывались современные процессоры, у вас есть выбор длины ключа, чтобы сбалансировать безопасность с производительностью, а современные процессоры имеют аппаратное ускорение для AES (AES-NI). (Я не знаю, использует ли это Java, но если этого не произойдет, это, безусловно, может начаться в будущем, тогда как шансы на это у Triple-DES равны нулю.)

В-третьих, вы читаете и пишете байт одновременно. Хотя в любом случае шифрование будет интенсивно загружать процессор, выполнение этого в том виде, в каком вы сейчас находитесь, будет медленнее, чем необходимо. Чтение и запись с использованием byte[] из 4 КБ или около того должны значительно улучшить производительность.

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

Попробуйте обернуть поток ввода данных буферизованным потоком ввода для начинающих. Также проверьте эту ссылку для сравнения производительности различных алгоритмов в Java. AES действительно даст значительно более быстрый результат, чем DES.

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

Вы пробовали BouncyCastle в качестве альтернативы? Везде, где я видел Java-криптографию, она использовалась вместо встроенных API.

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

Шифрование просто сильно загружает процессор.Может быть, вы сможете найти более эффективную реализацию и сэкономить пару% времени выполнения, или использовать выделенный аппаратный движок и получить лучшую производительность за несколько долларов.

Первое, что я хотел бы убедиться, это то,Ваше приложение может справиться с тем, что это займет некоторое время.Это означает использование криптографии в фоновых операциях, подготовку контента перед его использованием и аналогичные конструктивные соображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...