2014-01-12 90 views
0

我的方法是加密MP3文件,即使加密後,加密的文件可以與任何MP3播放器(如果你聽到的只是播放垃圾,那就OK了)。所以我打算將我的Mp3文件分割爲字節數組,然後使用我使用的加密方法更改幀(根據Mp3文件結構)。更改MP3文件字節

這裏是我用來獲取字節代碼:

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

謝謝!所以根據:[鏈接](http://en.wikipedia.org/wiki/MP3)每個頭是32位,這是4個字節。所以我應該離開標題,並改變你說的正確的數據字節? – Aerox

+0

是的,不需要複雜的標題讀出。不要過早地優化。附加提示:要加密比特,請使用AES-CTR等流密碼模式,而不是分組密碼模式。流密碼的最後一步是一個非常適合加密比特的XOR。它不需要任何填充,但它確實需要獨特的IV(每個數據加密密鑰)。 –

+0

謝謝你的幫助! – Aerox