Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Внедрение хэш-образа пароля в код программыСодержание книги
Поиск на нашем сайте
Данный способ предполагает создание вспомогательной программной утилиты, предназначенной для вычисления хэш-образа для строки, вводимой пользователем. Так или иначе, но хэш-образ пароля определяется до момента компиляции программы. #define A 54059 /* a prime */#define B 76963 /* another prime */#define C 86969 /* yet another prime */#define FIRSTH 37 /* also prime */// функция возвращает целочисленный хэш-образ строки, полученной// в качестве параметра вызова.unsigned hash_str(const char* s){ unsigned h = FIRSTH; while (*s) { // цикл выполняется пока не достигнут конец строки h = (h * A) ^ (s[0] * B); s++; // изменяется значение указателя, а не содержимое строки } return h; // возвращается сформированный образ, or return h % C;}
Кроме того, стандартная библиотека языка С ++, тоже предоставляет разработчику уже готовые хэш-функции, объявленные в библиотеке < functional >. Рассмотрим следующий пример: #include <iostream>#include <string>#include <functional> int main() { std::string s = "Stand back! I've got jimmies!"; std::hash<std::string> hash_fn; size_t hash = hash_fn(s); std::cout << hash << '\n';}
Создайте программу, позволяющую вычислять хэш-образ строки пароля. Внедрите сгенерированный образ в защищаемую программу.
Управляющие E sc последовательности Просто о сложном… Терминал в UNIX/Linux -совместимых системах имеет низкоуровневый механизм для управления стандартным потоком вывода (STDOUT). Данный механизм основан на использовании управляющих ESC последовательностей (управляющие символы ANSI – ANSI escape code), передаваемых программой в STDOU T и приводящих к изменению в работе самого потока. Esc -последовательность начинается с управляющего символа обратный слэш – '\'. Ранее мы уже использовали некоторые E sc -последовательности, такие, как '\n', '\t'. Однако, система поддерживает механизм управления состоянием бит атрибут символов, выводимых на терминал. Рассмотрим следующий пример.
#include <iostream> int main() { std::cout<<"\x1B[2J"; std::cout<<"\x1B[31mHello\x1B[0m"<<std::endl; std::cout<<"\x1B[34;46mProgramming\x1B[0m"<<std::endl; std::cout<<"\x1B[43m\x1B[31mHello\x1B[0m\x1B[0m"<<std::endl; return 0; } В стандартный поток передаются строки, содержащие несколько Esc –последовательностей. Рассмотрим, из чего они состоя. В начале каждой строки размещена Esc-последовательность, состоящая из символов '\x1B'. Если вы переведете 16-ричное значение x1B в 10-чный формат, то получите 27 – ASCI -код клавиши Esc. Именно по наличию данных символов терминал распознает управляющие последовательности. Затем идут символы, определяющие команду управления. В приведенном примере первая команда 2J заставляет терминал очистить экран, сохраняя текущее положение курсора. Данную команду терминалу можно передать и посредством программы echo, поддерживаемой большинством программных оболочек. Например, введите в строке приглашения консоли следующую команду (MS Windows не поддерживает данный механизм управления):
>> echo –e "\x1B[2J"
Экран будет очищен, а строка приглашения будет сформирована ниже позиции ранее осуществленного ввода. Поддерживается несколько способов для задания Esc -последовательности, определяя начальные символы следующим образом: \x1B, \033, \e. Все три способа задания Esc -последовательности эквивалентны. Формат для большинства Esc -последовательностей:
\ESC[ <символ(-ы) режима>n1;n2…[<Замыкающий(-ие) символ(-ы)> буква
Данный формат позволяет передать в одной строке несколько управляющих команд. Так в приведенном примере в строке "\x1B[34;46mProgramming\x1B[0m" присутствуют две команды 34 – установить синий цвет символов, и 46 – установить голубой цвет фона. Эти команды влияют на свойство выводимого текста. Замечание: изменяя стандартные настройки терминала не забывайте явным образам возвращать их в значения, заданные по умолчанию, для этого используется команда '\x1B[0m'. Две следующий команды, вводимые в консоли, продемонстрируют вам данное свойство терминала:
>> echo –e "\x1B[1mHello" >> echo –e "\x1B[0mBye-bye."
Для работы в данном разделе вам потребуются следующие группы простых Esc -последовательностей: ∙ очистка экрана; ∙ управление атрибутами отображения символов; ∙ перемещение курсора по экрану терминала; ∙ скроллинг – прокрутка содержимого экрана.
Поддерживаются следующие команды для очистки экрана: \x1B[0J – очистить от курсора до конца экрана; \x1B[1J – очистить экран от начала, до позиции курсора; \x1B[2J – очистить весь экран; \x1B[0K – от курсора до конца строки; \x1B[1K – очистить от начала строки до позиции курсора; \x1B[2K – очистить всю строку.
Таким образом, использую Esc -последовательности, можно создать собственные макроопределения, позволяющие, например, очищать окно терминала:
#define clrscr1() printf("\e[2J") #define clrscr2() std::cout<<"\033[2J"
Управление атрибутами выводимых символов (часть команд): 0 – сбросить все атрибуты в их значения по умолчанию; 1 – установить жирный шрифт; 2 – установить более яркий (имитированное цветом на цветном дисплее); 4 – установить подчеркивание; 5 – включить мерцание; 7 – включить режим инвертированного видео; 21 – включить режим нормальной интенсивности; 22 – выключить режим нормальной интенсивности; 24 – выключить подчеркивание; 25 – выключить мерцание; 27 – выключить инвертированное видео; 30 – установить черный цвет символов; 31 – установить красный цвет символов; 32 – установить зеленый цвет символов; 33 – установить коричневый цвет символов; 34 – установить синий цвет символов; 35 – установить сиреневый цвет символов; 36 – установить голубой цвет символов; 37 – установить белый цвет символов; 38 – включить подчеркивание, установить цвет символов по умолчанию; 39 – выключить подчеркивание, установить цвет символов по умолчанию; 40 – установить черный цвет фона; 41 – установить красный цвет фона; 42 – установить зеленый цвет фона; 43 – установить коричневый цвет фона; 44 – установить синий цвет фона; 45 – установить сиреневый цвет фона; 46 – установить голубой цвет фона; 47 – установить белый цвет фона; 49 – установить цвет фона по умолчанию.
Использование механизма макроопределений позволяет сформировать собственную библиотеку для управления атрибутами выводимых на экран символов. Следующий пример включает в себя два файла: заголовочный файл и главный файл проекта. Сборка проекта осуществляется компиляцией главного файла. Дополнительного управления процессом линковки не требуется, так как используется именно статический механизм включения библиотечного файла.
# filename: colors.h #ifndef __COLORS__ #define __COLORS__ /* Foregrond */ #define RST "\x1B[0m" #define KRED "\x1B[31m" #define KGRN "\x1B[32m" #define KYEL "\x1B[33m" #define KBLU "\x1B[34m" #define KMAG "\x1B[35m" #define KCYN "\x1B[36m" #define KWHT "\x1B[37m"
#define FRED(x) KRED x RST #define FGRN(x) KGRN x RST #define FYEL(x) KYEL x RST #define FBLU(x) KBLU x RST #define FMAG(x) KMAG x RST #define FCYN(x) KCYN x RST #define FWHT(x) KWHT x RST
#define BOLD(x) "\x1B[1m" x RST #define UNDL(x) "\x1B[4m" x RST
#endif /* __COLORS__ */ # END of file -----------------
# filename: color_testing_01.cpp #include <iostream> #include "colors.h" int main() { std::cout<<FGRN("I`m green.")<<std::endl; std::cout<<BOLD(FRED("I`m red-bold"))<<std::endl; return 0; } # END of file -----------------
Можно сформировать набор константных строк, содержащих необходимые управляющие кодовые последовательности. Можно вставлять такие определения непосредственно в файл проекта, либо оформить их в виде отдельного заголовочного файла.
# filename: color_testing_01.cpp #include <iostream> #include <string> // constant strings - константные строки const std::string red("\x1B[0;31m"); const std::string green("\x1B[1;32m"); const std::string yellow("\x1B[1;33m"); const std::string cyan("\x1B[0;36m"); const std::string magenta("\x1B[0;35m"); const std::string reset("\x1B[0m");
int main() { std::cout << red << "Hello" <<reset << yellow << " World" << reset << std::endl; return 0; } # END of file -----------------
Управление перемещением курсора по экрану консоли: \x1B[nA – перемещение курсора вверх на n строк; \x1B[nB или \x1B[ne – перемещение курсора вниз на n строк; \x1B[nC или \x1B [na – перемещение курсора вправо на n позиций; \x1B[nD – перемещение курсора влево на n позиций; \x1B[nE – перемещение курсора в начало строки и на n строк вниз; \x1B[nF – перемещение курсора в начало строки и на n строк вверх; \x1B[n1;n2f или \x1B[n1;n2H – перемещение курсора переместить в позицию n 1 и строку n 2; \x1B[nZ – перемещение курсора на n табуляций назад (как Tab, но в обратную сторону); \x1B[n – перемещение курсора в той же строке в позицию n; \x1B[nd – перемещение курсора в той же позиции в строку n; \x1BM – перемещение курсора сдвинуть курсор на строчку вверх, если он был в самой верхней строке, то сдвинуть содержимое экрана на строчку вниз (то же самое, что делает NewLine, только "вверх ногами").
Скроллинг: \x1B[nL– вставить n пустых строк (те, что были - раздвинуть); \x1B[nM – удалить n строк (те, что остались - "схлопнуть"); \x1B[nP – удалить n знаков в строке (те, что остались - "схлопнуть"); \x1B[n@ – вставить n знаков в строку (те, что были - раздвинуть); \x1B[nS – "прокрутить" содержимое экрана на n строк вверх; \x1B[nT – "прокрутить" содержимое экрана на n строк вниз.
Замечание: здесь приведены далеко не все возможности управления символьным выводом в консоли. Дополнительную информацию вы можете найти в соответствующих справочных руководствах.
ЛАБОРАТОРНАЯ РАБОТА №1 Задания для самостоятельной работы
|
||||
Последнее изменение этой страницы: 2021-06-14; просмотров: 177; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.242.223 (0.007 с.) |