2013-04-06 39 views
5

tôi đang làm việc trên dự án năm cuối cùng của tôi trong JAVAâm thanh stegnography

1) giấu văn bản trong một hình ảnh

2) hình ảnh trong một hình ảnh

3) văn bản trong một tập tin âm thanh (WAVE)

tôi đã hoàn tất thành công 1) và 2) và đã đính kèm mã nguồn nếu có ai đó có thể cần. tôi đang gặp sự cố trong phiên bản thứ 3 tức là ẩn dữ liệu trong tệp âm thanh. Tôi tạo một audioinputstream ra khỏi một tệp sóng và đọc dữ liệu của nó thành một mảng byte nhưng nhiều thứ không rõ ràng, trong khi đọc tôi đoán là 44 byte đầu tiên là byte tiêu đề? (Vì tệp có định dạng WAVE) hoặc tiêu đề không được sao chép. Vấn đề là .... tại thời điểm giải mã một lần nữa tôi phải đọc dữ liệu từ tệp âm thanh mới được tạo trong một mảng byte. Và tôi không thể định vị các byte nơi tôi có dữ liệu ẩn.

Ai có thể cho tôi biết chính xác điều gì xảy ra khi chúng ta đọc dữ liệu vào một mảng byte từ một audioinputstream, tôi có nghĩa là những gì thực sự được đọc vào mảng 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 

nếu tôi giải mã các mảng byte chỉ sau khi chỉnh sửa, sau đó nó hoạt động tốt và hiển thị thông báo ẩn, nhưng sau khi một lần nữa tạo ra một mảng byte và đọc vào nó audioinputsream dữ liệu và sau đó giải mã rằng mảng byte .. nó không hoạt động. tôi tự hỏi tại sao? làm ơn giúp tôi.

+2

Từ này là 'steganography. – EJP

Trả lời

1

44 byte đầu tiên là thực sự là tiêu đề của WAV (xem https://ccrma.stanford.edu/courses/422/projects/WaveFormat/)

Nếu bạn mở tập tin trong một trình soạn thảo HEX, bạn sẽ thấy những gì nó trông giống như (http://imgur.com/iliA40R)

Nếu bạn so sánh dữ liệu trong tệp và dữ liệu được đọc bởi InputStream của bạn, nó khớp với.

Bạn nên đóng và mở lại luồng của mình nếu bạn cần đọc lại tệp. Nếu bạn có thể đánh dấu tệp, bạn có thể đánh dấu tệp đó trước khi đọc và gọi lại đặt lại() sau lần đọc đầu tiên được thực hiện.

+0

cảm ơn rất nhiều! Tôi vừa hoàn thành dự án của mình. Tôi đã sử dụng DataInputStream để trích xuất dữ liệu thực tế (không bao gồm tiêu đề) và sau đó sử dụng nó để tạo một AudioInputStream. –