Сокрытие и извлечение информации в текстовых файлах


Download 232.43 Kb.
bet7/7
Sana24.12.2022
Hajmi232.43 Kb.
#1065007
TuriКурсовая
1   2   3   4   5   6   7
Bog'liq
KursRabota, Лебедева

Приложение
Листинг программы txt_example.py
from stegapy.stegatxt import encode_text, decode_text
import os
def main():
text_file = "to_encode.txt"
encode_text(text_file, "letters_source.txt", "encoded.txt")
print("Encoded text")
to_read = os.stat(text_file).st_size
decode_text("encoded.txt", "decoded.txt", to_read)
print("Decoded text")
if __name__ == "__main__":
main()

Листинг программы stegatxt.py


import os

rus_letters = "КАМОНВЕРХСТорухаес"


eng_letters = "KAMOHBEPXCTopyxaec"
def encode_text(source_txt_name, container_txt_name, output_txt_name):
"""
Эта функция принимает символы из файла container_txt_name и разбивает его на биты.
Затем он ищет букву, которая выглядит одинаково в русском и английском алфавитах
в текстовом файле source_txt_name. Если текущий бит равен 1 - он заменяет букву eng на rus и
записывает ее в текстовый файл output_txt_name. В противном случае он просто помещает туда символ eng.
Если буква не похожа на английскую, она также просто записывается в файл output_txt_name.

:параметр source_txt_name: имя текстового файла, содержащего информацию, подлежащую кодированию


:параметр container_txt_name: имя текстового файла, содержащего текст, который будет скрывать информацию
:параметр output_txt_name: имя текстового файла, содержащего закодированные данные
:return: True, если функция завершается успешно, иначе False
"""
#открываем файл с обычным текстом в формате 'r' (только чтение)
source_txt = open(source_txt_name, 'r')
#открываем зашифрованный файл в формате 'r' (только чтение)
container_txt = open(container_txt_name, 'r')
#записываем результат в формате 'w' (только запись)
output_txt = open(output_txt_name, 'w')
#для считывании буквы
letter_to_encode = 0
#счетчик - кол-во уже закодированных бит
#восемь, чтобы мы зашли на первом шаге цикла во 2 и 3 if
encoded_bits = 8
#запускаем бесконечный цикл
while True:
#в нем считываем один символ из зашифрованного файла
symbol_from_text = container_txt.read(1)
#делаем стандартную проверку
#этот символ завершает наш файл, т. е. в последнем файле выходим
#из бесконечного цикла
if not symbol_from_text:
break
#если этот символ не последний
#мы проверяем лежит ли он в массиве английских букв
#котрые выглядят также как и русские буквы
if symbol_from_text in eng_letters:
#если кол-во закодированных бит равно 8
if encoded_bits == 8:
#считываем новые буквы для кодирования
letter_to_encode = source_txt.read(1)
#проверяем если это конец файла, который нужно зашифровать,
#то выходим из цикла
if not letter_to_encode:
#записываем символ в файл-результат
output_txt.write(symbol_from_text)
#закрываем файлы, иначе произойдет ошибка
source_txt.close()
container_txt.close()
output_txt.close()

return True


#перевод буквы в номер порядка ASCII
#тем самым присвоили десятичное значение
"""print("To encode (0) = (1:b) = (1)".format(letter_to_encode,
ord(letter_to_encode)))
"""
letter_to_encode = ord(letter_to_encode)
#обнуляем счетчик, тем самым заново кодируем символ
encoded_bits = 0
#получим бит из этой буквы
#нужен самый первый бит
#чтобы получить старший бит с одного байта
#должны применить операцию логического И (&)
#на константы 10000000
#как только мы считатали старший бит
#исходный байт нужно сдвинуть влево на 7 единиц
#чтобы следующий бит встал на позицию старшего бита
#получаем бит из буквы
bit_from_letter = (letter_to_encode & 0b10000000) >> 7
#print("Read (0), bit (1)".format(symbol_from_text,bit_from_letter))
#делаем проверку
#если bit_from_letter не ноль, т. е. единица
#означает, что нужно букву из текста (symbol_from_text)
#поменять на противоположный в русском алфавите
#если bit_from_letter единица
#то нужно найти в английском алфавите ту букву которую меняем
#и поставить на ее место такую же букву из русского алфавита
if bit_from_letter:
#символ из текста - русский алфавит от идекса буквы в
#английском алфавите, т.е. заменяем на похожую
symbol_from_text = rus_letters[eng_letters.index(symbol_from_text)]
#сдвигаем влево на единицу букву которую кодируем
letter_to_encode <<= 1
#чтобы избавится от впереди стоящего ненужного бита
#берем остаток от 256
#это гарантия, что число будет состоять из 8 бит
#9й бит отсечется
letter_to_encode %= 256
#кол-во закодированных бит увеличиваем на единицу
encoded_bits += 1
#в файл, в который записываем закодированную инфу,
#записываем символ из текста
#либо запишится обычный символ
#либо обычные символ, если bit_from_letter нулевой
#либо замененный русский символ, если bit_from_letter единица
output_txt.write(symbol_from_text)

