- •Создание и проверка криптографической защиты текстовой информации макросами языка vba в среде Word ms Office.
- •Объекты, свойства и методы vba.
- •Типы данных.
- •Встроенные типы данных.
- •Переменные и их объявление.
- •Объявление и присваивание объектных переменных.
- •Использование встроенных функций Visual Basic.
- •Математические функции
- •Строковые функции:
- •2.Логически прерываемые
- •Встроенные диалоговые окна.
- •Диалоговые окна приложения.
- •Порядок выполнения программы Шифрование/Дешифрование текстовых фрагментов документа Word по парольной фразе (симметричный ключ).
- •1.2 Создать код для отображения диалогового окна:
1.2 Создать код для отображения диалогового окна:
После создания элементов управления в программе Word необходимо добавить кнопку запуска пользовательской формой. Эта кнопка будет запускать процедуру, которая предназначена для отображения формы UserForm. Для этого выполните следующие действия.
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) выделить название проекта Project (Kodtext) →Insert→Module. Появиться папка Modules в окне Project Explorer, в ней Module1.
Выделить Module1→правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
Sub запуск()
UserForm1.Show
End Sub
Перейти в окно Word (воспользуйтесь комбинацией клавиш <Alt+Fll>).Должно появиться окно документа “kodtext.docm” (если нет, выбрать именно этот документ).
Перейти в меню Вид→Макросы→Запуск→ Выполнить.
Это приведет к активизации пользовательской формы (рис 7).
Форму можно закрыть (крестик в верхнем правом углу формы)
Нажать кнопку Офис (круглая кнопка в верхнем левом углу экрана)→Параметры Word→Настройка→выбрать команды из “макрос”→”Project.Module1.запуск”→Добавить→ОК.
Кнопка запуска программы криптозащиты появиться в панели быстрого доступа (левый верхний угол экрана).Нажать на нее.
Диалоговое окно будет отображено, но ни одна кнопка на форме не будет работать. Поэтому необходимо подключить к каждому элементу процедуру обработки событий.
Нажать комбинацию клавиш <Alt+Fll>. Это приведет к активизации экрана VBE.
Удостовериться, что пользовательское диалоговое окно отображено на экране и дважды щелкните на кнопке “Выход из программы”. Таким образом, будет активизировано окно кода для объекта кнопки формы UserForm1, также будет добавлена пустая процедура → CommandButton5_Click(). Обратите внимание, что название процедуры состоит из имени объекта, символа подчеркивания и названия события, которое обрабатывает процедура.
Модифицировать процедуру , добавив следующий код:
Private Sub CommandButton5_Click() ‘эта строка сгенерирована самой программой
UserForm1.Hide
End Sub ‘эта строка сгенерирована самой программой
Данная процедура выполняется после щелчка пользователем на кнопке “Выход из программы”. Она вызывает выгрузку формы UserForm1 из памяти.
Перейти в окно Word (воспользуйтесь комбинацией клавиш <Alt+Fll>).Должно появиться окно документа “kodtext.docm” (если нет, выбрать именно этот документ).
Нажать на кнопку запуска программы криптозащиты в панели быстрого доступа (левый верхний угол экрана). Появиться пользовательская форма. Далее нажать на кнопку “Выход из программы”. Пользовательская форма закроется.
Повторить создание других кнопок аналогичным образом.
Удостовериться, что пользовательское диалоговое окно отображено на экране и дважды щелкнуть на кнопке “Запуск подбор пароля”. Будет активизировано окно кода для объекта кнопки формы UserForm1, также будет добавлена пустая процедура → CommandButton1_Click().
Модифицируйте процедуру, добавив следующий код:
Private Sub CommandButton1_Click() ‘ эта строка сгенерирована самой программой
Call ДоступWord
End Sub ‘ эта строка сгенерирована самой программой
Нажать комбинацию клавиш <Shift+F7>, чтобы повторно отобразить объект UserForm1 (или щелкнуть на значке View Object в верхней части окна Project Explorer).
Дважды щелкнуть на кнопке “Запуск генератора кода”. Таким образом, будет активизировано окно кода для объекта кнопки формы UserForm1, также будет добавлена пустая процедура → CommandButton2_Click().
Модифицировать процедуру, добавив код:
Private Sub CommandButton2_Click()‘ эта строка сгенерирована самой программой
Call Генератор
End Sub ‘ эта строка сгенерирована самой программой
Дважды щелкнуть на кнопке “Запуск шифратора”. Таким образом, будет активизировано окно кода для объекта кнопки формы UserForm1, также будет добавлена пустая процедура → CommandButton3_Click().
Модифицировать процедуру, добавив код:
Private Sub CommandButton3_Click()‘ эта строка сгенерирована самой программой
Call Шифратор
End Sub ‘ эта строка сгенерирована самой программой
Дважды щелкнуть на кнопке “Запуск дешифратора”. Таким образом, будет активизировано окно кода для объекта кнопки формы UserForm1, также будет добавлена пустая процедура → CommandButton4_Click().
Модифицировать процедуру, добавив код:
Private Sub CommandButton4_Click()‘ эта строка сгенерирована самой программой
Call Дешифратор
End Sub ‘ эта строка сгенерирована самой программой
Выделить Module1→правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
Вставить два фрагмента кода последовательно друг за другом:
Внимание! Вставлять код надо впереди уже имеющегося кода
(у нас там следующий код лежит :
Sub запуск()
UserForm1.Show
End Sub
Добавляем только этот код:
‘ Код функции поиска нужного файла для кода доступа word
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
Optional ByVal InitialPath As String = "c:\", _
Optional ByVal FilterDescription As String = "Книги Excel", _
Optional ByVal FilterExtention As String = "*.xls*") As String
' функция выводит диалоговое окно выбора файла с заголовком Title,
' начиная обзор диска с папки InitialPath
' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
' для фильтра можно указать описание и расширение выбираемых файлов
On Error Resume Next
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
.Filters.Clear: .Filters.Add FilterDescription, FilterExtention
If .Show <> -1 Then Exit Function
GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
End With
End Function
‘ Код доступWord() с progressbar
Sub ДоступWord()
Dim t!
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer
Dim s As Integer
Dim kennwort As String
t = Timer
On Error Resume Next
' при возникновении ошибки во время выполнения управление передается оператору,
' непосредственно следующему за тем, в котором возникла ошибка, и выполнение продолжается с этой точки
NameFile = GetFilePath("Выберите файл Word", , "Документы Word", "*.docx") ' запрашиваем имя файла
If NameFile = "" Then Exit Sub ' выход, если пользователь отказался от выбора файла
Dim objWrdApp As Object
Dim objWrdDoc As Object
Set objWrdApp = GetObject(, "Word.Application")
If objWrdApp Is Nothing Then
Set objWrdApp = CreateObject("Word.Application")
End If
Dim bar As Progressbar ' создаем форму прогресс бара
Set bar = New Progressbar
' создаем элементы формы прогресс бара
' последовательность создания элементов не имеет никакого значения, т.к.
' перед его создание проверяется наличие остальных. Если элементы найдены, то они сдвигаются
bar.createtimeFinish ' вывод строки для оставшегося времени
bar.createLoadingBar ' вывод полосы загрузки
'bar.createString ' вывод строки пройденных этапов из общего количества с указанием процента
bar.createtimeDuration ' текущая время обработки процесса
'bar.createTextBox ' вывод пустого текстового поля
bar.setParameters 100000, 0, 1 ' Задание параметров для последующей обработки:
' 1 - указание числа этапов процесса;
' 2 - интервал обновления формы, в данном случае ноль, но можно вовсе опустить
' 3 - интервал обновления в секундах, применяется, только если предыдущий _
аргумент равен нулю или опущен
bar.Start "Время процесса подбора паролей" ' запускаем прогресс бар перед началом процесса
s = 0
For i = 0 To 5
For j = 0 To 5
For k = 0 To 5
For l = 0 To 5
kennwort = CStr(i) & CStr(j) & CStr(k) & CStr(l)
s = s + 1
bar.Update s * 100 ' обновляем прогресс бар и передаем ему номер текущего этапа процесса
Set objWrdDoc = objWrdApp.Documents.Open(NameFile, PasswordDocument:=kennwort)
objWrdApp.Visible = True
If Err Then
Err.Clear
Else
MsgBox "Пароль = " & kennwort & " " & "за время " & Format(Timer - t, "0.0 секунд")
UserForm1.TextBox1.Text = "пароль подобран"
bar.exitBar ' Закрываем прогресс бар
Set bar = Nothing ' удаляем экземпляр класса прогресс бара
Exit Sub
End If
Next
Next
Next
Next
Set objWrdDoc = Nothing
Set objWrdApp = Nothing
End Sub
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) выделить название проекта Project (Kodtext) →Insert→ UserForm. Появиться в окне Project Explorer в папке Forms новая форма UserForm2.
Необходимо ее переименовать UserForm2→правая клавиша мышки→контекстное меню→View Object→в списке свойств Properties найти свойство Name→изменить UserForm2 на barForm→OK
Выделить barForm →правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
‘ Код barForm
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode = vbFormControlMenu Then
ans = MsgBox("Нажмите ""Да"", чтобы остановить процесс." & Chr(13) & _
"Нажмите ""Нет"", ""Отмена"" или закройте это окно, чтобы закрыть только окно загрузки.", _
vbYesNoCancel + vbQuestion, "Остановить процесс?")
If ans = 6 Then
End
Else
Unload barForm
End If
End If
End Sub
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) выделить название проекта Project (Kodtext) →Insert→ Class Module. Появиться в окне Project Explorer в папке Class Modules новый класс Class1.
Необходимо его переименовать Class1→правая клавиша мышки→контекстное меню→View Object→в списке свойств Properties найти свойство Name→изменить Class1 на Progressbar →OK
Выделить Progressbar →правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
‘ Код класса Progressbar
Private timeStart As Date
Private allProcess As Long
Private UpdInterval As Long
Private UpdTimeInterval As Long ' в секундах
Private prevUpdate As Double
Private prev As Long
Private formProgress As New barForm
Private Sub Class_Initialize()
Load formProgress
prev = 0
prevUpdate = 0
UpdInterval = Empty
UpdTimeInterval = Empty
End Sub
Sub Start(Optional title As String = "Процесс выполнения")
timeStart = Now
formProgress.Caption = title
formProgress.Show False
End Sub
Sub exitBar()
Unload formProgress
End Sub
Sub createString()
' создание элемента формы для сообщения текстовой информации пользователю
' перебираем элементы формы для изменения параметров
t = 5
h = 49
For Each cntr In formProgress.Controls
' если элемент уже добавлялся, то прекращаем
If cntr.Name = "String" Then
MsgBox "Элемент уже был создан!", vbCritical, "Ошибка"
Exit Sub
' проверяем на наличие других элементов
ElseIf TypeName(cntr) = "TextBox" Then
cntr.Top = cntr.Top + 20
h = h + 55
ElseIf cntr.Name = "bar" Then
h = h + 20
t = t + 20
ElseIf cntr.Name = "Duration" Or cntr.Name = "Finish" Then
cntr.Top = cntr.Top + 20
h = h + 20
End If
Next cntr
formProgress.Width = 340
formProgress.Height = h
' создаем lable с пустым текстом
Set vCommand = formProgress.Controls.Add("Forms.Label.1")
With vCommand
.Left = 10
.Top = t
.Width = 325
.Height = 15
.Name = "String"
.Caption = ""
End With
End Sub
Sub createTextBox()
' создание элемента формы для множественных сообщений пользователю
' перебираем элементы формы для изменения параметров
t = 5
h = 84
For Each cntr In formProgress.Controls
' если элемент уже добавлялся, то прекращаем
If TypeName(cntr) = "TextBox" Then
MsgBox "Элемент уже был создан!", vbCritical, "Ошибка"
Exit Sub
' проверяем на наличие других элементов
ElseIf cntr.Name = "String" Then
t = t + 20
h = h + 20
ElseIf cntr.Name = "bar" Or cntr.Name = "Duration" Or cntr.Name = "Finish" Then
h = h + 20
t = t + 20
End If
Next cntr
formProgress.Width = 340
formProgress.Height = h
' создаем TextBox с пустым текстом
Set vCommand = formProgress.Controls.Add("Forms.TextBox.1")
With vCommand
.Left = 5
.Top = t
.Width = 325
.Height = 50
.Name = "Text"
.MultiLine = True
.WordWrap = True
End With
End Sub
Sub createtimeDuration()
' создание элемента формы для сообщения продолжительности процесса пользователю
' перебираем элементы формы для изменения параметров
t = 5
h = 49
For Each cntr In formProgress.Controls
' если элемент уже добавлялся, то прекращаем
If cntr.Name = "Duration" Then
MsgBox "Элемент уже был создан!", vbCritical, "Ошибка"
Exit Sub
' проверяем на наличие других элементов
ElseIf TypeName(cntr) = "TextBox" Then
cntr.Top = cntr.Top + 20
h = h + 55
ElseIf cntr.Name = "bar" Or cntr.Name = "String" Then
h = h + 20
t = t + 20
ElseIf cntr.Name = "Finish" Then
h = h + 20
cntr.Top = cntr.Top + 20
End If
Next cntr
formProgress.Width = 340
formProgress.Height = h
' создаем lable с пустым текстом
Set vCommand = formProgress.Controls.Add("Forms.Label.1")
With vCommand
.Left = 10
.Top = t
.Width = 325
.Height = 15
.Name = "Duration"
.Caption = ""
End With
End Sub
Sub createtimeFinish()
' создание элемента формы для сообщения оставшегося времени процесса пользователю
' перебираем элементы формы для изменения параметров
t = 5
h = 49
For Each cntr In formProgress.Controls
' если элемент уже добавлялся, то прекращаем
If cntr.Name = "Finish" Then
MsgBox "Элемент уже был создан!", vbCritical, "Ошибка"
Exit Sub
' проверяем на наличие других элементов
ElseIf TypeName(cntr) = "TextBox" Then
cntr.Top = cntr.Top + 20
h = h + 55
ElseIf cntr.Name = "bar" Or cntr.Name = "String" Or cntr.Name = "Duration" Then
h = h + 20
t = t + 20
End If
Next cntr
formProgress.Width = 340
formProgress.Height = h
' создаем lable с пустым текстом
Set vCommand = formProgress.Controls.Add("Forms.Label.1")
With vCommand
.Left = 10
.Top = t
.Width = 325
.Height = 15
.Name = "Finish"
.Caption = ""
End With
End Sub
Sub createLoadingBar()
' создание элемента формы для полосы загрузки
' перебираем элементы формы для изменения параметров
h = 49
For Each cntr In formProgress.Controls
' если элемент уже добавлялся, то прекращаем
If cntr.Name = "container" Or cntr.Name = "bar" Then
MsgBox "Элемент loadingBar уже был создан!", vbCritical, "Ошибка"
Exit Sub
' проверяем на наличие других элементов
ElseIf TypeName(cntr) = "TextBox" Then
cntr.Top = cntr.Top + 20
h = h + 55
ElseIf cntr.Name = "Finish" Or cntr.Name = "Duration" Or cntr.Name = "String" Then
cntr.Top = cntr.Top + 20
h = h + 20
End If
Next cntr
formProgress.Width = 340
formProgress.Height = h
' создаем lable с пустым текстом
Set vCommand = formProgress.Controls.Add("Forms.Label.1")
With vCommand
.Left = 5
.Top = 5
.Width = 325
.Height = 15
.Name = "container"
.Caption = ""
.TabIndex = 0
.BackColor = &H80000004
End With
Set vCommand = Nothing
Set vCommand = formProgress.Controls.Add("Forms.Label.1")
With vCommand
.Left = 5
.Top = 5
.Width = 0
.Height = 15
.Name = "bar"
.Caption = ""
.TabIndex = 1
.BackColor = &H80000002
End With
End Sub
Sub setParameters(expProcess_INT As Long, Optional UpdateInterval_INT As Long, Optional UpdTimeInterval_INT_SEC As Long)
' устанавливаем ожидаемое число процессов для прогресс бара
allProcess = expProcess_INT
If Not IsMissing(UpdateInterval_INT) And UpdateInterval_INT > 0 Then
UpdInterval = UpdateInterval_INT
ElseIf Not IsMissing(UpdTimeInterval_INT_SEC) And UpdTimeInterval_INT_SEC > 0 Then
UpdTimeInterval = UpdTimeInterval_INT_SEC
Else: UpdTimeInterval = 1
End If
End Sub
Function Update(Optional ByVal curProcess As Long, Optional ByVal stringTextBox As String)
If formProgress.Controls.Count = 0 Then Exit Function
' Проверяем, прошел ли интервал времени. Если нет, то не проводим обновление
timeDur = Now - timeStart
If UpdInterval > 0 And (curProcess - prevUpdate) >= UpdInterval Then
prevUpdate = curProcess
ElseIf UpdTimeInterval > 0 And (Round(timeDur / (1 / 24 / 60 / 60), 0) - prevUpdate) >= UpdTimeInterval Then
prevUpdate = Round(timeDur / (1 / 24 / 60 / 60), 0)
Else
Exit Function
End If
' обновление формы
For Each cntl In formProgress.Controls
Select Case cntl.Name
Case "bar"
If Not IsMissing(curProcess) Then
' опрежеляем процент выполнения от общего числа процессов
rat = curProcess / allProcess
' устанавливаем ширину элемента для полосы загрузки в определенном проценте от общей ширины для полосы загрузки
cntl.Width = Round(325 * rat, 2)
End If
Case "String"
' задаем строку сколько этапов процесса обработано
If Not IsMissing(curProcess) Then cntl.Caption = "Обработано: " & curProcess & " из " & allProcess & " - " _
& Round(curProcess / allProcess * 100, 2) & "%"
Case "Duration"
' определяет продолжительность процесса и переводим строку в виде времени
'h = WorksheetFunction.RoundDown((Now - timeStart) / (1 / 24), 0)
h = Int((Now - timeStart) / (1 / 24))
If Len(Trim(CStr(h))) = 1 Then h = "0" & Trim(CStr(h))
' m = WorksheetFunction.RoundDown(((Now - timeStart) / (1 / 24 / 60)) - h * 60, 0)
m = Int(((Now - timeStart) / (1 / 24 / 60)) - h * 60)
If Len(Trim(CStr(m))) = 1 Then m = "0" & Trim(CStr(m))
s = Round((Now - timeStart) / (1 / 24 / 60 / 60) - h * 60 * 60 - m * 60, 0)
If Len(Trim(CStr(s))) = 1 Then s = "0" & Trim(CStr(s))
timeStr = h & ":" & m & ":" & s
cntl.Caption = "Продолжительность обработки: " & timeStr
Case "Finish"
' определяем оставшееся время исходя из того, сколько прошло до текущего этапа процесса, и сколько этапов осталось
If Not IsMissing(curProcess) Then
timeOneProcess = timeDur / curProcess ' времени на один этап процесса
remTime = timeOneProcess * (allProcess - curProcess) ' оставшееся время
'h = WorksheetFunction.RoundDown(remTime / (1 / 24), 0)
h = Int(remTime / (1 / 24))
If Len(Trim(CStr(h))) = 1 Then h = "0" & Trim(CStr(h))
'm = WorksheetFunction.RoundDown((remTime / (1 / 24 / 60)) - h * 60, 0)
m = Int((remTime / (1 / 24 / 60)) - h * 60)
If Len(Trim(CStr(m))) = 1 Then m = "0" & Trim(CStr(m))
s = Round(remTime / (1 / 24 / 60 / 60) - h * 60 * 60 - m * 60, 0)
If Len(Trim(CStr(s))) = 1 Then s = "0" & Trim(CStr(s))
remTime = h & ":" & m & ":" & s
cntl.Caption = "Оставшееся время обработки: " & remTime
End If
Case "Text"
' добавляем строку в textbox с переносом, если там уже что-то есть
If Not IsMissing(stringTextBox) Then
If cntl.TextLength = 0 Then
cntl.Text = stringTextBox
Else
cntl.Text = cntl.Text & Chr(13) & stringTextBox
End If
End If
End Select
Next cntl
formProgress.Repaint
DoEvents
End Function
Function getForm()
Set getForm = formProgress
End Function
Выйти из VBA и запустить пользовательскую форму кнопкой на панели быстрого доступа (верхний левый угол экрана).
Активизируется пользовательское меню. Нажать на кнопку “Запуск подбора”.
Появиться окно выбора закодированного файла указать на закодированный файл→ OK.
Программа подбора начнет выполняться, появиться окно выполнения программы (progressbar). По выполнению задачи progressbar исчезнет. Вместо него появиться окно с указанием подобранного пароля и временем подбора в секундах.
Также откроется в новом окне содержимое распароленного файла Word.
При выполнении программы подбора возможно зависание окна progressbar (информация на нем может не меняться), но сама программа подбора будет продолжать выполняться. Это происходит из-за срабатывания системы защиты самой программы Word. На конечный результат подбора пароля это не влияет. В итоге после некоторого ожидания появится окно с паролем и затраченным временем выполнения.
2.Установить четырехзначный цифровой пароль (каждая из цифр от 0 до 5) в контрольный файл MS Office Word.
3. С помощью созданной программы подобрать пароль и установить время подбора (сколько паролей в секунду выполняет программа на языке VBA).
4.Дать экспертное заключение на желательную минимальную длину пароля для ценной текстовой информации (посчитать количество вариантов перебора при использованном алфавите с учетом скорости перебора).
5. Составить самостоятельно программу подбора трехзначного пароля для ограниченного алфавита (до 10 символов). Необходимо обеспечить ввод этого алфавита вручную при запуске программы.(задание на дом)
6. Создать программу криптозащиты ценной текстовой информации для русского прописного и строчного алфавита (метод симметричного ключа ) на языке VBA для MS Office Word 2007/2013.
Для запуска программы необходимо внести следующий код:
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) название проекта Project (Kodtext) →Module1→правая кнопка мышки→View Code. В появившемся окне добавить два блока кода :
1 .Вставить первый блок в самом верху модуля Module1 (с него начинается весь код):
‘ Код общих исходных данных для генератора шифратора и дешифратора
Public Schet As Byte
Public ParFr, ParFr1, ParFr2 As String 'Строка, зарезервированная под парольную фразу
Dim PriznakM(32) As Byte 'признак, что данная строчная буква основного алфавита уже использована в шифроалфавите
Dim PriznakB(32) As Byte 'признак, что данная прописная буква основного алфавита уже использована в шифроалфавите
Dim SformM As String 'сформированный строчный шифроалфавит по введенной парольной фразе, макросом Generator
Dim SformB As String 'сформированный прописной шифроалфавит по введенной парольной фразе, макросом Generator
Dim ObrM As String 'сформированный обратный строчный шифроалфавит по введенной парольной фразе, макросом Generator
Dim ObrB As String 'сформированный обратный прописной шифроалфавит по введенной парольной фразе, макросом Generator
Dim Povtor As Byte '=0, то запросить парольную фразу, =1, то работать по ранее введенной парольной фразе
Dim buk As Boolean ' =истине, то это маленькая (строчная) буква
Const NALU = "абвгдежзийклмнопрстуфхцчшщъыьэюя" 'нормальный строчный алфавит
Const NAL = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" 'нормальный прописной алфавит
2.Вставить второй блок в продолжении общего кода (как обычно):
‘ Код для генератора
Sub Генератор()
' Замена шифроалфавита. В парольной фразе только русские буквы.
' Макрос можно вызывать для замены парольной фразы в течении одной сессии.
' если его не вызывать, то будет использоваться парольная фраза, введенная при первом шифровании,
' либо последняя парольная фраза, введенная через прямой вызов генератора
ParFr = "О сколько нам Открытий чудных готовит Просвещенья Дух"
'этот участок проверяет начальную или текущую парольную фразу
If Schet = 0 Then ParFr1 = ParFr
ParFr2 = InputBox("", "Введите парольную фразу", ParFr1)
If Len(ParFr2) < 6 Then
MsgBox "Слишком короткая фраза, текущей осталась прежняя парольная фраза"
ParFr2 = ParFr1
If Povtor = 1 Then GoTo mm
End If
ParFr1 = ParFr2
Schet = Schet + 1 ' количество парольных фраз за одну сессию
For i = 1 To 32
PriznakM(i) = 0 ' обнуляем признак использования всех букв строчного алфавита
PriznakB(i) = 0 ' обнуляем признак использования всех букв прописного алфавита
Next i
SformM = Empty
SformB = Empty
NsformM = 0
NsformB = 0
For i = 1 To Len(ParFr2)
Sim1 = Mid(ParFr2, i, 1) ' выбираем i-ый символ из парольной фразы
buk = False
For j = 1 To 32 ' проверка наличия строчной буквы, иначе проверка на Прописную букву
If Sim1 = Mid(NALU, j, 1) Then buk = True
Next j
If buk = True Then
For j = 1 To NsformM
If Sim1 = Mid(SformM, j, 1) Then GoTo m 'эта буква уже есть в сформированном строчном алфавите
Next j
SformM = SformM + Sim1 ' очередная строчная буква парольной фразы оказалась неиспользованной, добавляем ее в шифроалфавит
IndexM = Asc(Sim1) - Asc("а") + 1 ' определим номер этой строчной буквы в нормальном алфавите
PriznakM(IndexM) = 1 ' занесем признак уже использованной строчной буквы нормального алфавита
NsformM = NsformM + 1 ' кол-во сформированных строчных букв в шифроалфавите
Else
For j = 1 To 32 ' проверка наличия прописной буквы
If Sim1 = Mid(NAL, j, 1) Then buk = True
Next j
If buk = True Then
For j = 1 To NsformB
If Sim1 = Mid(SformB, j, 1) Then GoTo m 'эта буква уже есть в сформированном прописном алфавите
Next j
SformB = SformB + Sim1 ' очередная буква парольной фразы оказалась неиспользованной, добавляем ее в прописной шифроалфавит
IndexB = Asc(Sim1) - Asc("А") + 1 ' определим номер этой буквы в прописном нормальном алфавите
PriznakB(IndexB) = 1 ' занесем признак уже использованной буквы прописного нормального алфавита
NsformB = NsformB + 1 ' кол-во сформированных букв в прописном шифроалфавите
End If
End If
m:
Next i
' сформировали часть шифроалфавита по парольной фразе
' а теперь надо добавить неиспользованные буквы нормального алфавита по порядку, чтобы шифроалфавит стал полным
For i = 1 To 32
Sim1 = Mid(NALU, i, 1) ' выбираем i-ую букву из строчного нормального алфавита
If PriznakM(i) = 0 Then 'если буква не использована в строчном шифроалфавите
SformM = SformM + Sim1 ' то добавляем ее туда
IndexM = Asc(Sim1) - Asc("а") + 1 ' определим порядковый номер добавленной буквы
PriznakM(IndexM) = 1 ' занесем признак уже использованной буквы
NsformM = NsformM + 1 ' кол-во сформированных букв в строчном шифроалфавите
End If
Next i
For i = 1 To 32
Sim1 = Mid(NAL, i, 1) ' выбираем i-ую букву из прописного нормального алфавита
If PriznakB(i) = 0 Then 'если буква не использована в шифроалфавите
SformB = SformB + Sim1 ' то добавляем ее туда
IndexB = Asc(Sim1) - Asc("А") + 1 ' определим порядковый номер добавленной буквы
PriznakB(IndexB) = 1 ' занесем признак уже использованной буквы
NsformB = NsformB + 1 ' кол-во сформированных букв в прописном шифроалфавите
End If
Next i
' Конец формирования шифроалфавита
' Генератор обратного шифроалфавита
ObrM = Empty
ObrB = Empty
For i = 1 To 32
Sim1 = Mid(NALU, i, 1) 'берем букву нормального строчного алфавита
For j = 1 To 32
If Sim1 = Mid(SformM, j, 1) Then Index1 = j 'определяем ее номер в шифроалфавите
Next j
Sim2 = Mid(NALU, Index1, 1) 'берем из нормального строчного алфавита букву по определенному номеру
ObrM = ObrM + Sim2 'добавляем ее в обратный строчный алфавит
Next i
For i = 1 To 32
Sim1 = Mid(NAL, i, 1) 'берем букву нормального прописного алфавита
For j = 1 To 32
If Sim1 = Mid(SformB, j, 1) Then Index1 = j 'определяем ее номер в шифроалфавите
Next j
Sim2 = Mid(NAL, Index1, 1) 'берем из нормального прописного алфавита букву по определенному номеру
ObrB = ObrB + Sim2 'добавляем ее в обратный прописной алфавит
Next i
' Конец формирования обратного шифроалфавита
Povtor = 1 ' заносим признак того чтобы при повторе шифрования в течение сессии парольную фразу не запрашивать
mm:
End Sub
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) название проекта Project (Kodtext) →Module1→правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
‘ Код шифратора
Public Sub Шифратор() 'шифрование выделенного русского текста
' последним выделенным символом НЕ должен быть знак форматирования (пробел, конец абзаца и т.д.)
' парольная фраза запрашивается 1 раз и сохраняется для всех шифрований(дешифрований) на время сессии
' чтобы сменить парольную фразу нужно закрыть и открыть документ заново или обратиться к макросу Generator
' латинские буквы и все небуквенные символы остаются без изменения
' у злоумышленника создается впечатление неправильной русской кодировки маленьких букв в его компьютере
' НЕ рекомендуется шифровать начальные и конечные фразы писем, т.к. они содержат типовые фразы,
' облегчающие злоумышленнику взлом
Dim Sim, ALU As String, Sym1 As Variant
Dim Index As Integer
Dim Result As String
Result = Empty
NChar = Selection.Start
NChar1 = Selection.End
If NChar = NChar1 Then
Call MsgBox("Ничего не выделено", 64, "Шифратор")
GoTo mm
End If
If Povtor <> 1 Then
Генератор
Else
o1 = MsgBox(ParFr1, 3, "Текущая парольная фраза, ПРОДОЛЖИТЬ?")
If o1 <> 6 Then GoTo mm
End If
ALU = SformM
AL = SformB
' цикл чтения символа в выделенном фрагменте
For Each Sym1 In Selection.Characters
Sym = Sym1
Select Case Sym
Case "А" To "Я" 'обработка прописных букв
' вычисляем порядковый номер текущего символа
IndexB = Asc(Sym) - Asc("А") + 1
' меняем текущий символ по номеру из строки AL
Sym = Mid(AL, IndexB, 1)
Case "а" To "я" 'обработка строчных букв
' вычисляем порядковый номер текущего символа
IndexM = Asc(Sym) - Asc("а") + 1
' меняем текущий символ по номеру из строки ALU
Sym = Mid(ALU, IndexM, 1)
Case Else
'Sym = Empty
End Select
' добавляем измененный символ в результат
Result = Result + Sym
Next Sym1
'обновляем выделенную часть текста
Selection.LanguageID = wdRussian
Selection.TypeText Result ' не сохраняем выделение текста
UserForm1.TextBox1.Text = "Русский текст зашифрован"
mm:
End Sub
В окне (слева от основного) Project Explorer (View→ Project Explorer или Ctrl+R) название проекта Project (Kodtext) →Module1→правая кнопка мышки→View Code. В появившемся окне добавить следующий код:
‘ Код дешифратора
Public Sub Дешифратор() ' дешифрование выделенного русского текста
' последним выделенным символом НЕ должен быть знак форматирования (пробел, конец абзаца и т.д.)
' латинские буквы и все небуквенные символы остаются без изменения
' парольная фраза запрашивается 1 раз и сохраняется для всех шифрований(дешифрований) на время сессии
' чтобы сменить парольную фразу нужно закрыть и открыть документ заново или обратиться к макросу Generator
Dim Sim, ALUo As String, Sym1 As Variant
Dim Index As Integer
Dim Result As String
Result = Empty
' проверяем, было ли выделение текста?
NChar = Selection.Start
NChar1 = Selection.End
If NChar = NChar1 Then
Call MsgBox("Ничего не выделено", 64, "Дешифратор")
GoTo mm
End If
'If Povtor <> 1 Then Generator ' если это первое дешифрование за сессию - запускаем генератор шифроалфавитов по парольной фразе
If Povtor <> 1 Then
Генератор
Else
o1 = MsgBox(ParFr1, 3, "Текущая парольная фраза, ПРОДОЛЖИТЬ?")
If o1 <> 6 Then GoTo mm
End If
'ALUo = ObrM
'ALo = ObrB
' цикл чтения символа в выделенном фрагменте
For Each Sym1 In Selection.Characters
Sym = Sym1
Select Case Sym
Case "А" To "Я" 'обработка прописных букв
' вычисляем порядковый номер текущего символа
IndexB = Asc(Sym) - Asc("А") + 1
' меняем текущий символ по номеру из строки AL
Sym = Mid(ObrB, IndexB, 1)
Case "а" To "я" 'обработка строчных букв
' вычисляем порядковый номер текущего символа
IndexM = Asc(Sym) - Asc("а") + 1
' меняем текущий символ по номеру из строки ALU
Sym = Mid(ObrM, IndexM, 1)
Case Else
'Sym = Empty
End Select
' добавляем измененный символ в результат
Result = Result + Sym
Next Sym1
'обновляем выделенную часть текста
Selection.LanguageID = wdRussian
Selection.TypeText Result ' не сохраняем выделение текста
UserForm1.TextBox1.Text = "Русский текст расшифрован"
mm:
End Sub
Переместить код программы запуска Sub запуск()
UserForm1.Show
End Sub
в самый конец программного кода (он завершает код в Module1).
Выйти из VBA и запустить программу на выполнение через меню быстрого запуска. Появиться пользовательское меню.
Выделить фрагмент текста на странице Word (текст написать самостоятельно с использованием прописных и строчных букв русского алфавита или взять из другого файла методом копирования на страницу Word).
В пользовательском меню нажать кнопку Запуск шифратора. Появиться сообщение о запуске генератора с парольной фразой по умолчанию. Если парольная фраза подходит, нажать OK и выделенный текст превратиться в набор случайных букв русского алфавита (то есть потеряется смысл содержания выделенного абзаца).
Если парольная фраза не подходить, необходимо нажать на кнопку Запуск генератора и ввести в него новую парольную фразу (обычно это цитата из популярных источников литературы) . Создается новый шифроалфавит, который будет использоваться по умолчанию.
Выделить фрагмент закодированного текста на странице Word (текст тот же, иначе не подойдет парольная фраза).
В пользовательском меню нажать кнопку “Запуск дешифратора”. Появиться сообщение о запуске генератора с парольной фразой по умолчанию. Если парольная фраза подходит, нажать OK и выделенный текст превратиться в осмысленный текст (то есть появиться смысл содержания выделенного абзаца).
7. Составить самостоятельно программу криптозащиты ценной текстовой информации для латинского прописного и строчного алфавита (метод симметричного ключа ) для MS Office Word 2007/2013 на языке VBA (задание на дом).
По завершении закрыть пользовательское меню, нажав на кнопку “Выход из программы”.
Содержание отчета.
1.Блок-схема алгоритма последовательного перебора паролей(brute force).
2. Программа подбора трехзначного пароля для ограниченного алфавита (до 10 символов) с обеспечением ввода используемого алфавита вручную при запуске программы.
3. Экспертное заключение о желательной минимальной длине пароля для ценной текстовой информации. Подтвердить расчетом .
4. Блок-схема алгоритма криптозащиты методом симметричного ключа для латинского алфавита .
5.Программа криптозащиты ценной текстовой информации для латинского прописного и строчного алфавита (метод симметричного ключа ) для MS Office Word 2007/2013 на языке VBA
6.Исходные программы представить в бумажном и электронном виде.
Контрольные вопросы.
1.Способы защиты электронных документов.
2. Базовые алгоритмы подбора паролей.
3. Достоинства и недостатки средств защиты программ MS Office.
4. Типы атак на пароли.
5. Достоинства и недостатки профессиональных многоцелевых программных пакетов восстановления паролей.
6.Рекомендации по повышению стойкости паролей.
7.Классические методы криптозащиты информации.
8. Объекты, свойства и методы VBA.
9. Типы данных VBA/
10. Переменные и их объявление VBA
11. Арифметические и логические операции VBA
12. Операторы присваивания VBA/
13. Условные операторы VBA
14.Операторы цикла VBA/
15.. Встроенные диалоговые окона VBA.
Список литературы:
А. Гарнаев, Самоучитель VBA. – Санкт-Петербург, Издательство БХВ–Санкт-Петербург, 2014. – 512с.
2. В.С. Пташинский, Самоучитель Office 2013– Москва, Издательство Эксмо,2013. – 288с.
4. О.В.Спиридонов, Microsoft Office для пользователя– Москва, Издательство Эксмо,2013– 350с.
5. Н.В.Макарова, В.Б. Волков, Информатика – Санкт-Петербург, Издательство Питер,2011– 576с.
6. Г.Н.Хубаев, С.М. Патрушина, Н.Г. Савельева, Е.Г. Веретенникова, Информатика– Ростов-на-Дону, Издательство Феникс,2010– 288с.
7. Ю.И.Кудинов, Ф.Ф. Пащенко, А.Ю. Келина, Практикум по основам современной информатики – Санкт-Петербург, Издательство Лань, 2011– 352 с.
8. Ю.И. Кудинов ,Ф.Ф. Пащенко, Основы современной информатики– Санкт-Петербург, Издательство Лань ,2011– 256 с.
9.А.В. Гураков, Информатика. Введение в Microsoft Office –Томск, издательство Эль Контент, 2012– 120с.
10. А.С.Грошев, Информатика.Учебник для вузов-Архангельск,издательство Архангельского государственного технического университета,2010-470с.
11. А.С.Грошев, Программирование на языке Microsoft Visual Basic for Applications.Методические указания к выполнению лабораторных работ.- Архангельск, издательство Архангельского государственного технического университета,2013-35с.
12. С.Каммингс, VBA для “чайников”-Москва,Издательский дом “Вильямс”,2002-448с.
13. А.Н.Любин, Создание пользовательских форм в Visual Basic for Applications.Учебное пособие-Москва,издательство МГМУ “МАМИ” ,2012-60с.
14.Л.А.Демидова, А.Н.Пылькин, Программирование в среде Visual Basic for Applications.Практикум-Москва,Горячая линия-Телеком,2014-175с.
15. И.С.Осетрова, Н.А.Осипов, Microsoft Visual Basic for Applications.Учебное пособие- Санкт-Петербург, Издательство НИУ ИТМО ,2013– 130 с.
16. В.М.Пестриков, А.Н.Маслобоев, Основы программирования в Microsofr Word на Visual Basic for Applications.Учебное пособие.- Санкт-Петербург, Издательство ГТУ РП ,2010– 83 с.
17. В.Жельников, Кpиптогpафия от папиpуса до компьютеpа- Москва.,издательство ABF, 1996-190с.
18. Н.А. Устинов, Microsoft Office.Разработка документов в Word, Excel и приложений на Visual Basic for Application.-Нижний Новгород, Издательство Нижегородского государственного университета им. Н. И. Лобачевского, 2004г.-157с.
