public byte[] Extract(DigitalAudio stegoAudio)
        {
            int[] primeSignal;
            using (WavReader reader = new WavReader(File.OpenRead(PrimeSignalFilePath)))
                primeSignal = reader.ReadAudio().GetSignal();
            var stegoSignal       = stegoAudio.GetSignal();
            int samplesPerSegment = (int)Math.Floor((double)stegoSignal.Length / (MessageLength * 8));

            var rnd = new Random(RandomSeed); int lseg, rseg;

            int[]       pseudoRandomSignal = new int[samplesPerSegment];
            var         difference = new double[samplesPerSegment];
            List <bool> message = new List <bool>();
            double      primeMean = 0, difMean = 0;

            for (int i = 0; (i + 1) * samplesPerSegment <= stegoSignal.Length; i++)
            {
                lseg = i * samplesPerSegment;
                rseg = samplesPerSegment * (i + 1);
                RndSignal(rnd, pseudoRandomSignal);
                for (int j = lseg, k = 0; j < rseg; j++, k++)
                {
                    primeSignal[j] = (int)(primeSignal[j] * 0.95);

                    difference[k] = (stegoSignal[j] - primeSignal[j]) * pseudoRandomSignal[k];
                    primeMean    += primeSignal[j];
                    difMean      += stegoSignal[j];
                }
                message.Add(Math.Sign(primeMean) == Math.Sign(difMean));
                primeMean = 0; difMean = 0;
            }
            return(BitArrayToByteArray(new BitArray(message.ToArray())));
        }
Exemple #2
0
        public DigitalAudio Embed(DigitalAudio audio, byte[] message)
        {
            var signal = audio.GetSignal();

            if (GetAvailableSpace(audio) < message.Length)
            {
                throw new ApplicationException("Attempt to insert a message that is longer than the container covers.");
            }

            //data
            var embeddedMessage = CreateEmbeddedMessage(message);
            int samplei         = 0;
            int mask            = ~((1 << bitsPerSampleCoding) - 1);
            int length          = embeddedMessage.Length;

            for (int i = 0; i < length;)
            {
                signal[samplei] &= mask;
                for (int j = 0; j < bitsPerSampleCoding; j++)
                {
                    signal[samplei] |= ((embeddedMessage[i++] ? 1 : 0) << j);
                }
                samplei++;
            }
            return(audio);
        }
        public DigitalAudio Embed(DigitalAudio cover, byte[] message)
        {
            var      coverSignal      = cover.GetSignal();
            BitArray embeddingMessage = CreateEmbeddedMessage(message);
            int      FrameSize        = (coverSignal.Length / embeddingMessage.Length);
            int      parityBit        = 0;
            int      iframe           = 0;

            for (int b = 0; b < embeddingMessage.Length; b++)
            {
                for (int i = 0; i < FrameSize; i++)
                {
                    if ((coverSignal[iframe + i] & 1) == 1)
                    {
                        parityBit++;
                    }
                }
                parityBit %= 2;

                if ((embeddingMessage[b] ? 1:0) != parityBit)
                {
                    coverSignal[iframe] ^= 1;
                }
                iframe   += FrameSize;
                parityBit = 0;
            }
            return(cover);
        }
Exemple #4
0
        public long GetAvailableSpace(DigitalAudio cover)
        {
            var additionalInfo = (StegoMark.Length
                                  + msgSizeLength); //for message size

            return(cover.SamplesInChannel / (8 / bitsPerSampleCoding) - additionalInfo);
        }
