463 lines
30 KiB
TeX
463 lines
30 KiB
TeX
\documentclass[a4paper, final]{article}
|
||
%\usepackage{literat} % Нормальные шрифты
|
||
\usepackage[14pt]{extsizes} % для того чтобы задать нестандартный 14-ый размер шрифта
|
||
\usepackage{tabularx}
|
||
\usepackage[T2A]{fontenc}
|
||
\usepackage[utf8]{inputenc}
|
||
\usepackage[russian]{babel}
|
||
\usepackage{amsmath}
|
||
\usepackage[left=25mm, top=20mm, right=20mm, bottom=20mm, footskip=10mm]{geometry}
|
||
\usepackage{ragged2e} %для растягивания по ширине
|
||
\usepackage{setspace} %для межстрочного интервала
|
||
\usepackage{moreverb} %для работы с листингами
|
||
\usepackage{indentfirst} % для абзацного отступа
|
||
\usepackage{moreverb} %для печати в листинге исходного кода программ
|
||
\usepackage{pdfpages} %для вставки других pdf файлов
|
||
\usepackage{tikz}
|
||
\usepackage{graphicx}
|
||
\usepackage{afterpage}
|
||
\usepackage{longtable}
|
||
\usepackage{float}
|
||
|
||
|
||
|
||
% \usepackage[paper=A4,DIV=12]{typearea}
|
||
\usepackage{pdflscape}
|
||
% \usepackage{lscape}
|
||
|
||
\usepackage{array}
|
||
\usepackage{multirow}
|
||
|
||
\renewcommand\verbatimtabsize{4\relax}
|
||
\renewcommand\listingoffset{0.2em} %отступ от номеров строк в листинге
|
||
\renewcommand{\arraystretch}{1.4} % изменяю высоту строки в таблице
|
||
\usepackage[font=small, singlelinecheck=false, justification=centering, format=plain, labelsep=period]{caption} %для настройки заголовка таблицы
|
||
\usepackage{listings} %листинги
|
||
\usepackage{xcolor} % цвета
|
||
\usepackage{hyperref}% для гиперссылок
|
||
\usepackage{enumitem} %для перечислений
|
||
|
||
% Настраиваем листинги, чтобы они использовали счётчик figure
|
||
% \AtBeginDocument{
|
||
% \renewcommand{\thelstlisting}{\thefigure} % Листинги используют тот же счетчик, что и рисунки
|
||
% \renewcommand{\lstlistingname}{Рис.} % Меняем подпись на "Рисунок"
|
||
% }
|
||
|
||
% Автоматически увеличиваем счетчик figure перед каждым листингом
|
||
% \let\oldlstlisting\lstlisting
|
||
% \renewcommand{\lstlisting}[1][]{%
|
||
% \refstepcounter{figure}% Увеличиваем счетчик figure
|
||
% \oldlstlisting[#1]% Вызываем оригинальную команду lstlisting
|
||
% }
|
||
|
||
\newcommand{\specialcell}[2][l]{\begin{tabular}[#1]{@{}l@{}}#2\end{tabular}}
|
||
|
||
|
||
\setlist[enumerate,itemize]{leftmargin=1.2cm} %отступ в перечислениях
|
||
|
||
\hypersetup{colorlinks,
|
||
allcolors=[RGB]{010 090 200}} %красивые гиперссылки (не красные)
|
||
|
||
% подгружаемые языки — подробнее в документации listings (это всё для листингов)
|
||
\lstloadlanguages{ Haskell}
|
||
% включаем кириллицу и добавляем кое−какие опции
|
||
\lstset{tabsize=2,
|
||
breaklines,
|
||
basicstyle=\footnotesize,
|
||
columns=fullflexible,
|
||
flexiblecolumns,
|
||
numbers=left,
|
||
numberstyle={\footnotesize},
|
||
keywordstyle=\color{blue},
|
||
inputencoding=cp1251,
|
||
extendedchars=true
|
||
}
|
||
\lstdefinelanguage{MyC}{
|
||
language=Haskell,
|
||
% ndkeywordstyle=\color{darkgray}\bfseries,
|
||
% identifierstyle=\color{black},
|
||
% morecomment=[n]{/**}{*/},
|
||
% commentstyle=\color{blue}\ttfamily,
|
||
% stringstyle=\color{red}\ttfamily,
|
||
% morestring=[b]",
|
||
% showstringspaces=false,
|
||
% morecomment=[l][\color{gray}]{//},
|
||
keepspaces=true,
|
||
escapechar=\%,
|
||
texcl=true
|
||
}
|
||
|
||
\textheight=24cm % высота текста
|
||
\textwidth=16cm % ширина текста
|
||
\oddsidemargin=0pt % отступ от левого края
|
||
\topmargin=-1.5cm % отступ от верхнего края
|
||
\parindent=24pt % абзацный отступ
|
||
\parskip=5pt % интервал между абзацами
|
||
\tolerance=2000 % терпимость к "жидким" строкам
|
||
\flushbottom % выравнивание высоты страниц
|
||
|
||
|
||
% Настройка листингов
|
||
\lstset{
|
||
language=Haskell,
|
||
extendedchars=\true,
|
||
inputencoding=utf8,
|
||
keepspaces=true,
|
||
captionpos=t,
|
||
}
|
||
|
||
\begin{document} % начало документа
|
||
|
||
|
||
|
||
% НАЧАЛО ТИТУЛЬНОГО ЛИСТА
|
||
\begin{center}
|
||
\hfill \break
|
||
\hfill \break
|
||
\normalsize{МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ\\
|
||
федеральное государственное автономное образовательное учреждение высшего образования «Санкт-Петербургский политехнический университет Петра Великого»\\[10pt]}
|
||
\normalsize{Институт компьютерных наук и кибербезопасности}\\[10pt]
|
||
\normalsize{Высшая школа технологий искусственного интеллекта}\\[10pt]
|
||
\normalsize{Направление: 02.03.01 <<Математика и компьютерные науки>>}\\
|
||
|
||
\hfill \break
|
||
\hfill \break
|
||
\hfill \break
|
||
\hfill \break
|
||
\large{Отчет по лабораторной работе №3}\\
|
||
\large{по дисциплине}\\
|
||
\large{<<Функциональное программирование>>}\\
|
||
\large{Вариант 20}\\
|
||
\hfill \break
|
||
|
||
% \hfill \break
|
||
% \hfill \break
|
||
\end{center}
|
||
|
||
\small{
|
||
\begin{tabular}{lrrl}
|
||
\!\!\!Студент, & \hspace{2cm} & & \\
|
||
\!\!\!группы 5130201/20102 & \hspace{2cm} & \underline{\hspace{3cm}} &Тищенко А. А. \\\\
|
||
\!\!\!Преподаватель,\\ \hspace{-5pt}к. т. н., доц. & \hspace{2cm} & \underline{\hspace{3cm}} & Моторин Д. Е. \\\\
|
||
&&\hspace{4cm}
|
||
\end{tabular}
|
||
\begin{flushright}
|
||
<<\underline{\hspace{1cm}}>>\underline{\hspace{2.5cm}} 2024г.
|
||
\end{flushright}
|
||
}
|
||
|
||
\hfill \break
|
||
% \hfill \break
|
||
\begin{center} \small{Санкт-Петербург, 2024} \end{center}
|
||
\thispagestyle{empty} % выключаем отображение номера для этой страницы
|
||
|
||
% КОНЕЦ ТИТУЛЬНОГО ЛИСТА
|
||
\newpage
|
||
|
||
\tableofcontents
|
||
|
||
|
||
% \newpage
|
||
|
||
% \section*{Введение}
|
||
|
||
% \addcontentsline{toc}{section}{Введение}
|
||
|
||
\newpage
|
||
\section {Постановка задачи}
|
||
Для выполнения лабораторной работы необходимо было сделать следующее. Создать проект в stack. Все чистые функции записать в библиотеку Lib.hs и ограничить доступ к вспомогательным функциям. Использовать do-нотацию для работы с внешними файлами. Найти портрет Дэвида Дойча. Перевести изображение в формат .bmp (24-разрядный). Сохранить в файл формата .txt фрагмент биографии (не менее 1000 символов без пробелов, текст не должен обрываться на середине слова или предложения). Закодировать текст в изображение шифром Цезаря (смещение задается пользователем). Ключ к шифру записывается в имя файла. Написать функцию расшифровывающую текст из изображения используя ключ из имени файла и сохраняющую результат в отдельный текстовый файл. Создать функции шифрующие текст в последний бит каждого байта, последние два бита
|
||
каждого байта, …, все биты в байте. В отчете привести примеры искажений изображения.
|
||
|
||
|
||
\newpage
|
||
\section {Математическое описание}
|
||
\subsection{Шифр Цезаря}
|
||
Шифр Цезаря (лат. Notae Caesarianae), также известный как шифр сдвига или код Цезаря — разновидность шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите (так, в шифре со сдвигом вправо на 3, А была бы заменена на Г, Б станет Д, и так далее). Шифр был назван в честь римского полководца Гая Юлия Цезаря, использовавшего его для секретной переписки со своими военачальниками.
|
||
|
||
Если сопоставить каждому символу алфавита его порядковый номер (нумеруя с 0), то шифрование и дешифрование можно выразить формулами модульной арифметики~\cite{caesar}:
|
||
\[
|
||
y = (x + k) \mod n
|
||
\]
|
||
\[
|
||
x = (y - k) \mod n
|
||
\]
|
||
где: \\
|
||
$x$ — символ открытого текста, \\
|
||
$y$ — символ шифрованного текста, \\
|
||
$n$ — мощность алфавита, \\
|
||
$k$ — ключ.
|
||
|
||
|
||
\newpage
|
||
\section {Особенности реализации}
|
||
\subsection{Исходное изображение и текст}
|
||
Для выполнения лабораторной работы необходимо было найти изображение Дэвида Дойча (см. Рис.~\ref{fig:david}). Изображение было переведено из формата \texttt{jpeg} в формат \texttt{bmp} с помощью сайта~\cite{convertio}.
|
||
|
||
\begin{figure}[h]
|
||
\centering
|
||
\includegraphics[width=0.5\linewidth]{img/david.jpg}
|
||
\caption{Изображение Дэвида Дойча, размещённое на его личном сайте~\cite{david}.}
|
||
\label{fig:david}
|
||
\end{figure}
|
||
|
||
Отрывок биографии Дэвида Дойча длиною в 1157 символов без учёта пробелов представлен ниже.
|
||
|
||
\texttt{
|
||
David Elieser Deutsch FRS (DOYTCH; born 18 May 1953) is a British physicist at the University of Oxford. He is a visiting professor in the Department of Atomic and Laser Physics at the Centre for Quantum Computation (CQC) in the Clarendon Laboratory of the University of Oxford. He pioneered the field of quantum computation by formulating a description for a quantum Turing machine, as well as specifying an algorithm designed to run on a quantum computer. He is a proponent of the many-worlds interpretation of quantum mechanics.
|
||
Deutsch was born to a Jewish family in Haifa, Israel on 18 May 1953, the son of Oskar and Tikva Deutsch. In London, David attended Geneva House school in Cricklewood (his parents owned and ran the Alma restaurant on Cricklewood Broadway), followed by William Ellis School in Highgate before reading Natural Sciences at Clare College, Cambridge and taking Part III of the Mathematical Tripos. He went on to Wolfson College, Oxford for his doctorate in theoretical physics, about quantum field theory in curved space-time, supervised by Dennis Sciama and Philip Candelas.
|
||
His work on quantum algorithms began with a 1985 paper, later expanded in 1992 along with Richard Jozsa, to produce the DeutschJozsa algorithm, one of the first examples of a quantum algorithm that is exponentially faster than any possible deterministic classical algorithm.
|
||
}
|
||
|
||
\subsection{Кодирование и декодирование текста с помощью шифра Цезаря}
|
||
|
||
Код функций для кодирования и декодирования текста с помощью шифра Цезаря представлен в листинге~\ref{lst:encrypt-caesar}. Функция \texttt{encryptCaesar} принимает алфавит в виде списка символов, смещение и сам текст, а возвращает зашифрованный текст. В её коде используется вспомогательная функция \texttt{indexOf}. Функция принимает список и элемент списка, а возвращает индекс этого элемента. Для создания алфавита используется функция \texttt{createAlphabetFromText}. Она принимает текст, а возвращает алфавит, который в нём используется, в виде списка символов. Для декодирования текста используется функция \texttt{decryptCaesar}, которая, по-сути, является лишь обёрткой над функцией \texttt{encryptCaesar}, так как процесс кодирования осуществляется почти так же как и декодирования. Функция \texttt{decryptCaesar} принимает на вход алфавит, смещение и закодированный текст, а возвращает декодированный текст. Алфавит сохраняется в отдельный файл и должен передаваться вместе с зашифрованным текстом, чтобы этот текст можно было дешифровать.
|
||
|
||
\begin{lstlisting}[caption={Функции для кодирования и декодирования текста с помощью шифра Цезаря.}, label={lst:encrypt-caesar}]
|
||
encryptCaesar :: [Char] -> Int -> String -> String
|
||
encryptCaesar alphabet shift text = map caesarChar text
|
||
where
|
||
caesarChar c = alphabet !! ((indexOf alphabet c + shift) `mod` length alphabet)
|
||
|
||
indexOf :: (Eq t) => [t] -> t -> Int
|
||
indexOf [] _ = -1
|
||
indexOf (x : xs) target
|
||
| x == target = 0
|
||
| otherwise = 1 + indexOf xs target
|
||
|
||
createAlphabetFromText :: String -> [Char]
|
||
createAlphabetFromText [] = []
|
||
createAlphabetFromText (x:xs)
|
||
| x `elem` alphabet = alphabet
|
||
| otherwise = x : alphabet
|
||
where
|
||
alphabet = createAlphabetFromText xs
|
||
|
||
decryptCaesar :: [Char] -> Int -> String -> String
|
||
decryptCaesar alphabet shift =
|
||
encryptCaesar alphabet (alphabetLength - (shift `mod` alphabetLength))
|
||
where
|
||
alphabetLength = length alphabet
|
||
\end{lstlisting}
|
||
|
||
Пример закодированного с помощью шифра Цезаря текста биографии Дэвида Дойча для смещения 5 представлен ниже.
|
||
|
||
\noindent
|
||
\texttt{
|
||
uiHF rWtFaga.ruabYgo;r3qkrNuCLS59Grcm.lrDwrvinrDJRBTrFgrirM.FYFg;rs;ngFo\\
|
||
FgYriYrY;arAlFHa.gFYnrmerCdem. Ur9arFgrirHFgFYFlhrs.meaggm.rFlrY;aruasi.\\
|
||
YQalYrmerIYmQForil r)iga.r8;ngFogriYrY;ar5alY.arem.r(bilYbQr5mQsbYiYFmlr\\
|
||
N5(5TrFlrY;ar5ti.al mlr)icm.iYm.nrmerY;arAlFHa.gFYnrmerCdem. Ur9arsFmlaa\\
|
||
.a rY;areFat rmerpbilYbQromQsbYiYFmlrcnrem.QbtiYFlhrir ago.FsYFmlrem.rir\\
|
||
pbilYbQrSb.FlhrQio;Flayrigr,attrigrgsaoFenFlhrilrithm.FY;Qr agFhla rYmr.\\
|
||
blrmlrirpbilYbQromQsbYa.Ur9arFgrirs.msmlalYrmerY;arQiln,m.t grFlYa.s.aYi\\
|
||
YFmlrmerpbilYbQrQao;ilFogU1uabYgo;r,igrcm.lrYmrirxa,Fg;reiQFtnrFlr9iFeiy\\
|
||
r-g.iatrmlrDwrvinrDJRByrY;argmlrmerCg2i.ril rSF2HiruabYgo;Ur-lr)ml mlyru\\
|
||
iHF riYYal a rEalaHir9mbgargo;mmtrFlr5.Fo2ta,mm rN;Fgrsi.alYgrm,la ril r\\
|
||
.ilrY;arItQir.agYib.ilYrmlr5.Fo2ta,mm rM.mi ,inTyremttm,a rcnrPFttFiQrWt\\
|
||
tFgrko;mmtrFlr9Fh;hiYarcaem.ar.ai FlhrOiYb.itrkoFaloagriYr5ti.ar5mttahay\\
|
||
r5iQc.F haril rYi2Flhr8i.Yr---rmerY;arviY;aQiYFoitrS.FsmgUr9ar,alYrmlrYm\\
|
||
rPmtegmlr5mttahayrCdem. rem.r;Fgr moYm.iYarFlrY;am.aYFoitrs;ngFogyricmbY\\
|
||
rpbilYbQreFat rY;am.nrFlrob.Ha rgsioaYFQayrgbsa.HFga rcnruallFgrkoFiQiri\\
|
||
l r8;FtFsr5il atigU19Fgr,m.2rmlrpbilYbQrithm.FY;Qgrcahilr,FY;rirDJwRrsis\\
|
||
a.yrtiYa.radsil a rFlrDJJzritmlhr,FY;rqFo;i. rxmfgiyrYmrs.m boarY;aruabY\\
|
||
go;xmfgirithm.FY;QyrmlarmerY;areF.gYradiQstagrmerirpbilYbQrithm.FY;QrY;i\\
|
||
YrFgradsmlalYFittnreigYa.rY;ilrilnrsmggFctar aYa.QFlFgYForotiggFoitrithm\\
|
||
.FY;QU}
|
||
|
||
|
||
\subsection{Представление текста в виде последовательности бит}
|
||
|
||
Код функций для преобразования текста в последовательность бит и обратно представлен в листинге~\ref{lst:bit}. Функция \texttt{textToBits} принимает текст в виде строки и возвращает его представление в виде вектора бит. Она использует вспомогательную функцию \texttt{charToBits}, которая преобразует символ в список бит, представляющих его код ASCII в двоичном виде. Для преобразования последовательности бит обратно в текст используется функция \texttt{bitsToText}. Она рекурсивно делит вектор бит на блоки по 8 бит, преобразует каждый блок в символ ASCII и объединяет их в строку. В процессе этого преобразования используется функция \texttt{bitsToInt}, которая преобразует вектор бит в целое число, интерпретируя их как двоичное представление этого числа.
|
||
|
||
|
||
\begin{lstlisting}[caption={Функции для конвертации текста в последовательность бит и обратно.}, label={lst:bit}]
|
||
textToBits :: String -> VU.Vector Int
|
||
textToBits text = VU.fromList $ concatMap charToBits text
|
||
|
||
charToBits :: Char -> [Int]
|
||
charToBits c = [if testBit (ord c) i then 1 else 0 | i <- [7,6..0]]
|
||
|
||
bitsToText :: VU.Vector Int -> String
|
||
bitsToText bits
|
||
| VU.null bits = []
|
||
| otherwise = (chr $ bitsToInt (VU.take 8 bits)) : bitsToText (VU.drop 8 bits)
|
||
|
||
bitsToInt :: VU.Vector Int -> Int
|
||
bitsToInt bits =
|
||
sum [bit * (2 ^ index) | (bit, index) <- zip (VU.toList bits) [len,(len - 1)..0]]
|
||
where
|
||
len = VU.length bits - 1
|
||
\end{lstlisting}
|
||
|
||
|
||
\subsection{Работа с файлами}
|
||
Для работы с текстовыми файлами использовались базовые функции Haskell -- \texttt{readFile} (читает содержимое файла и возвращает его как строку) и \texttt{writeFile} (записывает строку в файл, заменяя его содержимое).
|
||
|
||
Для работы с изображениями использовалась библиотека \texttt{JuicyPixels}~\cite{JuicyPixels}. С её помощью можно как прочитать изображение в любом популярном формате, так и сохранить его. В частности в работе использовались функции: \texttt{readImage} -- для чтения изображения из указанного файла, \texttt{saveBmpImage} -- для сохранения изображения в формате bmp.
|
||
|
||
|
||
\subsection{Сохранение зашифрованных данных в изображении}
|
||
|
||
Код функций для создания изображения с закодированными данными представлен в листинге~\ref{lst:genImg}. Функция \texttt{encodePixel} отвечает за кодирование последовательности бит в определённый пиксель изображения. Она принимает количество бит данных, которое будет сохранено в каждый байт изображения, исходное изображение, вектор бит зашифрованных данных, координаты пикселя (\(x, y\)) и возвращает новый пиксель с закодированными данными. Для этого функция вычисляет индекс пикселя в изображении, извлекает соответствующую часть вектора бит данных, преобразует её в целые числа, накладывает битовую маску, которая соответствует количество изменяемых бит в байте, и записывает закодированные данные. Для создания маски используется вспомогательная функция \texttt{createMask}.
|
||
|
||
Функция \texttt{encodePixel} затем используется вместе с функцией \texttt{generateImage} из библиотеки JuicyPixels для генерации нового изображения.
|
||
|
||
При сохранении изображения в файл, в его названии сохраняется смещение шифра Цезаря и количество бит в байте, отведённых для хранения зашифрованных данных. Например, название изображения \texttt{david\_2\_10.bmp} означает, что при кодировании использовался код Цезаря со смещением 10, а для хранения закодированных данных в каждом байте изображения использовалось 2 бита.
|
||
|
||
\begin{lstlisting}[caption={Функции для создания изображения с закодированными данными.}, label={lst:genImg}]
|
||
createMask :: Int -> Int
|
||
createMask shift = shiftL (complement 0) shift .&. complement 0
|
||
|
||
encodePixel :: Int -> Image PixelRGB8 -> VU.Vector Int -> Int -> Int -> PixelRGB8
|
||
encodePixel bitsPerByte img bits x y = PixelRGB8 newR newG newB
|
||
where
|
||
width = imageWidth img
|
||
|
||
index = x + y * width
|
||
startPos = index * 3 * bitsPerByte
|
||
pixelBits = VU.slice startPos (3 * bitsPerByte) bits
|
||
|
||
bitsIntR = bitsToInt $ VU.slice 0 bitsPerByte pixelBits
|
||
bitsIntG = bitsToInt $ VU.slice bitsPerByte bitsPerByte pixelBits
|
||
bitsIntB = bitsToInt $ VU.slice (2 * bitsPerByte) bitsPerByte pixelBits
|
||
|
||
mask = createMask bitsPerByte
|
||
|
||
PixelRGB8 r g b = pixelAt img x y
|
||
newR = intToWord8 $ ((word8ToInt r) .&. mask) .|. bitsIntR
|
||
newG = intToWord8 $ ((word8ToInt g) .&. mask) .|. bitsIntG
|
||
newB = intToWord8 $ ((word8ToInt b) .&. mask) .|. bitsIntB
|
||
\end{lstlisting}
|
||
|
||
|
||
\subsection{Чтение зашифрованных данных из изображения}
|
||
|
||
Код функций для чтения зашифрованных данных из изображения представлен в листинге~\ref{lst:readImg}. Функция \texttt{extractBits} извлекает заданное количество бит из одного байта пикселя. Она принимает число бит на байт и байт пикселя, возвращая список бит. Функция \texttt{extractBitsFromPixel} предназначена для извлечения бит из всех трёх цветовых каналов (\(R, G, B\)) пикселя. Она объединяет списки бит из каждого канала в один общий список. Для извлечения бит из всего изображения используется функция \texttt{extractBitsFromImage}. Она последовательно обрабатывает все пиксели изображения, извлекая биты с помощью \texttt{extractBitsFromPixel}, и объединяет их в общий список.
|
||
|
||
Функция \texttt{extractShift} извлекает смещения для шифра Цезаря из названия файла изображения.
|
||
|
||
\begin{lstlisting}[caption={Функции для чтения зашифрованных данных из изображения.}, label={lst:readImg}]
|
||
extractBits :: Int -> Pixel8 -> [Int]
|
||
extractBits bitsPerByte pixelByte =
|
||
[ if testBit pixelByte i then 1 else 0 | i <- [bitsPerByte-1, bitsPerByte-2..0] ]
|
||
|
||
extractBitsFromPixel :: Int -> PixelRGB8 -> [Int]
|
||
extractBitsFromPixel bitsPerByte (PixelRGB8 r g b) =
|
||
let bitsR = extractBits bitsPerByte r
|
||
bitsG = extractBits bitsPerByte g
|
||
bitsB = extractBits bitsPerByte b
|
||
in bitsR ++ bitsG ++ bitsB
|
||
|
||
extractBitsFromImage :: Int -> Image PixelRGB8 -> [Int]
|
||
extractBitsFromImage bitsPerByte img =
|
||
let width = imageWidth img
|
||
height = imageHeight img
|
||
pixels = [ pixelAt img x y | y <- [0..height - 1], x <- [0..width - 1] ]
|
||
in concatMap (extractBitsFromPixel bitsPerByte) pixels
|
||
|
||
extractShift :: String -> Maybe Int
|
||
extractShift path =
|
||
let shift = takeWhile (`elem` ['0'..'9']) (reverse $ takeWhile (/= '_') (reverse path))
|
||
in readMaybe shift
|
||
\end{lstlisting}
|
||
|
||
|
||
\newpage
|
||
\section {Результаты работы программы}
|
||
При успешном завершении программа создаёт четыре файла: файл изображения с закодированных текстом, текстовый файл с закодированным текстом, текстовый файл с алфавитом и текстовый файл с декодированным текстом.
|
||
|
||
\begin{figure}[h]
|
||
\centering
|
||
\includegraphics[width=0.65\linewidth]{img/results.png}
|
||
\caption{Результаты работы программы в консоли.}
|
||
\label{fig:results}
|
||
\end{figure}
|
||
|
||
На Рис.~\ref{fig:results} представлены результаты работы программы в консоли.
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_1_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (1 бит).}
|
||
\label{fig:david1}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_2_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (2 бит).}
|
||
\label{fig:david2}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_3_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (3 бит).}
|
||
\label{fig:david3}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_4_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (4 бит).}
|
||
\label{fig:david4}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_5_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (5 бит).}
|
||
\label{fig:david5}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_6_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (6 бит).}
|
||
\label{fig:david6}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_7_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (7 бит).}
|
||
\label{fig:david7}
|
||
\end{figure}
|
||
|
||
\begin{figure}[h!]
|
||
\centering
|
||
\includegraphics[width=0.33\linewidth]{img/david_8_20.jpg}
|
||
\caption{Изображение с зашифрованными данными (8 бит).}
|
||
\label{fig:david8}
|
||
\end{figure}
|
||
|
||
\newpage
|
||
\phantom{text}
|
||
\newpage
|
||
\phantom{text}
|
||
\newpage
|
||
На Рис.~\ref{fig:david1}-\ref{fig:david8} представлены результирующие изображения с разным количеством бит, отведённых под зашифрованные данные.
|
||
|
||
|
||
\newpage
|
||
\section*{Заключение}
|
||
\addcontentsline{toc}{section}{Заключение}
|
||
В результате выполнения лабораторной работы была создана программа на языке Haskell, которая способна кодировать текстовые данных из указанного файла с помощью шифра Цезаря и сохранять эти данные внутрь изображения. Причём программа позволяет выбрать как смещение для шифра Цезаря, так и количество бит, которое будет использовано в каждом байте изображения для хранения данных.
|
||
|
||
|
||
\newpage
|
||
\section*{Список литературы}
|
||
\addcontentsline{toc}{section}{Список литературы}
|
||
|
||
\vspace{-1.5cm}
|
||
\begin{thebibliography}{0}
|
||
\bibitem{caesar}
|
||
Luciano, D., Prichett, G., Cryptology: From Caesar Ciphers to Public-Key Cryptosystems, The College Mathematics Journal, 1987.
|
||
\bibitem{david}
|
||
David Deutsch -- personal website, URL: \url{https://www.daviddeutsch.org.uk/}, Дата обращения: 19.11.2024
|
||
\bibitem{convertio}
|
||
Convertio -- BPM to JPG online converter, URL: \url{https://convertio.co/ru/bmp-jpg/}, Дата обращения: 19.11.2024
|
||
\bibitem{JuicyPixels}
|
||
Hackage -- JuicyPixels: Picture loading/serialization, URL: \url{https://hackage.haskell.org/package/JuicyPixels}, Дата обращения: 19.11.2024
|
||
\end{thebibliography}
|
||
\end{document} |