ВКР Чирков А.А. 24Б (1213186), страница 7
Текст из файла (страница 7)
{
//Байт превращаем в массив битов
public BitArray ByteToBit(byte src)
{
byte[] src2 = new byte[1];
src2[0] = src;
BitArray bitArray = new BitArray(src2);
return bitArray;
}
//Массив битов превращаем в байт
public byte BitToByte(BitArray scr)
{
byte num = 0;
for (int i = 0; i < scr.Count; i++)
if (scr[i] == true)
num += (byte)Math.Pow(2, i);
return num;
}
}
Класс «PhotoCriptography.cs»:
public class PhotoCriptography
{
BitConverter bc = new BitConverter();
//Смотрим первый пиксель, если в нем '/' то в фотографии присутствует текст, если '<' то файл
public int IsLabeledPhoto(Bitmap image)
{
byte[] onebyte = new byte[1]; //задаем одномерый массив байт
Color color = image.GetPixel(0, 0); //получаем первый пиксель и присваиваем color
BitArray colorArray = bc.ByteToBit(color.R); //получаем первый канал пикселя(Red) конвертируем его в массив бит и присваеиваем colorArray
BitArray messageArray = new BitArray(8); //пустой массив бит из 8 элементов
messageArray[0] = colorArray[0]; //первому биту messageArray присваиваем первый бит colorArray
messageArray[1] = colorArray[1]; //второму биту messageArray присваиваем второй бит colorArray
colorArray = bc.ByteToBit(color.G); //получаем второй канал пикселя(Green) конвертируем его в массив бит и присваеиваем colorArray
messageArray[2] = colorArray[0]; //третьему биту messageArray присваиваем первый бит colorArray
messageArray[3] = colorArray[1]; //четвертому биту messageArray присваиваем второй бит colorArray
messageArray[4] = colorArray[2]; //пятому биту messageArray присваиваем третий бит colorArray
colorArray = bc.ByteToBit(color.B); //получаем третий канал пикселя(Blue) конвертируем его в массив бит и присваеиваем colorArray
messageArray[5] = colorArray[0]; //шестому биту messageArray присваиваем первый бит colorArray
messageArray[6] = colorArray[1]; //седьмому биту messageArray присваиваем второй бит colorArray
messageArray[7] = colorArray[2]; //восьмому биту messageArray присваиваем третий бит colorArray
onebyte[0] = bc.BitToByte(messageArray); //конвертируем массив бит в байт и присваеиваем его первому и единственному элементу
string text = Encoding.GetEncoding(1251).GetString(onebyte); //конвертируем массив байт onebyte в стринг
if (text == "/") //если символ '/' то возвращаем 1
{
return 1;
}
else if (text == "<") //иначе если символ '<' то возвращаем 2
return 2;
else //иначе возвращаем 0
return 0;
}
//Записываем текст в фото
public void WriteInPhoto(Bitmap image, List<byte> massbytes)
{
int index = 0;
bool state = false;
for (int i = 0; i < image.Width; i++)
{
for (int j = 0; j < image.Height; j++)
{
Color pixelColor = image.GetPixel(i, j); //получаем пиксель
if (index == massbytes.Count) //если index равен количеству байтов для записи
{
state = true; //st присваиваем true
break; //выходим из цикла
}
BitArray colorArray = bc.ByteToBit(pixelColor.R); //Получаем первый канал пикселя(Red) и конвертируем его в массив бит и присваиваем colorArray
BitArray messageArray = bc.ByteToBit(massbytes[index]); //байт из листа конвертируем в массив бит
colorArray[0] = messageArray[0]; //заменяем первый бит
colorArray[1] = messageArray[1]; //заменяем второй бит
byte newR = bc.BitToByte(colorArray); //конвертируем массив бит в байт
colorArray = bc.ByteToBit(pixelColor.G); //Получаем второй канал пикселя(Green) и конвертируем его в массив бит и присваиваем colorArray
colorArray[0] = messageArray[2]; //заменяем первый бит
colorArray[1] = messageArray[3]; //заменяем второй бит
colorArray[2] = messageArray[4]; //заменяем третий бит
byte newG = bc.BitToByte(colorArray); //конвертируем массив бит в байт
colorArray = bc.ByteToBit(pixelColor.B); //Получаем третий канал пикселя(Blue) и конвертируем его в массив бит и присваиваем colorArray
colorArray[0] = messageArray[5]; //заменяем первый бит
colorArray[1] = messageArray[6]; //заменяем второй бит
colorArray[2] = messageArray[7]; //заменяем третий бит
byte newB = bc.BitToByte(colorArray); //конвертируем массив бит в байт
Color newColor = Color.FromArgb(newR, newG, newB); //задаем новый цвет из полученых байтов
image.SetPixel(i, j, newColor); //заменяем пиксель на полученный
index++; //меняем индекс листа байтов сообщения для записи на +1
}
if (state) //если st=true
{
break; //выходим из цикла
}
}
}
//Получаем текст из фото
public string GetTextFromPhoto(Bitmap image)
{
List<byte> listbytes = new List<byte>();
bool firstpixel=true;
bool state = false;
for (int i = 0; i < image.Width; i++)
{
for (int j = 0; j < image.Height; j++)
{
if (firstpixel) //пропускаем первый пиксель, так как там символ определяющий тип сообщения в картинке
firstpixel = false;
else
{
Color pixelColor = image.GetPixel(i, j); //получаем пиксель
BitArray colorArray = bc.ByteToBit(pixelColor.R); //получаем первый канал пикселя(Red) конвертируем его в массив бит и присваеиваем colorArray
BitArray messageArray = new BitArray(8); //пустой массив бит из 8 элементов
messageArray[0] = colorArray[0]; //получаем первый бит
messageArray[1] = colorArray[1]; //получаем первый бит
colorArray = bc.ByteToBit(pixelColor.G); //получаем второй канал пикселя(Green) конвертируем его в массив бит и присваеиваем colorArray
messageArray[2] = colorArray[0]; //получаем первый бит
messageArray[3] = colorArray[1]; //получаем первый бит
messageArray[4] = colorArray[2]; //получаем первый бит
colorArray = bc.ByteToBit(pixelColor.B); //получаем третий канал пикселя(Blue) конвертируем его в массив бит и присваеиваем colorArray
messageArray[5] = colorArray[0]; //получаем первый бит
messageArray[6] = colorArray[1]; //получаем первый бит
messageArray[7] = colorArray[2]; //получаем первый бит
listbytes.Add(bc.BitToByte(messageArray)); //добавляем сконвертированный массив бит в байт в список байтов полученного сообщения
if (listbytes.Count > 2) //если считано более 2 байт
{
string message = Encoding.GetEncoding(1251).GetString(listbytes.GetRange(listbytes.Count - 3, 3).ToArray()); // конвертируем лист байтов в стринг
if (message == "<e>") //если последние 2 символов равны <e>
{
state = true; //st присваиваем true
break; //выходим из цикла
}
}
}
}
if (state) //если st=true
break; //выходим из цикла
}
return Encoding.GetEncoding(1251).GetString(listbytes.GetRange(0, listbytes.Count - 3).ToArray()); //возвращаем полученный текст
}
//Получаем файл из фото
public List<byte> GetFileFromPhoto(Bitmap image)
{
List<byte> listbytes = new List<byte>();
bool state = false;
bool firstpixel = true;
for (int i = 0; i < image.Width; i++)
{
for (int j = 0; j < image.Height; j++)
{
if (firstpixel) //пропускаем первый пиксель, так как там символ определяющий тип сообщения в картнике
firstpixel = false;
else
{
Color pixelColor = image.GetPixel(i, j); //получаем пиксель
BitArray colorArray = bc.ByteToBit(pixelColor.R); //получаем первый канал пикселя(Red) конвертируем его в массив бит и присваеиваем colorArray
BitArray messageArray = new BitArray(8); //пустой массив бит из 8 элементов
messageArray[0] = colorArray[0]; //получаем первый бит
messageArray[1] = colorArray[1]; //получаем второй бит
colorArray = bc.ByteToBit(pixelColor.G); //получаем второй канал пикселя(Green) конвертируем его в массив бит и присваеиваем colorArray
messageArray[2] = colorArray[0]; //получаем первый бит
messageArray[3] = colorArray[1]; //получаем второй бит
messageArray[4] = colorArray[2]; //получаем третий бит
colorArray = bc.ByteToBit(pixelColor.B); //получаем третий канал пикселя(Blue) конвертируем его в массив бит и присваеиваем colorArray
messageArray[5] = colorArray[0]; //получаем первый бит
messageArray[6] = colorArray[1]; //получаем второй бит
messageArray[7] = colorArray[2]; //получаем третий бит
listbytes.Add(bc.BitToByte(messageArray)); //добавляем сконвертированный массив бит в байт в список байтов полученного сообщения
if (listbytes.Count > 2) //если считано более 2 байт
{
string message = Encoding.GetEncoding(1251).GetString(listbytes.GetRange(listbytes.Count - 3, 3).ToArray()); // конвертируем лист байтов в стринг
if (message == "<e>") //если последние 3 символа равны <e>
{
state = true; //st присваиваем true
break; //выходим из цикла
}
}
}
}
if (state) //если st=true
break; //выходим из цикла
}
return listbytes.GetRange(0, listbytes.Count); //возвращаем полученный массив байт
}
}
Класс «Cipher.cs»:
class Cipher
{
byte[] newkeymass;
List<byte> ListOfByte = new List<byte>();
BitConverter bitcon = new BitConverter();
public List<byte> Encript(byte[] messmassive,byte[] keymassive)
{
newkeymass = null;
ListOfByte.RemoveRange(0, ListOfByte.Count);
if (keymassive.Length < messmassive.Length)
{
for (int i = keymassive.Length; i < messmassive.Length; i++)
{
if (newkeymass == null)
{
newkeymass = new byte[keymassive.Length];
newkeymass = keymassive;
}
else
{
newkeymass = new byte[keymassive.Length + newkeymass.Length];
Array.Copy(keymassive, 0, newkeymass, 0, keymassive.Length);
if (newkeymass.Length >= messmassive.Length)
break;
}
}
}
for (int i = 0; i < messmassive.Length; i++)
{
BitArray keybitarray = new BitArray(8);
BitArray bitarray = bitcon.ByteToBit(messmassive[i]);
keybitarray = bitcon.ByteToBit(newkeymass[i]);
bitarray.Xor(keybitarray);
bitarray = Swap(bitarray[0], bitarray[1], bitarray[2], bitarray[3], bitarray[4], bitarray[5], bitarray[6], bitarray[7], keybitarray[7]);
ListOfByte.Add(bitcon.BitToByte(bitarray));
}
return ListOfByte.GetRange(0,ListOfByte.Count);
}
public List<byte> Decript(byte[] messmassive, byte[] keymassive)
{
newkeymass = null;
ListOfByte.RemoveRange(0, ListOfByte.Count);
if (keymassive.Length < messmassive.Length)
{
for (int i = keymassive.Length; i < messmassive.Length; i++)
{
if (newkeymass == null)
{
newkeymass = new byte[keymassive.Length];
newkeymass = keymassive;
}
else
{
newkeymass = new byte[keymassive.Length + newkeymass.Length];
Array.Copy(keymassive, 0, newkeymass, 0, keymassive.Length);
if (newkeymass.Length >= messmassive.Length)
break;
}
}
}
for (int i = 0; i < messmassive.Length; i++)
{
BitArray keybitarray = new BitArray(8);
BitArray bitarray = bitcon.ByteToBit(messmassive[i]);
keybitarray = bitcon.ByteToBit(newkeymass[i]);
bitarray = Swap(bitarray[0], bitarray[1], bitarray[2], bitarray[3], bitarray[4], bitarray[5], bitarray[6], bitarray[7], keybitarray[7]);
bitarray.Xor(keybitarray);
ListOfByte.Add(bitcon.BitToByte(bitarray));
}
return ListOfByte.GetRange(0, ListOfByte.Count);
}
public BitArray Swap(object a, object b, object v, object z, object x, object w, object y, object u, bool t)
{
object c = a;
a = b;
b = c;
bool[] boolarr={Convert.ToBoolean(a),Convert.ToBoolean(b),Convert.ToBoolean(v),Convert.ToBoolean(z),Convert.ToBoolean(x),Convert.ToBoolean(w),Convert.ToBoolean(y),Convert.ToBoolean(u)};
BitArray bt = new BitArray(boolarr);
return bt;
}
}
Класс «Main.cs»:
public partial class Main : Form
{
Bitmap image; //картинка
List<byte> listbytes; //лист байтов текста для записи
byte[] massbytes; //массив байтов стегосообщения
byte[] keymass; //массив байтов стегоключа
string FileStartPath; //путь к картинке
string FileEndPath; //путь к файлу для записи
PhotoCriptography cript = new PhotoCriptography(); //объект класса PhotoCryptography
Cipher cipher = new Cipher(); //объект класса Cipher
public Main()
{
InitializeComponent();
}
private void tbx_SetSecretMess_TextChanged(object sender, EventArgs e)
{
btn_BuildInText.Enabled = true;
}
private void btn_BuildInText_Click(object sender, EventArgs e) //Действие по нажатию на кнопку записать текст
{
if (!string.IsNullOrEmpty(tbx_SetSecretMess.Text))
{















