Esempio n. 1
0
 private void btnReadAuth_Click(object sender, EventArgs e)
 {
     if (!int.TryParse(tbFreeSpace.Text, out freeSpace2))
         if (MessageBox.Show("Недопустимое значение FreeSpace", "Ошибка",
                              MessageBoxButtons.OK, MessageBoxIcon.Error)
             == DialogResult.OK)
         {
             tbFreeSpace.Text = "";
             tbFreeSpace.Focus();
             return;
         }
     if (freeSpace2 <= 0)
         if (MessageBox.Show("Значение FreeSpace должно быть больше 0", "Ошибка",
                              MessageBoxButtons.OK, MessageBoxIcon.Error)
             == DialogResult.OK)
         {
             tbFreeSpace.Text = "";
             tbFreeSpace.Focus();
             return;
         }
     //получение групы блоков G их их координат в изображении
     object[] obj = Functions.GetBlocks(bm3, colorComponent2);
     List<byte[,]> listOfG = (List<byte[,]>)obj[0];
     List<int[]> listOfGXY = (List<int[]>)obj[1];
     // получение группы блоков G1
     List<byte[,]> listOfG1 = new List<byte[,]>(listOfG.Count);
     flipLevel2 = (byte)trackBar2.Value; 
     foreach (byte[,] bl in listOfG)
         listOfG1.Add(Functions.FlipBlock(bl, flipLevel2));
     //получение RSM' вектора
     //и массива хранящего тип каждого блока(R,S,U)
     obj = Functions.GetVector(listOfG, listOfG1);
     bool[] RSM2 = (bool[])obj[0];
     bool?[] blockType = (bool?[])obj[1];
     try
     {
         //расспаковка RSM' - получаем вектор RS оригинала
         bool[] RSCompressed = (RSM2.Take(RSM2.Length - freeSpace2).ToArray());
         byte[] source = Functions.BitsToBytes(RSCompressed);
         byte[] decompressedData = new byte[source.Length + 1000];
         LZF lzf = new LZF();
         int g = lzf.Decompress(source, source.Length, decompressedData, decompressedData.Length);
         byte[] temp = decompressedData.Take(g).ToArray();
         bool[] RS = Functions.BytesToBits(temp);
       
         //ВЫДЕЛЕНИЕ ХЕШ КОДА И АУТЕНТИФИКАТОРА 
         bool[] hash = new bool[128];
         bool[] auth = new bool[freeSpace2 - 128];
         int i, c;
         for (i = RSM2.Length - freeSpace2, c = 0; c < hash.Length; c++, i++)
         {
             hash[c] = RSM2[i];
         }
         //переводим хеш в массив байт
         hashInBytes = new byte[16];
         BitArray ba = new BitArray(hash);
         ba.CopyTo(hashInBytes, 0);
         for (c = 0; c < auth.Length; c++, i++)
         {
             auth[c] = RSM2[i];
         }
         //переводим аутентификатор в строку
         byte[] authInBytes = new byte[auth.Length / 8 + 1];
         ba = new BitArray(auth);
         ba.CopyTo(authInBytes, 0);
         tbAuthenticator2.Text = Encoding.Default.GetString(authInBytes);
           //возвращаем изображение к первоначальному виду
         bm4 = Functions.GetImage(bm3, colorComponent, listOfG1, listOfGXY, RS, blockType);
         pictureBox4.Image = bm4;
         btnIsImgModified.Enabled = btnSave2.Enabled = true;
     }
     catch
     {
        MessageBox.Show( "Введенное значение freeSpace не может\r\nбыть применимо к данному изображению!\r\nПовторите ввод",
                         "Ошибка", MessageBoxButtons.OK,MessageBoxIcon.Error );
        tbFreeSpace.Text = "";
        tbFreeSpace.Focus();
        return;
     }
     tbAuthenticator2.Enabled = true;
 }
Esempio n. 2
0
 public LzfInputStream(Stream stream)
 {
     this.stream = stream;
     this.lzf = new LZF();
 }
Esempio n. 3
0
        async private void btnGetFreeSpace_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;
            //1 ПОЛУЧЕНИЕ RS-вектора изображения
            //получение групы блоков G их их координат в изображении
            object[] obj =  await Task<object[]>.Factory.StartNew(()=>Functions.GetBlocks(bm, colorComponent));
            listOfG = (List<byte[,]>)obj[0];
            listOfGXY = (List<int[]>)obj[1];
            // получение группы блоков G1
            listOfG1 = new List<byte[,]>(listOfG.Count);
            flipLevel = (byte)trackBar1.Value;
            foreach (byte[,] bl in listOfG)
                listOfG1.Add(await Task<byte[,]>.Factory.StartNew(()=>Functions.FlipBlock(bl, flipLevel)));
            //получение RS-вектора
            //и массива хранящего тип каждого блока(R,S,U)
            obj = await Task<object[]>.Factory.StartNew(()=>Functions.GetVector(listOfG, listOfG1));
            bool[] RS = (bool[])obj[0];
            blockType = (bool?[])obj[1];
       
            //2 СЖАТИЕ GZip И ПОЛУЧЕНИЕ RS1-ВЕКТОРА
              //записали в поток сжатые байты
          
                LZF lzf = new LZF();
                byte[] source = Functions.BitsToBytes(RS);
                byte[] result = new byte[source.Length + 1000];
                int c = lzf.Compress(source, source.Length, result, result.Length);
                byte[] temp = result.Take(c).ToArray();
                RS1 = new BitArray(Functions.BytesToBits(temp));
                //рассчет получившегося за счет сжатия свободного места(в битах)
                freeSpace = RS.Length - RS1.Length;
                lblFreeSpace.Text = freeSpace + " бит";
                symbolCount = freeSpace / 8 - 16;// -16 символов(128 бит) на хеш
                if (symbolCount <= 0)
                {
                    MessageBox.Show("В изображение не получится записать ни одного символа!\n" +
                                                       "Выберите другое изображение или измените настройки");
                    lblSymbolCount.Text = symbolCount + " символов";
                    return;
                }
           
              lblSymbolCount.Text = symbolCount + " символов";
              btnWrite.Enabled = tbAuthenticator.Enabled = true;
              
            Cursor.Current = Cursors.Default;
              

        }