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); }