Шифрование пароля в Excel
Сегодня мы с вами будем заниматься шифрованием в Excel, в частности шифрованием паролей. Если в прошлый раз, мы просто генерировали пароль заданной длины и сложности при помощи встроенного генератора случайных чисел, и получали каждый раз разный пароль, то сегодня мы будем рассматривать пример, в котором при вводе исходного текста и ключевого слова будет всегда получаться одна и та же последовательность символов. Пароль можно сделать достаточно длинным и сложным, и использовать в повседневной практике. Нужно будет лишь помнить исходный текст и ключ, что согласитесь, запомнить гораздо проще, чем длинную последовательность ничего не значащих символов.
Поскольку, наша разработка не будет использоваться в военных целях, мы можем использовать относительно простой алгоритм шифрования — шифр Виженера. Для наших целей этого будет вполне достаточно. Напомню, что наша основная цель – это изучение возможностей программы Excel, в том числе на подобных комплексных примерах.
Шифр Виженера достаточно прост для понимания и основывается на шифре Цезаря. Напомню, что в шифре Цезаря зашифрованное сообщение получается путем сдвига алфавита на какое-то заданное число. Например, если это число 5, то буква А становиться буквой Д, буква Б становиться буквой Е и т.д. Это один из самых простых алгоритмов шифрования.
Шифр Виженера состоит в последовательном применении нескольких шифров Цезаря, с различными сдвигами, определяемыми ключевым словом. Так если, ключевое слово «ЗАРЯ», то последовательность сдвигов будет следующая «9; 1; 18; 33» т.е. соответствующая порядковым номерам букв ключевого слова в алфавите. Эта последовательность сдвигов применяется к исходному тексту: первый символ смещается на 9 знаков, второй символ исходного текста – на 1 знак, третий – на 18, четвертый – на 33, пятый – снова на 9 и т.д. по кругу. Это уже более сложный алгоритм шифрования, вполне нам подходящий.
После краткого экскурса в криптографию приступим к созданию нашей шифровальной системы в Excel.
По сути дела, нам надо будет укрупненно решить следующие задачи:
Во-первых, обеспечить необходимую длину пароля независимо от исходного текста. В нашем случае пусть это будет 8 и 16 символов.
Во-вторых, получить последовательность символов с учетом сдвигов по ключевому слову соответствующую русским буквам алфавита;
В-третьих, перевести русские буквы алфавита в символы соответствующие латинским буквам, цифрам и специальным знакам;
Применительно к первой задаче, необходимо иметь ввиду главное отличие нашего примера от полноценных шифровальных систем: мы будем шифровать пароль только в одну сторону. Это сильно упрощает задачу. По сути дела, мы можем «обрезать» исходный текст в соответствии с нашей длиной пароля. Однако, в случае, если исходный текст короче максимальной длины нашего пароля (короче 16 символов), то нам все же будет необходимо «дорастить» его до требуемого количества знаков.
При разработке примера мы будем прибегать к средствам программирования, а постараемся решить задачу лишь стандартными встроенными функциями Excel.
Основой нашей разработки, как вы уже догадались, будут являться текстовые функции Excel.
Изначально у нас будет иметься два поля для ввода исходного текста, и ключевого слова.
Для удобства, присвоим имена «пароль» и «ключ» ячейкам, в которые будем вводить соответствующие данные.
Данные у нас вводятся в виде текста, и наша первая задача, отделить каждый символ (букву) друг от друга и поместить в отдельных ячейках.
Для этого мы будем использовать функцию ПСТР, возвращающую заданное число знаков из текстовой строки, начиная с указанной позиции и имеющую следующий синтаксис:
=ПСТР(текст; начальная_позиция; количество_знаков)
Где:
текст – исходный текст. В нашем случае это будет текст из ячеек с именами «пароль» и «ключ»;
начальная_позиция – порядковый номер символа в текстовой строке, начиная с которого будет возвращаться заданное количество знаков. В нашем случае – это будет ссылка на ячейку, содержащую порядковый номер символа, один из 16 номеров.
количество_знаков – соответственно то количество знаков, которое нам надо получить. В нашем случае, поскольку мы будем «растаскивать» слово по буквам, то это будет 1.
Справа от ячеек, в которые будем вводить данные, у нас будет располагаться два диапазона по 16 ячеек расположенных в двух строках для «растаскивания» исходного пароля и ключа на одиночные символы (буквы). В нашем примере, это будет диапазон G6:V6 для растаскивания исходного пароля и G7:V7 для растаскивания ключа. Над этими диапазонами, в ячейках G5:V5 разместим порядковые номера символов от 1 до 16.
С учетом этого, формула для «растаскивания» будет выглядеть следующим образом:
Для исходного пароля =ПСТР(пароль;G5;1)
Для ключа =ПСТР(ключ;G5;1)
Это для выделения первых символов из исходного пароля и ключа (в примере G5=1).
Скопировав эти формулы построчно в каждую из 16 ячеек, мы в каждой ячейке получим по одному символу, из которых состоит исходный пароль и ключ.
Однако, мы наверняка столкнемся с такой ситуацией, когда исходный пароль или ключ состоит менее чем из 16 знаков. В нашем примере исходный пароль «глобус» имеет 6 знаков, а ключевое слово «заря» — 4 знака.
В этом случае, нам на помощь приходит функция ПОВТОР, повторяющая текст заданное число раз и имеющая следующий синтаксис:
=ПОВТОР(текст; число_повторений)
Где:
тест – текст, который необходимо повторить. В нашем случае это текст из ячеек с именами «пароль» и «ключ».
число_повторений – число повторений текста. В нашем случае мы должны рассчитать необходимое число повторений таким образом, чтобы гарантировано заполнить все 16 символов.
Можно было бы установить число повторений равным 16, что гарантировало бы результат, однако, мы поступим более изящно. Для определения необходимого количества повторов, мы используем функцию ДЛСТР, которая возвращает количество знаков в текстовой строке, и имеющая интуитивно понятный синтаксис:
=ДЛСТР(текст)
Применительно к исходному паролю функция ДЛСТР должна вернуть значение 6, а применительно ключу – значение 4.
Далее совсем просто. Делим 16 на значение возвращаемое функцией ДЛСТР и получаем необходимое число повторов.
16/ДЛСТР(пароль)=2,66666(6)
16/ДЛСТР(ключ)=4
Чтобы избежать дробных значений, используем функцию округления до ближайшего большего значения:
=ОКРУГЛВВЕРХ(число; число_разрядов).
Таким образом, объединив перечисленные выше функции, мы получаем формулу для растаскивания по символам и дублирования, т.е. заполнения каждой из 16 ячеек наших диапазонов для исходного пароля и ключа:
Для пароля =ПСТР(ПОВТОР(пароль;ОКРУГЛВВЕРХ(16/ДЛСТР(пароль);0));G5;1)
Для ключа: =ПСТР(ПОВТОР(ключ;ОКРУГЛВВЕРХ(16/ДЛСТР(ключ);0));G5;1)
На рисунке представлены результаты применения описанных выше формул.
Давайте теперь предусмотрим случай, если наш пароль будет состоять из двух слов с пробелом. Пробел плохо воспринимается функциями Excel, и мы заменим его на символ нижнего подчеркивания.
В этом нам поможет текстовая функция ПОДСТАВИТЬ, которая позволяет произвести замену старого текста на новый в текстовой строке, и имеющая синтаксис:
=ПОДСТАВИТЬ(текст; стар_текст; нов_текст; [(номер вхождения)])
Где:
текст – текстовая строка, в которой будет осуществляться замена. В нашем случае, это ячейки с именами «Пароль» и «Ключ»;
стар_текст – старый текст, который подлежит замене. В нашем случае это пробел (в формуле указывается в кавычках » «);
нов_текст – новый текст, которым будет заменен старый текст. В нашем случае это символ нижнего подчеркивания «_»;
[(номер вхождения)] – номер первого символа в текстовой строке, начиная с которого будет осуществляться замена старого текста новым. Можно не ставить ничего, тогда заменены будут все появления старого текста.
Функция замены пробела будет выглядеть следующим образом:
=ПОДСТАВИТЬ(пароль;» «;»_») для пароля и =ПОДСТАВИТЬ(ключ;» «;»_») для ключа.
С учетом этого, после того, как мы подставим эту формулу в нашу общую комбинацию, итоговая формула примет вид:
=ПСТР(ПОВТОР(ПОДСТАВИТЬ(пароль;» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(пароль);0));G5;1) для пароля и,
=ПСТР(ПОВТОР(ПОДСТАВИТЬ(ключ;» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(ключ);0));G5;1) для ключа.
Теперь, чтобы у нас совсем не было накладок, давайте исключим появление заглавных букв во фразах пароля и ключа.
Для этого мы можем воспользоваться функцией СТРОЧН, которая делает все буквы в текстовой строке строчными и имеет интуитивно понятный синтаксис:
=СТРОЧН(текст), где:
текст – текстовая строка, в которой необходимо провести замену заглавных букв строчными.
После подстановки, наша комбинация функций примет вид:
=ПСТР(ПОВТОР(ПОДСТАВИТЬ(СТРОЧН(пароль);» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(пароль);0));G5;1) для пароля и,
=ПСТР(ПОВТОР(ПОДСТАВИТЬ(СТРОЧН(ключ);» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(ключ);0));G5;1) для ключа.
Теперь переходим к решению второй задачи – переводу символов пароля и ключа в числовые значения, необходимые нам для последующей обработки.
Для перевода строчных букв русского алфавита в числовые значения, мы могли бы воспользоваться функцией КОДСИМВ(текст), возвращающую числовой код символа по таблице знаков ANSI.
Поскольку строчные буквы русского алфавита имеют код с 224 по 255 (32 буквы без «ё»), то получить порядковые номера букв лежащих в более привычном диапазоне от 1 до 33 (32), мы можем, отняв от кода символа число 223.
Формула будет иметь вид:
=КОДСИМВ(текст)-223;
Для пароля =КОДСИМВ(ПСТР(ПОВТОР(ПОДСТАВИТЬ(СТРОЧН(пароль);» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(пароль);0));G5;1))-223
Для ключа =КОДСИМВ(ПСТР(ПОВТОР(ПОДСТАВИТЬ(СТРОЧН(ключ);» «;»_»);ОКРУГЛВВЕРХ(16/ДЛСТР(ключ);0));G5;1))-223
Если не использовать в пароле и ключе пробелов и буквы «ё», коды символов которых не входят в наш основной диапазон, то этого вполне достаточно. Однако мы рассмотрим более расширенный вариант.
Для этого будем использовать функцию ПОИСКПОЗ, которая возвращает относительную позицию элемента в массиве, и имеющая синтксис:
=ПОИСКПОЗ(искомое_значение; просматриваемый_массив; [тип_сопоставления]),
Где:
искомое_значение – значение, которое мы будем искать в массиве. В нашем случае это буквы русского алфавита из фразы пароля и ключа;
просматриваемый_массив – массив со всеми значениями элементов, в котором будет осуществляться поиск. В нашем случае, мы создадим массив состоящий из всех букв русского алфавита и знака подчеркивания в диапазоне ячеек А1:А34. Присвоим данному диапазону имя «кирилица»;
тип_сопоставления – принимает значения 1-меньше, 0-точное совпадение, -1-больше. В нашем случае мы будем искать точное сопоставление.
С учетом того, что символы русского алфавита соответствующие паролю и ключу у нас находятся в диапазонах G6:V6 и G7:V7 соответственно, то формула для перевода букв в числа будет выглядеть следующим образом:
Для первого символа пароля =ПОИСКПОЗ(G6;кирилица;0) и =ПОИСКПОЗ(G7;кирилица;0) для ключа.
Результат можно посмотреть на рисунке.
Как видим, мы получили два ряда чисел, находящихся один под другим. Теперь, чтобы наш алгоритм шифрования начал работать, нам необходимо сложить эти числа попарно.
После того как мы получили ряд чисел, переходим к решению третьей задачи – переводу числовых значений в символы латинского алфавита, цифры и спецсимволы.
Для перевода будем использовать функцию ИНДЕКС которая возвращает значение элемента таблицы или массива, заданного номером строки и номером столбца.
=ИНДЕКС(массив; номер_строки; [номер столбца])
И созданную нами одномерную таблицу символов из одного столбца и количеством строк по числу используемых нами символов. Таблица символов будет состоять из строчных и заглавных латинских букв, чисел от 1 до 9 и спецсимволов.
Таблица должна иметь 68 строк и 67 символов, со 2 строки по 68. Связано это с тем, что наша исходная таблица с буквами русского алфавита имеет 34 символа, после перевода пароля и ключа в порядковые номера строк этой таблицы и их попарного сложения, мы можем получить числовой ряд с номерами минимум 2 (1+1) и максимум 68 (34+34).
Создаем таблицу символов в диапазоне В1:В68, присваиваем ей имя «латиница», и заполняем символами латинских заглавных и строчных букв, цифр и спецсимволов. Можно заполнять подряд, можно вперемешку. В нашем примере таблица собрана таким образом: заглавная и строчная латинская буква подряд по алфавиту и через каждые девять символов идет цифра (АаВbСс1DdEeFf2…) и в конце спецсимволы. Сделано это для распределения вероятности попадания заглавных строчных букв и цифр.
Таблицу символов можно периодически менять. Это по сути дела еще один этап шифрования.
С учетом того, что числовой ряд, который мы будем кодировать находиться у нас в диапазоне G12:V12, формула для перевода чисел в символы будет иметь вид:
=ИНДЕКС(латиница;G12;1) для первого числа.
Скопировав ее во все 16 ячеек нашего диапазона, мы получим последовательность ничего не значащих символов, чего собственно говоря, мы и добивались.
Теперь остается их только соединить вместе и поместить в одну ячейку.
Сделать это можно при помощи функции СЦЕПИТЬ.
=СЦЕПИТЬ(G14;H14;I14;J14;K14;L14;M14;N14;O14;P14;Q14;R14;S14;T14;U14;V14).
Поскольку мы решили сделать в нашем примере возможность выбора между 8 и 16 символами, то добавляем соответствующий элемент управления – «Переключатель».
Добавить Переключатель на лист можно через вкладку Разработчик→ группа Элементы управления→ команда Вставить→ Элементы управления формы → Переключатель.
Настраиваем переключатель следующим образом:
Правой кнопкой мыши кликаем на переключателе и в появившемся контекстном меню выбираем пункт Формат объекта. В появившемся диалоговом окне Формат элемента управления на вкладке Элемент управления в поле Связь с ячейкой устанавливаем связь с ячейкой D12.
Теперь, поскольку у нас всего два переключателя, то когда установлен первый, в ячейке D12 будет значение 1, когда будет установлен второй – значение 2.
Этого достаточно, чтобы использовать логическую функцию ЕСЛИ и в одном случае сцепить 8 символов, а в другом сцепить 16 символов.
С учетом наличия переключателей, наша формула будет иметь вид:
=ЕСЛИ(D12=1;СЦЕПИТЬ(G14;H14;I14;J14;K14;L14;M14;N14);СЦЕПИТЬ(G14;H14;I14;J14;K14;L14;M14;N14;O14;P14;Q14;R14;S14;T14;U14;V14))
Наш чудо-шифратор пароля готов.
Как обычно выполняем некоторые организационные мероприятия для защиты листа и придания ему надлежащего вида. С этой целью, мы устанавливаем защиту ячеек на всем листе, кроме ячеек D12 (там где меняется параметр после установки переключателя). Чтобы ничего не нарушить случайным образом скрываем столбец D. Скрываем все вспомогательные данные на листе, устанавливая формат данных «;;;» и защищаем лист.
В учебном примере на защиту листа пароля нет, и чтобы посмотреть устройства файла нужно просто снять защиту листа на вкладке Рецензирование.
Типовой стандарт бизнес-планирования (бюджетирования) Бесплатная версия Excel
Comments are currently closed.