output_txt.write(source_txt.read())


#закрываем файлы, иначе произойдет ошибка
source_txt.close()
container_txt.close()
output_txt.close()

return True


def decode_text(encoded_txt_name, decoded_txt_name, symbols_to_read):
"""
Эта функция пытается декодировать символы symbols_to_read из текстового файла encoded_txt_name.
Он ищет буквы, которые выглядят одинаково в русском и английском алфавитах.
Если символ английский, он возвращает 0 бит, в противном случае - 1. После этого 8 бит соединяются с 1 байтом
и записываются в текстовый файл decoded_txt_name.

:параметр encoded_txt_name: имя текстового файла, содержащего закодированные данные


:параметр decoded_txt_name: имя текстового файла, содержащего декодированные данные
:параметр symbols_to_read: количество закодированных символов в encoded_txt_name
:return: True, если функция завершается успешно, иначе False
"""
#открываем зашифрованный файл в формате 'r' (только чтение)
encoded_txt = open(encoded_txt_name, 'r')
#открываем файл, в который будем записывать в формате 'w' (только запись)
decoded_txt = open(decoded_txt_name, 'w', encoding='utf-8')#, encoding='utf-8'
#кол-во прочитанных символов
read = 0
#сколько было прочитано битов
bits_read = 0
#куда будем записывать биты
byte = 0
#пока кол-во символов меньше кол-ва символов, которые нужно прочитать
while read < symbols_to_read:
#в цикле считываем один символ из зашифрованного файла
symbol = encoded_txt.read(1)
#этот символ завершает наш файл, т. е. в последнем файле
#выходим из цикла
if not symbol:
#закрываем файлы
encoded_txt.close()
decoded_txt.close()

return True


#если символ в английских буквах
#то мы читаем английский текст
if symbol in eng_letters:
#байт сдвигаем влево на единицу
byte <<= 1
#кол-во прочитанных бит увеличиваем на единицу
bits_read += 1
#print("Symbol (0), bit 0, byte (1:b)".format(symbol,byte))
#если символ в русских буквах
#то мы читаем русский текст
elif symbol in rus_letters:
#байт сдвигаем влево на единицу
byte <<= 1
#байт на последней ячейке записываем единицу
byte |= 1
#кол-во прочитанных бит увеличиваем на единицу
bits_read += 1
#print("Symbol (0), bit 1, byte (1:b)".format(symbol,byte))
#делаем проверку
#если было прочитано 8 бит
if bits_read == 8:
print("(0), (0:b), (0:c)".format(byte))
#получили десятичное значение в таблице ascii
decoded_txt.write(chr(byte))
#кол-во прочитанных символов увеличиваем на единицу
read += 1
#обнуляем значения
bits_read = byte = 0
#
if chr(byte) == '\n' and len(os.linesep) == 2:
read += 1
#print(source_txt)#сообщение
#закрываем файлы
encoded_txt.close()
decoded_txt.close()

return True


Листинг программы Steg_txt.sln


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Steg_text


