7 Commits

7 changed files with 72 additions and 7 deletions

View File

@@ -22,6 +22,8 @@ main = do
let sourceTextPath = "resources/biography.txt"
let sourceImagePath = "resources/david.bmp"
let alphabetPath = "tmp/alphabet.txt"
let encryptedTextPath = "tmp/biography_encrypted.txt"
let encodedImagePath = "tmp/david_" ++ show bitsPerByte ++ "_" ++ show caesarShift ++ ".bmp"
let decodedTextPath = "tmp/biography.txt"
@@ -32,8 +34,12 @@ main = do
putStrLn "\nШифрование текста"
let alphabet = createAlphabetFromText inputText
putStrLn $ "Размер алфавита: " ++ show (length alphabet)
writeFile alphabetPath alphabet
putStrLn $ "Алфавит сохранён в файл \"" ++ alphabetPath ++ "\""
let encryptedText = encryptCaesar alphabet caesarShift inputText
putStrLn $ "10 символов шифра: \"" ++ take 10 encryptedText ++ "\""
writeFile encryptedTextPath encryptedText
putStrLn $ "Зашифрованный текст сохранён в файл \"" ++ encryptedTextPath ++ "\""
let encryptedTextBits = textToBits encryptedText
putStrLn $ "10 битов шифра: \"" ++ show (take 10 $ VU.toList encryptedTextBits) ++ "\""
@@ -52,6 +58,8 @@ main = do
saveBmpImage encodedImagePath (ImageRGB8 resultImage)
putStrLn $ "Изображение сохранено по пути: \"" ++ encodedImagePath ++ "\""
putStrLn $ "\nЧтение алфавита из файла \"" ++ alphabetPath ++ "\""
alphabetFromFile <- readFile alphabetPath
putStrLn "\nДекодирование текста из изображения"
case extractShift encodedImagePath of
@@ -67,7 +75,7 @@ main = do
putStrLn $ "10 битов шифра: \"" ++ show (take 10 $ VU.toList bits) ++ "\""
let encryptedTextFromImage = takeWhile (/= '\NUL') (bitsToText bits)
putStrLn $ "10 символов шифра: \"" ++ take 10 encryptedTextFromImage ++ "\""
let decryptedText = decryptCaesar alphabet extractedCaesarShift encryptedTextFromImage
let decryptedText = decryptCaesar alphabetFromFile extractedCaesarShift encryptedTextFromImage
putStrLn $ "10 символов текста: \"" ++ take 10 decryptedText ++ "\""
writeFile decodedTextPath decryptedText
putStrLn $ "Текст сохранён по пути: \"" ++ decodedTextPath ++ "\""

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -210,7 +210,7 @@
\subsection{Кодирование и декодирование текста с помощью шифра Цезаря}
Код функций для кодирования и декодирования текста с помощью шифра Цезаря представлен в листинге~\ref{lst:encrypt-caesar}. Функция \texttt{encryptCaesar} принимает алфавит в виде списка символов, смещение и сам текст, а возвращает зашифрованный текст. В её коде используется вспомогательная функция \texttt{indexOf}. Функция принимает список и элемент списка, а возвращает индекс этого элемента. Для создания алфавита используется функция \texttt{createAlphabetFromText}. Она принимает текст, а возвращает алфавит, который в нём используется, в виде списка символов. Для декодирования текста используется функция \texttt{decryptCaesar}, которая, по-сути, является лишь обёрткой над функцией \texttt{encryptCaesar}, так как процесс кодирования осуществляется почти так же как и декодирования. Функция \texttt{decryptCaesar} принимает на вход алфавит, смещение и закодированный текст, а возвращает декодированный текст.
Код функций для кодирования и декодирования текста с помощью шифра Цезаря представлен в листинге~\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
@@ -239,6 +239,31 @@ decryptCaesar alphabet shift =
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{Представление текста в виде последовательности бит}
@@ -339,7 +364,7 @@ extractShift path =
\newpage
\section {Результаты работы программы}
При успешном завершении программа создаёт два файла: файл изображения с закодированных текстом и текстовый файл с декодированным текстом.
При успешном завершении программа создаёт четыре файла: файл изображения с закодированных текстом, текстовый файл с закодированным текстом, текстовый файл с алфавитом и текстовый файл с декодированным текстом.
\begin{figure}[h]
\centering
@@ -352,32 +377,64 @@ extractShift path =
\begin{figure}[h!]
\centering
\includegraphics[width=0.3\linewidth]{img/david_1_20.jpg}
\includegraphics[width=0.33\linewidth]{img/david_1_20.jpg}
\caption{Изображение с зашифрованными данными (1 бит).}
\label{fig:david1}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=0.3\linewidth]{img/david_4_20.jpg}
\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.3\linewidth]{img/david_7_20.jpg}
\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.3\linewidth]{img/david_8_20.jpg}
\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} представлены результирующие изображения с разным количеством бит, отведённых под зашифрованные данные.