Частичное шифрование файлов - PullRequest
1 голос
/ 27 марта 2012

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

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

Ниже - код, который шифрует и дешифрует файлы.Это работает за исключением видео, потому что я пытаюсь соединить две части файла вместе.Зашифрованный файл выглядит нормально.Расшифрованный файл выключен в одном месте.Я понял это, но запустив их через тест diff.

 public void encrypt(InputStream in, OutputStream out) {
    try {
        // Bytes written to out will be encrypted
       OutputStream out_c = new CipherOutputStream(out, ecipher);

        // Read in the cleartext bytes and write to out to encrypt
        int numRead = 0;
        int count = 0;
        boolean first = true;

        while ((numRead = in.read(buf)) >= 0) {

            if(count <= 1048576){
                count += numRead;
                out_c.write(buf, 0, numRead);
            }else{

                out.write(buf, 0, numRead);

            }
        }
        out.close();
        out_c.close();


    } catch (java.io.IOException e) {
    }
}

// Movies encrypt only 1 MB.

public void decrypt(InputStream in, OutputStream out) {
    try {
        // Bytes read from in will be decrypted
        InputStream in_c = new CipherInputStream(in, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;
        int count = 0;

        while ((numRead = in_c.read(buf)) >= 0 && count <= 1048576) {
            count += numRead;
            out.write(buf, 0, numRead);
        }

        //in.skip(count); This removed 1MB from the final file. No need to skip.

        while((numRead = in.read(buf)) >= 0){

            out.write(buf,0,numRead);

        }

        out.close();
    } catch (java.io.IOException e) {
    }
}

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

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

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

Конечно, вы также должны убедиться, что size(cleartext) == size(ciphertext).

1 голос
/ 27 марта 2012

Хорошо, когда вы достигнете этой точки:

if(count <= 1048576){
   count += numRead;
   out_c.write(buf, 0, numRead);
}

Допустим, что перед значением if будет 1 048 575 (только 1 байт отсутствует для достижения максимума).А у тебя буфер 1024 байта.Таким образом, когда вы вводите оператор if, ваш счет заканчивается 1 049 599.

Таким образом, ваш счет может быть больше 1 048 576.И вам нужно это фактическое число, прежде чем читать файл.

...