Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 241; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.11 (0.008 с.) |