else if ((val & t) == 0) mass[i] = 0;

  }

       return mass;

}

int GetBitValue(byte B)// Получает последнего бита в байте B. Возвращает 1 или 0 (в зависимости от значения Бита)

{

       int k = 256;

       for (int i = 0; i < 8; i++) k /= 2;

       if ((B & k) != 0) return 1;

       else return 0;

}

int Inversion(int B)

{

       if(B==0) return 1;

       else return 0;

}

byte BinaryToByte (int *mass)//Собирает из массива битов один целый байт и возвращает его.

{

       byte Mask  = 00000001;

  byte Result = 00000000;

  byte Mask2;

  int j = 0;

  for (int i = 7; i > -1; i--, j++)

  {

               if (mass[i] == 1)

               {

                       Mask2 = (Mask << (j));

  Result = Result|Mask2;

  }

  }

  return Result;

}

byte ReadBitToByte (int Bit, byte B)//Записывает в байт B на последнюю позицию бит Bit

{

byte A = 00000001;

  byte Result = B;

  if (Bit == GetBitValue(B))

               return B;

       else if (Bit == 1)

               return Result = Result|A;

НЕ нашли? Не то? Что вы ищете?

       else if (Bit == 0)

               return B - A;

       return NULL;

}

int *mass(int val)//преобразовывает десятиричное число в двоичную систему счисления и на выходе получаем массив из 40 символов

{

       int j=40;

       int *mas = new int[40];

       for (int i=0;i<40;++i) mas[i]=0;

       while(val>=1)

       {

               if(val!=1)

               {

                       if(val/2==1)

                       {

                               mas[j]=1;

                       }

                       else

                       {

                               mas[j]=0;

                       }

                       val=val%2;

               }

               else

               {

                       mas[j]=1;

               }

               --j;

       }

       return mas;

}

int QuantitySymbol(int *massiv)//перевод из двоичной системы счисления в десятиричную

{

       int k=0;

       for(int i=0;i<40;++i)

       {

               k=k+massiv[40-i]*power(i,2);

       }

       return k;

}

int encrypt()

{

       FILE *file,*file1;//для связывания файлов

       int quantity_sym=0;//количество символов

       bool flag=false;

       int num_sym=0;//номер символа

       byte pAudio; //переменная для звуковых данных

       byte *pData = new byte; //Динамически выделим переменную типа byte - текстовых данных

       int *mas=new int;

       byte newAudio;//переменная для новых аудио данных

       int dislocation;//смещение для записи новых бит

       errno_t err;

         err = fopen_s(&file, "Sound. wav", "rb");

       fopen_s(&file1, "SoundOut. wav", "rb");

       if (err)

  {

  cout<<"Failed open file  "<< err <<endl;//ошибка, если не удалось открыть

  return 0;

  }

  WAVHEADER header;

  fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);

       fwrite(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), file1);//копируем нашу структуру в выходной файл

       fclose(file);

       fclose(file1);

       if(!CheckWavFile(header)) return 0;

       ofstream audioOut("SoundOut. wav",ios::app |ios::hex);

       ifstream text("text. txt",ios::beg | ios::in|ios::hex);//

       while(!text. eof())

       {

               text>>pData[quantity_sym];

               quantity_sym++;

       }

       ifstream audio("Sound. wav",ios::beg | ios::in|ios::hex);//

       audio. ignore(28);

       dislocation=bchunk2Size-40/quantity_sym*8;//определяем позицию смещения

       if(quantity_sym>(bchunk2Size-40)*8)

       {

               cout<<"Not enough space"<<endl;

  return 0;

       }

       mas=mass(quantity_sym);

       while(!audio. eof())

       {

               audio>>pAudio;

               if(!flag)

               {

                       flag=true;

                       for(int f=0;f<40;f++)//количество символов в тексте записываем в первые 40 семплов

                       {

                               newAudio=pAudio;

                               ReadBitToByte (mas[f], newAudio);//Записывает в байт B на последнюю позицию бит Bit

                               audioOut<<newAudio;

                               audio>>pAudio;

                       }

               }

               int massiv=*ByteToBinary(pData[num_sym]);//получили массив бит символа

               for(int y=0;y<8;y++)

               {

                       newAudio=pAudio;

                       ReadBitToByte(Inversion(massiv[&y]), newAudio);//записываем в последний бит семпла биты массива каждого символа

                       audioOut<<newAudio;

                       audio>>pAudio;

                       audio. ignore(dislocation);//в семплах которые вошли в смещение, мы игнорируем

               }

               num_sym++;

       }

  audio. close();

       audioOut. close();

       return 0;

}

int decrypt()

{

       FILE *file;

       errno_t err;

       int quatity_sem=0;//количество семплов

       int quantity_sym=0;//количество символов

       int *massiv=new int[40];//массив для 40 битов

       int num_sym=0,num_sem=0;;//номер символа и семпла

       int dislocation;//позиция для смещения

       byte symbol;//символ

       int *mass=new int[8];//массив для 8 битов последних

       byte *pData = new byte;; //Динамически выделим переменную типа byte[размер звуковых данных]

       fopen_s(&file, "SoundOut. wav", "rb");

       if (err)

  {

  cout<<"Failed open file  "<< err <<endl;//ошибка, если не удалось открыть

  return 0;

  }

  WAVHEADER header;

  fread_s(&header, sizeof(WAVHEADER), sizeof(WAVHEADER), 1, file);

       fclose(file);

       if(!CheckWavFile(header)) return 0;//проверка на соответствие файла

  byte *pAudio = new byte[bchunk2Size]; //Динамически выделим переменную типа byte[размер звуковых данных]

       ifstream audio("SoundOut. wav",ios::beg | ios::in|ios::binary);//

       audio. ignore(28);

       while(!audio. eof())

       {

               audio>>pAudio[quatity_sem];

               quatity_sem++;

       }

       audio. close(); //Закроем файл, он нам уже не нужен, у нас есть pAudio

       ofstream text("TextOut. txt",ios::beg | ios::in|ios::hex);//

       for(int f=0;f<40;f++)//количество символов в тексте в 40 семплов

       {

               massiv[f]=GetBitValue(pAudio[f]);//последний бит считываем

       }

       quantity_sym=QuantitySymbol(massiv);

       dislocation=bchunk2Size/quantity_sym*8;//позиция для смещения

       while(num_sym<quantity_sym)

       {

               for(int i=0;i<8;i++)

               {

                       mass[i]=Inversion(GetBitValue(pAudio[num_sem]));

                       num_sem++;

               }

               pData[num_sym]=BinaryToByte(mass);

               num_sem+=dislocation;

               num_sym++;

       }

       for(int j=0;j<num_sym-1;j+2)

       {

               symbol=pData[j]+pData[j+1];

               text<<symbol;

       }

       text. close();

       return 0;

}

int main()

{

       encrypt();

       decrypt();

       system("pause");

       return 0;

}

ПРИЛОЖЕНИЕ Б. РЕЗУЛЬТАТЫ

Рисунок 1 – Пустой контейнер.

Рисунок 2 – Контейнер, в котором изменен последний младший бит.

Рисунок 3 – Контейнер, в котором изменены средние биты.

Рисунок 4 – Контейнер, в котором изменены старшие биты.



Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4