Exemple #5
0
 public void GoHome()
 {
     ViewBack    = false;
     state       = State.AudioSelecting;
     CurrentPage = startPage;
     ((ISupportParameter)CurrentPage.DataContext).Parameter = (Action <InterViewModelPackage>)Navigate;
     Audio        = null;
     hidingMethod = null;
     ViewHome     = false;
 }
        private void WriteNoise(int[] noiseSignal, int ml)
        {
            DigitalAudio digitalAudio = new DigitalAudio();

            digitalAudio.AddChannel(noiseSignal);
            digitalAudio.SampleRate = 44100;
            digitalAudio.SignificantBitsPerSample = 16;
            var stream = File.Create("nr_" + NoiseRate + "ml_" + ml + ".wav");

            using (WavWriter writer = new WavWriter(stream))
                writer.WriteWavDefault(digitalAudio);
        }
Exemple #7
0
        public byte[] Extract(DigitalAudio audio)
        {
            var signal = audio.GetSignal();

            byte[] stegoMark = ReadBits(signal, 0, StegoMark.LongLength);
            if (!stegoMark.SequenceEqual(StegoMark))
            {
                return(null);
            }
            byte[] messageSize = ReadBits(signal, (StegoMark.Length * bitsInByte) / bitsPerSampleCoding, msgSizeLength);
            if (!BitConverter.IsLittleEndian)
            {
                messageSize.Reverse();
            }
            long length = BitConverter.ToInt64(messageSize, 0);

            byte[] message = ReadBits(signal, ((StegoMark.Length + msgSizeLength) * bitsInByte) / bitsPerSampleCoding, length);
            return(message);
        }
        public byte[] Extract(DigitalAudio stegoAudio)
        {
            int[] signal    = stegoAudio.GetSignal();
            int   FrameSize = signal.Length / ((MessageLength + StegoMark.Length + msgSizeLength) * 8);

            byte[] stegoMark = ExtractBytes(signal, 0, StegoMark.Length, FrameSize);
            if (!stegoMark.SequenceEqual(StegoMark))
            {
                return(null);
            }
            byte[] messageSize = ExtractBytes(signal, StegoMark.Length * 8 * FrameSize, msgSizeLength, FrameSize);
            if (!BitConverter.IsLittleEndian)
            {
                messageSize.Reverse();
            }
            long length = BitConverter.ToInt64(messageSize, 0);

            byte[] message = ExtractBytes(signal, (msgSizeLength + StegoMark.Length) * 8 * FrameSize, (int)length, FrameSize);
            return(message);
        }
Exemple #9
0
        public byte[] Extract(DigitalAudio stegoAudio)
        {
            var stegoSignal = stegoAudio.GetSignal();

            Complex32[] segment = new Complex32[segmentLength];
            for (int i = 0; i < segmentLength; i++)
            {
                segment[i] = new Complex32(stegoSignal[i], 0);
            }
            Fourier.Forward(segment, FourierOptions.Matlab);
            //Check if has label
            var headerLen = bitsInByte * StegoMark.Length;

            List <bool> tmp = new List <bool>(headerLen);
            //Read Header
            var  startIndex = segmentLength / 2 - 1;
            long endIndex   = startIndex - headerLen;

            byte[] bytesData = ExtractRange(segment, tmp, startIndex, endIndex);
            if (!bytesData.SequenceEqual(StegoMark))
            {
                return(null);
            }
            // Read msg size
            var msgSizeLen = msgSizeLength * bitsInByte;

            startIndex = (int)endIndex;
            endIndex   = startIndex - msgSizeLen;
            bytesData  = ExtractRange(segment, tmp, startIndex, endIndex);
            if (!BitConverter.IsLittleEndian)
            {
                bytesData.Reverse();
            }
            long msgLength = BitConverter.ToInt64(bytesData, 0) * bitsInByte;

            //Read Data
            startIndex = (int)endIndex;
            endIndex   = startIndex - msgLength;
            return(ExtractRange(segment, tmp, startIndex, endIndex));
        }
        public CodingViewModel(NavigationCodes code, IHidingMethod hidingMethod, DigitalAudio audio)
        {
            Message           = "";
            cover             = audio;
            method            = hidingMethod;
            conteinerCapacity = hidingMethod.GetAvailableSpace(audio);
            action            = code;
            switch (code)
            {
            case NavigationCodes.Extract:
                CodingAction = "Extract";
                break;

            case NavigationCodes.Embed:
                CodingAction = "Embed";
                break;

            default:
                CodingAction = "Undefined";
                break;
            }
        }
