/// <summary> /// Hide [messageStream] in [sourceStream], /// write the result to [destinationStream] /// </summary> /// <param name="messageStream">The message to hide</param> /// <param name="keyStream"> /// A key stream that specifies how many samples shall be /// left clean between two changed samples /// </param> public void Hide(Stream messageStream, Stream keyStream) { byte[] waveBuffer = new byte[bytesPerSample]; byte message, bit, waveByte; int messageBuffer; //receives the next byte of the message or -1 int keyByte; //distance of the next carrier sample while ((messageBuffer = messageStream.ReadByte()) >= 0) { //read one byte of the message stream message = (byte)messageBuffer; //for each bit in message for (int bitIndex = 0; bitIndex < 8; bitIndex++) { //read a byte from the key keyByte = GetKeyValue(keyStream); //skip a couple of samples for (int n = 0; n < keyByte - 1; n++) { //copy one sample from the clean stream to the carrier stream sourceStream.Copy(waveBuffer, 0, waveBuffer.Length, destinationStream); } //read one sample from the wave stream sourceStream.Read(waveBuffer, 0, waveBuffer.Length); waveByte = waveBuffer[bytesPerSample - 1]; //get the next bit from the current message byte... bit = (byte)(((message & (byte)(1 << bitIndex)) > 0) ? 1 : 0); //...place it in the last bit of the sample if ((bit == 1) && ((waveByte % 2) == 0)) { waveByte += 1; } else if ((bit == 0) && ((waveByte % 2) == 1)) { waveByte -= 1; } waveBuffer[bytesPerSample - 1] = waveByte; //write the result to destinationStream destinationStream.Write(waveBuffer, 0, bytesPerSample); } } //copy the rest of the wave without changes waveBuffer = new byte[sourceStream.Length - sourceStream.Position]; sourceStream.Read(waveBuffer, 0, waveBuffer.Length); destinationStream.Write(waveBuffer, 0, waveBuffer.Length); }
public void Hide(Stream messageStream, Stream keyStream) { byte[] waveBuffer = new byte[bytesPerSample]; byte message, bit, waveByte; int messageBuffer; int keyByte; while ((messageBuffer = messageStream.ReadByte()) >= 0) { message = (byte)messageBuffer; for (int bitIndex = 0; bitIndex < 8; bitIndex++) { keyByte = GetKeyValue(keyStream); for (int n = 0; n < keyByte - 1; n++) { sourceStream.Copy(waveBuffer, 0, waveBuffer.Length, destinationStream); } sourceStream.Read(waveBuffer, 0, waveBuffer.Length); waveByte = waveBuffer[bytesPerSample - 1]; bit = (byte)(((message & (byte)(1 << bitIndex)) > 0) ? 1 : 0); if ((bit == 1) && ((waveByte % 2) == 0)) { waveByte += 1; } else if ((bit == 0) && ((waveByte % 2) == 1)) { waveByte -= 1; } waveBuffer[bytesPerSample - 1] = waveByte; destinationStream.Write(waveBuffer, 0, bytesPerSample); } } waveBuffer = new byte[sourceStream.Length - sourceStream.Position]; sourceStream.Read(waveBuffer, 0, waveBuffer.Length); destinationStream.Write(waveBuffer, 0, waveBuffer.Length); }
public void Hide(Stream messageStream, Stream keyStream) { byte[] waveBuffer = new byte[bytesPerSample]; byte message, bit, waveByte; int messageBuffer, keyByte; while ((messageBuffer = messageStream.ReadByte()) >= 0) { //read one byte of the message message = (byte)messageBuffer; //for each bit in message for (int bitIndex = 0; bitIndex < 8; bitIndex++) { //read a byte from the key keyByte = GetKeyValue(keyStream); //skip samples for (int n = 0; n < keyByte - 1; n++) { sourceStream.Copy(waveBuffer, 0, waveBuffer.Length, destinationStream); } //read one sample from the wave stream sourceStream.Read(waveBuffer, 0, waveBuffer.Length); waveByte = waveBuffer[bytesPerSample - 1]; bit = (byte)(((message & (byte)(1 << bitIndex)) > 0) ? 1 : 0); //change the last bit of the sample if ((bit == 1) && ((waveByte % 2) == 0)) { waveByte += 1; } else if ((bit == 0) && ((waveByte % 2) == 1)) { waveByte -= 1; } waveBuffer[bytesPerSample - 1] = waveByte; //write the result to destinationStream destinationStream.Write(waveBuffer, 0, bytesPerSample); } } waveBuffer = new byte[sourceStream.Length - sourceStream.Position]; sourceStream.Read(waveBuffer, 0, waveBuffer.Length); destinationStream.Write(waveBuffer, 0, waveBuffer.Length); }