{
class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader("letters_source.txt");
//Console.WriteLine("Введите слово:");
StreamReader reader__to_encode = new StreamReader("to_encode.txt");
var word = reader__to_encode.ReadToEnd(); /*Console.ReadLine()*/;
Console.WriteLine("Исходное слово:"+word);
byte[] wordBytes = Encoding.UTF8.GetBytes(word); // Преобразование слова в массив байтов
foreach (byte _b in wordBytes)
Convert.ToString(_b, 2).PadLeft(8, '0');//возвращение строки длины 8, в которой начало текущей строки
//заполняется пробелами или указанным знаком Юникода.
//Console.WriteLine
List srWords = sr.ReadToEnd().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();

var textWithWord = Encoded(srWords, wordBytes);//кодирование


StreamWriter writer_encoded = new StreamWriter("encoded.txt", false, Encoding.UTF8);
writer_encoded.Write(textWithWord);
writer_encoded.Close();

//Console.WriteLine();


foreach (byte _b in wordBytes)
Convert.ToString(_b, 2).PadLeft(8, '0');//возвращение строки длины 8, в которой начало текущей строки
//заполняется пробелами или указанным знаком Юникода.
//Console.WriteLine
//Console.WriteLine();

var hiddenWord = Decoded(textWithWord);//декодирование


//StreamWriter writer_decoded = new StreamWriter("decoded.txt", false, Encoding.UTF8);


//textWithWord = textWithWord.Replace(" "," ");
//textWithWord = textWithWord.Replace(" ", " ");
//writer_decoded.Write(textWithWord);
//writer_decoded.Close();

StreamWriter writer_to_encode = new StreamWriter("decoded.txt", false, Encoding.UTF8);


writer_to_encode.Write(hiddenWord);
writer_to_encode.Close();

Console.WriteLine("Исходное слово после шифрования:" + hiddenWord);


}
static string Encoded(List text, byte[] wordBytes)
{
string ret = text[0]; // Выходное значение - записываем первое слово
if (ret.Length == 0)
{
Console.WriteLine("Контейнер пустой");
}
text.RemoveAt(0); // Удаляем первое слово
foreach (byte _wB in wordBytes) // Цикл по байтам
{
byte wB = _wB;
for (int i = 0; i < 8; i++) // Цикл по битам
{
Convert.ToString(wB, 2).PadLeft(8, '0');//возвращение строки длины 8, в которой начало текущей строки
//заполняется пробелами или указанным знаком Юникода.
//Console.WriteLine
if ((wB & 0b1) == 0) // Проверяем младший бит
ret += " "; // Если 0 - записываем 1 пробел
else
ret += " "; // Если 1 - 2 пробела
ret += text[0]; // Добавляем следующее слово
text.RemoveAt(0); // Удаляем это слово
wB = (byte)(wB >> 1); // Сдвигаем биты байта
}
}
//ret += " "; // записываем 3 пробела, когда байты закончились
//ret += string.Join(" ", text); // Добавляем оставшиеся слова исходного списка
return ret;
}

static string Decoded(string codedText)


{
List wordB = new List(); // Подготовка списка для байтов слова
byte wB = 0; // Для накопления битов
int ind = 0; // индекс символов
int indB = 0; // индекс битов
while (ind < codedText.Length) // Цикл по символам входной строки
{
if (codedText[ind] == ' ') // Проверка на пробел
{
if (codedText[ind + 1] != ' ') // Проверка на одинарный пробел
{
indB++; // Если пробел одиночный - это бит нулевой
}
else if (codedText[ind + 2] != ' ') // Проверка на двойной пробел
{
wB = (byte)(wB | 0b1000_0000); // Запись 1 в старший бит
indB++; ind++;
}
else
{

break; // Выход из цикла, если тройной пробел


}
Convert.ToString(wB, 2).PadLeft(8, '0');//возвращение строки длины 8, в которой начало текущей строки
//заполняется пробелами или указанным знаком Юникода.
//Console.WriteLine
if (indB == 8) // Проверка накопленных битов
{
wordB.Add(wB); // Если накоплен байт - его запись
wB = 0;
indB = 0;
}
wB = (byte)(wB >> 1);
}
ind++;
}
string word = Encoding.UTF8.GetString(wordB.ToArray());
return word;
}
}
}

Download 232.43 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling