2014-01-12 2 views
0

мой подход шифрует mp3-файлы, которые даже после шифрования зашифрованный файл может быть воспроизведен с любым mp3-плеером (его нормально, если то, что вы слышите, это мусор! Только играйте). поэтому я собираюсь разбить мои Mp3-файлы на байт-массивы, а затем изменить кадры (в соответствии с файловой структурой Mp3) с помощью моего метода шифрования, который я использую.Изменение Mp3-файлов Bytes

здесь код я использую для получения байт:

public class Audio { 

public static void main(String[] args) throws FileNotFoundException, IOException { 
    File file = new File("test.wmv"); 

    FileInputStream fis = new FileInputStream(file); 
    //System.out.println(file.exists() + "!!"); 
    //InputStream in = resource.openStream(); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    byte[] buf = new byte[1024]; 
    try { 
     for (int readNum; (readNum = fis.read(buf)) != -1;) { 
      bos.write(buf, 0, readNum); //no doubt here is 0 
      //Writes len bytes from the specified byte array starting at offset off to this byte array output stream. 
      System.out.println("read " + readNum + " bytes,"); 

     } 
    } catch (IOException ex) { 
     // Logger.getLogger(genJpeg.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    byte[] bytes = bos.toByteArray(); 
    byte temp ; 


    for(int i = 0 ; i < bytes.length ; i++) 
    { 
     System.out.println(bytes[i]); 
    } 


    //below is the different part 
    File someFile = new File("test2.wmv"); 
    FileOutputStream fos = new FileOutputStream(someFile); 
    fos.write(bytes); 
    fos.flush(); 
    fos.close(); 
} 

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

Я сделал «google it»! и я очень смущен, Если кто-нибудь может показать мне, как я буду благодарен.

ответ

0

Прочитайте полные байты, извлеките биты, например. для последних 3 бит используют b & ((1 << 3) - 1), для первых 3 бит используют b & (((1 << 3) - 1) << (Byte.SIZE - 3)). Конечно, не работает для полных байтов, если вы сначала не конвертируете их в целое число и не конвертируете их обратно в байты перед использованием.

С Java 7 вы также можете просто wrap a byte array in a BitSet для легкого доступа к отдельным битам.

Для шифрования битов используйте режим шифрования потока, например AES-CTR, вместо режима блочного шифрования. Последний шаг потокового шифрования - это просто XOR, который идеально подходит для шифрования битов. Он также не требует каких-либо дополнений, хотя для этого требуется уникальный IV (для каждого ключа шифрования данных). Хэш над именем файла может обеспечить, что, учитывая, что имя никогда не меняется, конечно.

+0

спасибо! поэтому в соответствии с: [link] (http://en.wikipedia.org/wiki/MP3) каждый заголовок представляет собой 32 бита, который составляет 4 байта. поэтому я должен оставить заголовок и изменить байты данных с тем, что вы сказали правильно? – Aerox

+0

Да, не нужно усложнять чтение из заголовка. Не преждевременно оптимизируйте. Дополнительная подсказка: для шифрования битов используйте режим шифрования потока, такой как AES-CTR, вместо режима блочного шифрования. Последний шаг потокового шифрования - это просто XOR, который идеально подходит для шифрования битов. Он также не требует каких-либо дополнений, хотя для этого требуется уникальный IV (для каждого ключа шифрования данных). –

+0

спасибо, что вам помогли! – Aerox