Скачать 399.08 Kb.
|
//Выполняем хеширование пароля hash:=Creepy.HashIt(Password.Text); //Записываем зашифрованный файл вместе с хешем в контейнер MS := TMemoryStream.Create; Buf :=hash; MS.Write(Buf, 33); MS.Position := 0; Stegano.WriteBufferToContainer(MS, 0, 33, 2, Container); MS.Clear; {Записываем нашу подпись для дальнейшей идентификации наличия записанных данных в контейнере} sign:='savvas'; MS.Write(sign,7); MS.Position :=0; Stegano.WriteBufferToContainer(MS, 33, 7, 2, Container); MS.Clear; BufI := 1; Ms.Write(BufI, SizeOf(integer)); FS := TFileStream.Create(HD, fmOpenRead); BufI := Length(ExtractFileName(HD))+1; Buf := ExtractFileName(HD); MS.Write(BufI, SizeOf(Integer)); MS.Write(Buf, BufI); BufI := FS.Size; MS.Write(BufI, SizeOf(Integer)); MS.CopyFrom(FS, FS.Size); FS.Free; MS1 := TMemoryStream.Create; BufI := MS.Size; MS1.Write(BufI, 4); MS1.Position := 0; MS.Position := 0; Stegano.WriteBufferToContainer(MS1, 40, 4, 2, Container); Stegano.WriteBufferToContainer(MS, 44, MS.Size, 2, Container); If ModifiedContainerSave.Execute then begin Container.SaveToFile(ModifiedContainerSave.FileName); end; MS.Free; MS1.Free; deletefile(HD);//Удаляем зашифрованный файл completed:=true; PassLabel.Font.Color:=clNone; end else // {Меняем цвет шрифта у надписи "Введите пароль:" на красный} PassLabel.Font.Color:=clRed; end; end; end; end; procedure TForm1.CoolEffectTimer; begin inc(t); if kostil2=true then //Для кнопки "Назад" - возвращаем главное меню begin if kostil=true then begin //Поднимаем кнопку "Извлечь" в исходное положение if t<101 then Extract.Top:=332-t else begin //Отключаем таймер и обнуляем счетчик пикселей CoolEffect.Enabled:=false; t:=0; kostil2:=false; end end else begin //Поднимаем кнопку "Спрятать" в ее исходное положение if t<45 then HidePlz.Top:=332-t else begin //Отключаем таймер и обнуляем счетчик пикселей CoolEffect.Enabled:=false; t:=0; kostil2:=false; end end; end else begin if kostil=true then begin if t<101 then Extract.Top:=232+t else begin CoolEffect.Enabled:=False;//Выключаем таймер t:=0; //Обнуляем счетчик пикселей //Рисуем поле с вводом пароля и Label с надписью //"Введите пароль:" PassLabel.Visible:=true; Password.Top:=264; Password.Left:=184; Password.Visible:=true; //Заменяем кнопку "Выйти" на кнопку "Назад" Back.Visible:=true; kostil2:=true; end end else begin if t<45 then HidePlz.Top:=288+t else begin CoolEffect.Enabled:=False;//Выключаем таймер t:=0; //Обнуляем счетчик пикселей //Рисуем поле с вводом пароля и Label с надписью //"Введите пароль:" PassLabel.Visible:=true; Password.Top:=254; Password.Left:=184; Password.Visible:=true; //Рисуем кнопку для открытия файла SelectFile.Visible:=true; //Заменяем кнопку "Выйти" на кнопку "Назад" Quit.Visible:=false; Back.Visible:=true; kostil2:=true; end; end; end; end; procedure TForm1.BackMouseLeave; begin {После того как курсор был убран, возвращаем исходный цвет текста в кнопке "Назад"} {$IFDEF Unix} Back.Picture.LoadFromFile(path+'images/buttons/back.png'); {$ELSE} Back.Picture.LoadFromFile(path+'images\buttons\back.png'); {$ENDIF} end; procedure TForm1.ExtractMouseLeave; begin {После того как курсор был убран, возвращаем исходный цвет текста в кнопке "Извлечь} {$IFDEF Unix} Extract.Picture.LoadFromFile(path+'images/buttons/extractbtn.png'); {$ELSE} Extract.Picture.LoadFromFile(path+'images\buttons\extractbtn.png'); {$ENDIF} end; procedure TForm1.FormCreate; begin DCFB:=FreeBytes.Caption;//сохраяем исходный caption dcfsib:=FileSizeInBytes.Caption;//сохраяем исходный caption MainMenu.Visible:=false;//прячем главное меню Quit.Top:=200; Form1.Height:=Form1.Height div 2; //Скрываем кнопки "Извлечь" и "Спрятать" невидимыми Extract.Visible:=false; HidePlz.Visible:=false; //Устанавливаем расположение папки с ресурсами {$IFDEF Unix} {В OS X Application.Location возвращает путь до самого исполняемого файла. Поэтому меняем на путь до папки Resources} path:=StringReplace(Application.Location, 'MacOS/', 'Resources/',[rfReplaceAll, rfIgnoreCase]); {$ELSE} path:=Application.Location; {$ENDIF} end; procedure TForm1.HidePlzMouseEnter; begin {После того как курсор был наведен на кнопку "Спрятать", изменяем цвет текста в кнопке на фиолетовый} {$IFDEF Unix} HidePlz.Picture.PNG.LoadFromFile(path+'images/buttons/hidebtn-active.png'); {$ELSE} HidePlz.Picture.LoadFromFile(path+'images\buttons\hidebtn-active.png'); {$ENDIF} // HidePlz.OnMouseEnter:=nil; деактивация евента end; procedure TForm1.HidePlzMouseLeave; begin {После того как курсор был убран, возвращаем исходный цвет текста в кнопке "Спрятать"} {$IFDEF Unix} HidePlz.Picture.LoadFromFile(path+'images/buttons/hidebtn.png'); {$ELSE} HidePlz.Picture.LoadFromFile(path+'images\buttons\hidebtn.png'); {$ENDIF} end; procedure TForm1.PicClick; begin //Процедура загрузки файла-контейнера //Вызываем окно с выбором файла if ContainerOpen.Execute then begin if ContainerChecker(ContainerOpen.Filename,1)=false then begin showmessage('Изображение: '+ExtractFileName(ContainerOpen.Filename)+' не формата BitMap!'); exit; end; Container := TBitmap.Create; Container.LoadFromFile(ContainerOpen.Filename); //Проверяем , что изображение использует цветовую модель - RGB. if Container.PixelFormat=pf1bit then begin showmessage('Алгоритм не поддерживает запись в BitMap изображение типа Grayscale'); exit; end; //Загружаем картинку в форму pic.Picture.bitmap.loadfromfile(ContainerOpen.Filename); picloaded:=true;//Устанавливаем флаг того, что файл-контейнер был успешно загружен //Увеличиваем высоту формы и добавляем главное меню Form1.Height:=485; MainMenu.Visible:=true;//Прячем текстуру главного меню Quit.Top:=384;//Сдвигаем кнопку "Выход" Animation.Enabled:=false;//Отключаем таймер с анимацией //Активируем кнопки, отвечающие за операции над контейнером Extract.Visible:=true; HidePlz.Visible:=true; //Выводим сообщение с количеством свободных байт в контейнере if ContainerChecker('',2)=true then begin Extract.Enabled:=true; FreeBytes.Caption:='В контейнере уже записана информация. Вы можете ее извлечь или перезаписать.'; containerfull:=true;{пользователь может записать данные поверх} end else begin Extract.Enabled:=false; containerfull:=false; FreeBytes.Caption:=DCFB+' '+IntToStr((Container.Width * Container.Height * 2) div 8)+' Байт'; end; FreeBytes.Visible:=true; end; end; procedure TForm1.AnimationTimer; begin inc(t); {$IFDEF Unix} case t of 1:Pic.Picture.LoadFromFile(path+'images/upload/pic0.png'); 2:Pic.Picture.LoadFromFile(path+'images/upload/pic1.png'); 3:Pic.Picture.LoadFromFile(path+'images/upload/pic2.png'); 4:begin Pic.Picture.LoadFromFile(path+'images/upload/pic3.png'); t:=0; end; end; {$ELSE} case t of 1:Pic.Picture.LoadFromFile(path+'images\upload\pic0.png'); 2:Pic.Picture.LoadFromFile(path+'images\upload\pic1.png'); 3:Pic.Picture.LoadFromFile(path+'images\upload\pic2.png'); 4:begin Pic.Picture.LoadFromFile(path+'images\upload\pic3.png'); t:=0; end; end; {$ENDIF} end; procedure TForm1.PicMouseEnter; begin {Анимируем кнопку "Загрузить изображение"} if picloaded=false then begin t:=0; //Инициализируем переменную t. Animation.Interval:=0; //Задаем интервал 0 для быстрого срабатывания. Animation.Enabled:=true;//Включаем таймер. //Задаем интервал 300мс между переключением кадров анимации. Animation.Interval:=300; end; end; procedure TForm1.PicMouseLeave; begin {Отключаем анимацию кнопки "Загрузить изображение".} if picloaded=false then begin Animation.Enabled:=false;//Отключаем таймер. {$IFDEF Unix} Pic.Picture.LoadFromFile(path+'images/upload/nonactive.png');//возвращаем исходную картинку {$ELSE} Pic.Picture.LoadFromFile(path+'\images\upload\nonactive.png');//возвращаем исходную картинку {$ENDIF} end; end; procedure TForm1.QuitClick; begin //Закрываем программу. halt; end; procedure TForm1.QuitMouseEnter; begin {$IFDEF Unix} Quit.Picture.LoadFromFile(path+'images/buttons/exitbtn-active.png'); {$ELSE} Quit.Picture.LoadFromFile(path+'images\buttons\exitbtn-active.png'); {$ENDIF} end; procedure TForm1.QuitMouseLeave; begin {$IFDEF Unix} Quit.Picture.LoadFromFile(path+'images/buttons/exitbtn.png'); {$ELSE} Quit.Picture.LoadFromFile(path+'images\buttons\exitbtn.png'); {$ENDIF} end; //Процедура проверки размера контейнера и загружаемого файла. function TForm1.check:boolean; begin FileSizeInBytes.Visible:=true; FileSizeInBytes.Caption:=dcfsib+' '+IntToStr(hidingfilesize)+' Байт'; //Проверяем, что размер файла соотвествует размеру контейнера. if ((Container.Width * Container.Height * 2) div 8)>=hidingfilesize then begin Result:=true; FileSizeInBytes.Font.Color:=$00A1FF90; end else begin Result:=false; FileSizeInBytes.Font.Color:=clRed; end; end; procedure TForm1.SelectFileClick; var s: TSearchRec; begin //Открываем записываемыей файл и вычисляем его размер if HidingFileOpen.Execute then begin fileloaded:=true ; if FindFirst(HidingFileOpen.FileName,faAnyFile,s)=0 then hidingfilesize:=s.Size; FindClose(s); check; end else fileloaded:=false; end; end.//Конец. Unit2.pas {Модуль хэширования и шифрования, соответственно содержит 2 процедуры: 1)Зашифровать файл паролем пользователя с помощью алгоритма AES-256 PS: Вообще этот шаг я воплощаю в жизнь только с "превентивной" целью. Т.е обезопасить данные в случае обнаружения. 2)Хэшировать пароль. Хэш будет md5. В качестве реализации использую системный модуль лазаруса содержащий готовую фунцию.} unit Unit2; {$mode objfpc}{$H+} interface uses Classes,Process, SysUtils,md5{системный-модуль lazarus,работает ли он в Windows?}; type TCreepy = class public function HashIt(pass:string):string; function Encrypt(apppath,pass,imagecont:string):string; function Decrypt(apppath,pass,imagecont:string):string; end; var //Creepy:TCreepy; hProcess : TProcess; implementation //Функция хэширования пароля function TCreepy.HashIt(pass:string):string; begin Result := MD5Print(MD5String(pass)); end; //Функция шифрования файла //на вход дается полный путь до файла и пароль, который ввел пользователь //на выходе полный путь до закриптованного файла function TCreepy.Encrypt(apppath,pass,imagecont:string):string; begin // Создаем объект TProcess и // присваиваем его переменной AProcess. hProcess := TProcess.Create(nil); // Сообщим AProcess сомандную строку для запуска {$IFDEF Unix} hProcess.CommandLine := 'openssl aes-256-cbc -pass pass:'+pass+' -in '+imagecont+' -out '+imagecont+'.enc'; {$ELSE} //windows hProcess.CommandLine := apppath+'openssl aes-256-cbc -pass pass:'+pass+' -in '+imagecont+' -out '+imagecont+'.enc'; {$ENDIF} // Необходимо описать опции программы для запуска // Эта опция не позволит нашей программе выполнятся до тех пор, пока // запущенная программа не закончится hProcess.Options := hProcess.Options + [poWaitOnExit]; // Теперь AProcess знает командную строку // и мы ее запускаем hProcess.Execute; // Пока ppc386 не прекратит работу, мы досюда не дойдем hProcess.Free; Result:=imagecont+'.enc';//возвращаем путь до зашифрованного файла end; //Функция дешифрования function TCreepy.Decrypt(apppath,pass,imagecont:string):string; var sourcefile:string; begin //Избавляемся от расширения .enc sourcefile:=StringReplace(imagecont, '.enc', '',[rfReplaceAll, rfIgnoreCase]); // Создаем объект TProcess и // присваиваем его переменной AProcess. hProcess := TProcess.Create(nil); // Сообщим AProcess сомандную строку для запуска {$IFDEF Unix} hProcess.CommandLine := 'openssl aes-256-cbc -pass pass:'+pass+' -d'+' -in '+imagecont+' -out '+sourcefile; {$ELSE} //windows hProcess.CommandLine := apppath+'openssl aes-256-cbc -pass pass:'+pass+' -d'+' -in '+imagecont+' -out '+sourcefile; {$ENDIF} {Необходимо описать опции программы для запуска Эта опция не позволит нашей программе выполнятся до тех пор, пока запущенная программа не закончится} hProcess.Options := hProcess.Options + [poWaitOnExit]; // Теперь AProcess знает командную строку и мы ее запускаем hProcess.Execute; // Пока ppc386 не прекратит работу, мы досюда не дойдем hProcess.Free; Result:=sourcefile;//возвращаем путь до зашифрованного файла end; end. Unit3.pas {программный модуль содержит класс, отвечающий за чтение/запись содержимого контейнера} unit Unit3; {$mode objfpc}{$H+} interface uses SysUtils,Classes, Graphics, Math,Unit2; type TStegano = class public procedure WriteBufferToContainer(MS: TStream; StartPos, Count, Val: integer; var Bmp: TBitmap); procedure ReadBufferFromContainer(Bmp: TBitmap; StartPos, Count, Val: integer; var MS: TStream); end; var Creepy:TCreepy;//класс для шифрования/дешифрования/хеширования из Unit2 Stegano:TStegano;//класс содержащий процедуры записи данных из потока в контейнер implementation procedure TStegano.WriteBufferToContainer(MS: TStream; StartPos, Count, Val: integer; var Bmp: TBitmap); var Ind, Indx, Indy, Indz, Ind1, FreeSpace, Divider, NewVal: integer; CurVal, MByte, R: byte; begin CurVal:=0;//Инициализируем локальную переменную. If Val > 8 then Exit; If (Val mod 2 <> 0) and (Val <> 1) then Exit; If (MS.Size - MS.Position) < (Count - StartPos) then Exit; FreeSpace := (Bmp.Width * Bmp.Height * Val) div 8; StartPos := StartPos * 8 div Val + 1; If (Count - StartPos) > FreeSpace then Exit; MByte := Round(Power(2, Val) - 1); Indz := Val; MS.Read(CurVal, 1); If Bmp.Width > Bmp.Height then Divider := Bmp.Height else Divider := Bmp.Width; for Ind1 := 0 to (Count * 8 div Val) do begin NewVal := 0; Ind := 16; Indx := StartPos div Divider; Indy := StartPos mod Divider; while (Ind >= 0) and (MS.Position <= StartPos + Count) do begin R := Byte(Bmp.Canvas.Pixels[Indx, Indy] shr Ind); R := R and (255 - MByte); R := R or (CurVal and MByte); NewVal := NewVal shl 8; NewVal := NewVal or R; CurVal := CurVal shr Val; Inc(Indz, Val); If Indz > 8 then begin Indz := Val; MS.Read(CurVal, 1); end; Dec(Ind, 8); end; Bmp.Canvas.Pixels[Indx, Indy] := NewVal; Inc(StartPos); end; end; procedure TStegano.ReadBufferFromContainer(Bmp: TBitmap; StartPos, Count, Val: integer; var MS: TStream); var Ind, Indx, Indy, Indz, Ind1, Divider: integer; CurVal, MByte, R: byte; begin CurVal := 0; If Val > 8 then Exit; If (Val mod 2 <> 0) and (Val <> 1) then Exit; If MS = nil then MS := TMemoryStream.Create; MByte := Round(Power(2, Val) - 1); Indz := Val; If Bmp.Width > Bmp.Height then Divider := Bmp.Height else Divider := Bmp.Width; StartPos := StartPos * 8 div Val + 1; for Ind1 := 0 to (Count * 8 div Val) do begin Ind := 16; Indx := StartPos div Divider; Indy := StartPos mod Divider; while (Ind >= 0) and (MS.Position <= StartPos + Count) do begin R := Byte(Bmp.Canvas.Pixels[Indx, Indy] shr Ind); R := R and MByte; CurVal := CurVal or (R shl (Indz - Val)); Inc(Indz, Val); If Indz > 8 then begin Indz := Val; MS.Write(CurVal, 1); CurVal := 0; end; Dec(Ind, 8); end; Inc(StartPos); end;end;end.</45></101></45></101> |
Пояснительная записка к курсовой работе по дисциплине «Информационные системы и технологии» Пояснительная записка содержит 25 страниц, 3 изображения, 3 источника, 2 приложения |
Пояснительная записка к курсовой работе по дисциплине: «Система складирования... Усовершенствование методов управления логистическими процессами |
||
Пояснительная записка к курсовой работе по дисциплине «Производство и ремонт подвижного состава» Федеральное государственное бюджетное образовательное учреждение высшего образования |
Пояснительная записка к курсовой работе по дисциплине «Электропитание... Федеральное государственное бюджетное образовательное учреждение высшего образования |
||
Пояснительная записка к курсовой работе по дисциплине «Сертификация систем качества» Колесные пары железнодорожных вагонов: их назначение, устройство, ремонт и алгоритм подтверждение соответствия 5 |
Пояснительная записка к курсовой работе по дисциплине: «Система складирования... Операции, направленные на координацию складской деятельности со службой закупки |
||
Пояснительная записка к курсовой работе по дисциплине «Менеджмент... Стоимость основных производственных фондов ремонтного вагонного депо в плановом периоде, тыс руб |
Пояснительная записка к курсовой работе по дисциплине «Эксплуатация... Организация технического обслуживания и ремонта оборудования железнодорожной электросвязи в региональном центре связи |
||
Пояснительная записка к курсовой работе по дисциплине: «Система складирования... Рекомендации по совершенствованию организационных методов и внедрению более производительных технических средств реализации логистических... |
Пояснительная записка к курсовой работе по дисциплине «Эксплуатация... Тема: «Организация технического обслуживания и ремонта оборудования железнодорожной электросвязи в региональном центре связи» |
||
Техническая документация к программному продукту «Информационная... Программный продукт разработан в качестве курсовой работы по дисциплине «Технологии программирования» |
Пояснительная записка к курсовой работе по дисциплине: «Аудиотехника»... Федеральное государственное образовательное учреждение высшего профессионального образования «Чувашский государственный университет... |
||
Пояснительная записка к курсовой работе по дисциплине «Передача дискретных... Расчёт и организация сети передачи дискретных сообщений на участке железной дороги |
Пояснительная записка к курсовой работе по дисциплине «Вычислительные... Организационная структура корпорации включает в себя административный аппарат (решает управленческие задачи) и производственный сектор... |
||
Диагностирование состояния деталей цилиндропоршневой группы двигателей... Перечень ключевых слов, которые дают общее представление о содержании курсовой работы: субъективные и инструментальные методы диагностирования... |
Пояснительная записка к курсовой работе по дисциплине «Вычислительные... В данной курсовойработе необходимо разработать структурированную кабельную сеть для организации, объединяющей несколько подразделений... |
Поиск |