示例#1
0
        // original: may be is null if mode is xor
        public T_Data Decrypt(Bitmap original)
        {
            ImageOrigimal = original;

            WriteReadData.SetSettingsMode();

            if (GetConfPixel(WriteReadDataIdPosition) != WriteReadData.GetID())
            {
                return(DataReader.ToObject(System.Text.Encoding.UTF8.GetBytes("There is no hidden data in image!")));
                //throw new ArgumentException("Parameter is not correct", "WriteReadData");
            }
            var CompressionId = GetConfPixel(DataCompressionIdPosition);
            var EncryptId1    = GetConfPixel(Encrypt1IdPosition);
            var EncryptId2    = GetConfPixel(Encrypt2IdPosition);


            byte[] countDataList = new byte[4];
            for (int i = 0; i < 4; ++i)
            {
                var r          = i * 2;
                var bigPath    = GetConfPixel(r);
                var littlePath = GetConfPixel(r + 1);

                bigPath = (byte)(bigPath << 4);
                countDataList[3 - i] = (byte)(bigPath | littlePath); // index from end becouse big endian format
            }
            var dataLengthBits  = BitConverter.ToInt32(countDataList, 0);
            var dataLengthBytes = dataLengthBits / 8;

            countDataList = new byte[dataLengthBytes * 2];

            WriteReadData.SetDataMode();
            int x = 0, y = 1;

            for (int i = 0; i < countDataList.Length;)
            {
                if (x >= ImageModifying.Width)
                {
                    y++; x = 0;
                }
                var pixelEnc = ImageModifying.GetPixel(x, y);
                var pixelOrg = original == null ? new Color() : original.GetPixel(x, y);
                var d        = WriteReadData.ReadData(pixelEnc, pixelOrg);


                if (i < countDataList.Length)
                {
                    countDataList[i++] = d[0];
                }
                if (i < countDataList.Length)
                {
                    countDataList[i++] = d[1];
                }
                if (i < countDataList.Length)
                {
                    countDataList[i++] = d[2];
                }
                ++x;
            }

            var data = _byteOperations.JoinBytes(countDataList);

            if (EncryptId2 > 0)
            {
                var enc = this.Encrypts.Where(r => r.GetID() == EncryptId2).FirstOrDefault();
                if (enc != null)
                {
                    data = enc.Decrypt(data);
                }
            }
            if (EncryptId1 > 0)
            {
                var enc = this.Encrypts.Where(r => r.GetID() == EncryptId1).FirstOrDefault();
                if (enc != null)
                {
                    data = enc.Decrypt(data);
                }
            }
            if (CompressionId > 0)
            {
                var compr = this.Compressions.Where(r => r.GetID() == CompressionId).FirstOrDefault();
                if (compr != null)
                {
                    data = compr.Recovery(data);
                }
            }

            return(DataReader.ToObject(data));
        }
示例#2
0
 private byte GetConfPixel(int x)
 {
     return(WriteReadData.ReadData(
                ImageModifying.GetPixel(x, 0), ImageOrigimal == null ? new Color() : ImageOrigimal.GetPixel(x, 0))[0]);
 }