示例#1
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);
        }