Извлечение ключа из имени файла

This commit is contained in:
2024-11-19 14:32:34 +03:00
parent 01003c1ee0
commit 19b8202fa8
2 changed files with 27 additions and 15 deletions

View File

@@ -16,7 +16,7 @@ sourceTextPath = "resources/biography.txt"
sourceImagePath :: String
sourceImagePath = "resources/david.bmp"
encodedImagePath :: String
encodedImagePath = "tmp/david.bmp"
encodedImagePath = "tmp/david_" ++ show caesarShift ++ ".bmp"
decodedTextPath :: String
decodedTextPath = "tmp/biography.txt"
@@ -51,16 +51,22 @@ main = do
putStrLn "\nДекодирование текста из изображения"
readEncodedImageResult <- readImage encodedImagePath
case readEncodedImageResult of
Left err -> putStrLn $ "Ошибка при чтении изображения: " ++ err
Right dynImg -> do
let img = convertRGB8 dynImg
let bits = VU.fromList $ extractBitsFromImage bitsPerByte img
putStrLn $ "10 битов шифра: \"" ++ show (take 10 $ VU.toList bits) ++ "\""
let encryptedTextFromImage = takeWhile (/= '\NUL') (bitsToText bits)
putStrLn $ "10 символов шифра: \"" ++ take 10 encryptedTextFromImage ++ "\""
let decryptedText = decryptCaesar alphabet caesarShift encryptedTextFromImage
putStrLn $ "10 символов текста: \"" ++ take 10 decryptedText ++ "\""
writeFile decodedTextPath decryptedText
putStrLn $ "Текст сохранён по пути: \"" ++ decodedTextPath ++ "\""
case extractShift encodedImagePath of
Just extractedCaesarShift -> do
putStrLn $ "Из названия файла извлечён ключ: " ++ show extractedCaesarShift
readEncodedImageResult <- readImage encodedImagePath
case readEncodedImageResult of
Left err -> putStrLn $ "Ошибка при чтении изображения: " ++ err
Right dynImg -> do
let img = convertRGB8 dynImg
let bits = VU.fromList $ extractBitsFromImage bitsPerByte img
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
putStrLn $ "10 символов текста: \"" ++ take 10 decryptedText ++ "\""
writeFile decodedTextPath decryptedText
putStrLn $ "Текст сохранён по пути: \"" ++ decodedTextPath ++ "\""
Nothing -> putStrLn "Не удалось извлечь ключ."

View File

@@ -11,6 +11,7 @@ module Lib
import Codec.Picture
import Text.Read (readMaybe)
import Data.Word (Word8)
import Data.Char (ord, chr)
import Data.Bits (testBit, shiftL, complement, (.|.), (.&.))
@@ -112,4 +113,9 @@ 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
in concatMap (extractBitsFromPixel bitsPerByte) pixels
extractShift :: String -> Maybe Int
extractShift path =
let prefix = takeWhile (`elem` ['0'..'9']) (reverse $ takeWhile (/= '_') (reverse path))
in readMaybe (reverse prefix)