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 |


