2013-04-06 12 views
5

sto lavorando sul mio progetto ultimo anno in JAVAAudio stegnography

1) nascondere il testo in un'immagine

immagine

2) in un'immagine

3) il testo in un file audio (WAVE)

ho completato con successo 1) e 2) e ho allegato il codice sorgente se qualcuno può averne bisogno. Sto riscontrando problemi nel terzo, nascondendo i dati in un file audio. Creo un audioinputstream da un file wave e leggo i suoi dati in un array di byte ma molte cose non sono chiare, mentre sto leggendo suppongo che i primi 44 byte siano i byte di intestazione? (Poiché il file è in formato WAVE) o l'intestazione non viene affatto copiata. Il problema è .... al momento della decodifica devo leggere i dati dal file audio appena creato in un array di byte. E non sono in grado di individuare i byte in cui ho dati nascosti.

Qualcuno può dirmi cosa succede esattamente quando leggiamo i dati in un array di byte da un audioinputstream, cioè cosa viene effettivamente letto nell'array di byte?

File fileIn = new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay.wav"); 

AudioInputStream audioInputStream = 

AudioSystem.getAudioInputStream(fileIn); 

int avail= audioInputStream.available(); 

System.out.println("bytes available " +avail); 

System.out.println(audioInputStream.markSupported()); 

int bytesPerFrame = 

     audioInputStream.getFormat().getFrameSize(); 

     // Set an arbitrary buffer size of 1024 frames. 

int numBytes = 1024 * bytesPerFrame; 

byte[] audioBytes = new byte[numBytes]; 

audioInputStream.read(audioBytes); 

byte btext[]=Stego_text("good morning!"); 

byte bcoded[]=steg.encoding(audioBytes,btext,0); 



byte[] stg= a.decode_text(audioBytes); 

String obtain= new String(stg); 

     System.out.println(">>>"+ obtain); //the hidden message gets successfully displayed here 





try { 

    // 

      AudioSystem.write(audioInputStream, Type.WAVE, new File("C:\\Users\\Rahul\\Desktop\\pro\\Don't Stay_restored.wav")); 

     } catch (Exception e) { 



      e.printStackTrace(); 

     } 

     byte[] audioBytesNew = new byte[numBytes]; 

     audioInputStream.read(audioBytesNew); 

     byte[] stg1= a.decode_text(audioBytesNew); 

     String obtain1= new String(stg1); 

     System.out.println(">>>"+ obtain1); //the hidden message does not get displayed 

se decodifico l'array di byte solo dopo la modifica, poi funziona benissimo e visualizza il messaggio nascosto, ma dopo aver creato ancora una volta un array di byte e la lettura in esso audioinputsream dati e poi la decodifica che array di byte .. è non funziona. mi chiedo perché? mi aiuti per favore.

+2

La parola è "steganografia". – EJP

risposta

1

I primi 44 byte sono infatti l'intestazione del WAV (vedi https://ccrma.stanford.edu/courses/422/projects/WaveFormat/)

Se si apre il file in un editor HEX, vedrete che cosa assomiglia (http://imgur.com/iliA40R)

Se confronta i dati nel file e i dati letti dal tuo InputStream, corrisponde.

È necessario chiudere e riaprire il flusso se è necessario leggere di nuovo il file. Se è possibile contrassegnare il file, è possibile contrassegnarlo prima della lettura e chiamare reset() al termine della prima lettura.

+0

grazie mille! Ho appena completato il mio progetto. Ho usato DataInputStream per estrarre i dati effettivi (esclusa l'intestazione) e quindi l'ho usato per creare AudioInputStream. –