Сокрытие и извлечение информации в текстовых файлах
Download 232.43 Kb.
|
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 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 { 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 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: |
ma'muriyatiga murojaat qiling