Exemple #11
0
        public void Navigate(InterViewModelPackage package)
        {
            if (package.Code == NavigationCodes.Start)
            {
                GoHome();
            }
            else
            {
                ViewHome = true;
                switch (state)
                {
                case State.AudioSelecting:
                    state          = State.AlgorithmSelecting;
                    Audio          = package.Data as DigitalAudio;
                    navigationLine = package.Code;
                    CurrentPage    = GetAlgorithmPage();
                    break;

                case State.AlgorithmSelecting:
                    state        = State.MessageCoding;
                    ViewBack     = true;
                    hidingMethod = package.Data as IHidingMethod;
                    CurrentPage  = new Pages.CodingPage
                    {
                        DataContext = new CodingViewModel(navigationLine, hidingMethod, Audio)
                    };
                    ((ISupportParameter)CurrentPage.DataContext).Parameter = (Action <InterViewModelPackage>)Navigate;
                    break;

                case State.MessageCoding:
                    break;

                default:
                    break;
                }
            }
        }
        public DigitalAudio Embed(DigitalAudio cover, byte[] message)
        {
            var primeSignal = (int[])cover.GetSignal().Clone();
            //var embedingData = CreateEmbeddedMessage(message);
            var embedingData = new BitArray(message);
            int n_bits       = embedingData.Length;
            var signal       = cover.GetSignal();

            //Segmentation
            int samplesPerSegment = (int)Math.Floor(signal.Length / (double)n_bits);
            var rnd = new Random(RandomSeed);
            int lseg, rseg;

            int[] pseudoRandomSignal = new int[samplesPerSegment];
            int   max = 0, min = 0;

            for (int i = 0; i < n_bits; i++)
            {
                lseg = i * samplesPerSegment;
                rseg = samplesPerSegment * (i + 1);
                RndSignal(rnd, pseudoRandomSignal);
                int bit = (embedingData[i] ? 1 : -1);
                //int bit = 1;
                for (int j = lseg, k = 0; j < rseg; j++, k++)
                {
                    var mix = pseudoRandomSignal[k] * signal[j] * bit;
                    signal[j] += (int)(NoiseRate * mix);
                    if (signal[j] > max)
                    {
                        max = signal[j];
                    }
                    if (signal[j] < min)
                    {
                        min = signal[j];
                    }
                }
            }
            //if (max > short.MaxValue || min < short.MinValue)
            //{
            //    float scaleFactor = ((short.MaxValue - short.MinValue) / (float)(max - min));
            //    for (int i = 0; i < signal.Length; i++)
            //        signal[i] = (int)(scaleFactor * (signal[i] - min) + short.MinValue);
            //}
            // Extract --------------------------
            rnd = new Random(RandomSeed);
            var         difference = new double[samplesPerSegment];
            List <bool> outBits = new List <bool>();
            double      primeMean = 0, difMean = 0;

            lseg = 0; rseg = 0;
            int segCount = n_bits;

            for (int i = 0; i < segCount; i++)
            {
                lseg = i * samplesPerSegment;
                rseg = samplesPerSegment * (i + 1);
                RndSignal(rnd, pseudoRandomSignal);
                for (int j = lseg, k = 0; j < rseg; j++, k++)
                {
                    difference[k] = (signal[j] - primeSignal[j]) * pseudoRandomSignal[k];
                    primeMean    += primeSignal[j];
                    difMean      += signal[j];
                }
                outBits.Add(Math.Sign(primeMean) == Math.Sign(difMean));
                primeMean = 0; difMean = 0;
            }
            return(cover);
        }
 public long GetAvailableSpace(DigitalAudio stegoAudio)
 {
     return(stegoAudio.SamplesInChannel / 8);
 }
 public long GetAvailableSpace(DigitalAudio stegoAudio)
 {
     return(stegoAudio.SamplesInChannel / 8 - (StegoMark.Length + msgSizeLength));
 }
