2014-01-12 52 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