2012-03-26 3 views
1

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

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

Bellow - это код, который шифрует и дешифрует файлы. Он работает, за исключением видео, потому что я пытаюсь исправить две части файла вместе. Зашифрованный файл кажется прекрасным. Дешифрованный файл отключен в одном месте. Я решил это, но проверил их через тест 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) { 
    } 
} 

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

спасибо.

+0

Я не уверен, что понял вашу проблему. Код, который вы предоставили, работает с некоторыми файлами, но не с видеофайлами? С каким видом видео (mpeg?) Это не сработало? он работал, если вы использовали программу со всем файлом, а не 1 мега? – woliveirajr

+0

Вы задаете неправильный вопрос. Вопрос должен быть: Как остановить андроиды пользователей от копирования моих видео? Это то, что для [DRM api] (http://developer.android.com/reference/android/drm/package-summary.html). – mikerobi

ответ

2

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

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

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

1

Ну, когда вы достигнете этой точки:

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

Пусть говорят, что перед тем, если счетчик равен 1048575 (только 1 байт отсутствует, чтобы достичь максимума). И буфер составляет 1024 байта. Итак, когда вы входите в оператор if, ваш счет заканчивается 1 049 599.

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

+0

Я знаю, что вы, ребята, правильны в некоторых аспектах, но дальнейшее исследование показывает, что первый MB расшифровывается отлично. Кроме того, следующие пары 1024 байта тоже прекрасны. В какой-то момент его отсутствует около 1024 байтов данных. Глядя на цикл, когда я выписываю ни один расшифрованный поток в методе дешифрования, цикл выполняется n раз, прежде чем записывать какие-либо данные. Я должен выяснить, куда пропустить. хммм. – user1086377