/// <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);
        }
Exemple #3
0
        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);
        }