Exemple #15
0
        public DigitalAudio Embed(DigitalAudio cover, byte[] message)
        {
            BitArray embeddingMessage = CreateEmbeddedMessage(message);
            var      msgLength        = embeddingMessage.Length;
            // Create embeddingMessage
            var value = (float)(Math.PI / 2.0);

            float[] embeddingData = new float[msgLength];
            for (int i = 0; i < msgLength; i++)
            {
                if (embeddingMessage[i])
                {
                    embeddingData[i] = -value;
                }
                else
                {
                    embeddingData[i] = value;
                }
            }

            // Signal
            var coverSignal   = cover.GetSignal();
            var ComplexSignal = coverSignal.Select(x => new Complex32(x, 0)).ToArray();

            double ratio = cover.SamplesInChannel / segmentLength;
            int    N     = (int)Math.Floor(ratio); //Segmnets count
            //---------------------------------------------
            List <Complex32[]> signalSegments = new List <Complex32[]>(N);
            List <float[]>     phases         = new List <float[]>(N);
            List <float[]>     magnitude      = new List <float[]>(N);
            List <float[]>     deltaPhases    = new List <float[]>(N);

            for (int seg = 0; seg < N; seg++)
            {
                //----------Create-----
                signalSegments.Add(new Complex32[segmentLength]);
                phases.Add(new float[segmentLength]);
                magnitude.Add(new float[segmentLength]);
                deltaPhases.Add(new float[segmentLength]);
                //---------------------
                //---Segments init---
                Array.Copy(ComplexSignal, seg * segmentLength, signalSegments[seg], 0, segmentLength); // Signal copy
                //---------------------
                //-------FFT----------
                Fourier.Forward(signalSegments[seg], FourierOptions.Matlab); // Signal transform for each segment
                //--------------------
                for (int j = 0; j < segmentLength; j++)
                {
                    phases[seg][j]    = signalSegments[seg][j].Phase;     //Phases for each segment
                    magnitude[seg][j] = signalSegments[seg][j].Magnitude; //Magnitude for each segment
                }
            }

            var spectrumMiddle = segmentLength / 2;

            // Delta phases
            for (int seg = 1; seg < N; seg++)
            {
                for (int j = 0; j < segmentLength; j++)
                {
                    deltaPhases[seg][j] = phases[seg][j] - phases[seg - 1][j];
                }
            }

            int startIndex         = spectrumMiddle - 1;
            int startSymmetryIndex = spectrumMiddle + 1;

            for (int i = 0; i < msgLength; i++)
            {
                phases[0][startIndex - i]         = embeddingData[i];
                phases[0][startSymmetryIndex + i] = -embeddingData[i]; // symmetry
            }
            // New phases
            for (int seg = 1; seg < N; seg++)
            {
                for (int j = 0; j < segmentLength; j++)
                {
                    phases[seg][j] = phases[seg - 1][j] + deltaPhases[seg][j];
                }
            }

            //Restore signal
            for (int seg = 0; seg < N; seg++)
            {
                for (int j = 0; j < segmentLength; j++)
                {
                    var A     = magnitude[seg][j];
                    var phase = phases[seg][j];
                    signalSegments[seg][j] = Complex32.FromPolarCoordinates(A, phase);
                }
                Fourier.Inverse(signalSegments[seg], FourierOptions.Matlab);
            }

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < segmentLength; j++)
                {
                    coverSignal[segmentLength * i + j] = (int)signalSegments[i][j].Real;
                }
            }

            return(cover);
        }
Exemple #16
0
 public long GetAvailableSpace(DigitalAudio stegoAudio)
 {
     return(((segmentLength / 2) - 1 - (StegoMark.Length + msgSizeLength) * bitsInByte) / bitsInByte);
 }