Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Мал. 8.5. Форма для програми шифрування.






5. Відкрийте вікно програми і виберіть із списку Object, що розкривається, рядок mnuFHeExit.

6. Додайте в процедуру події mnuFileExit_Click() оператор End.

7. Настав час запрограмувати алгоритм шифрування. Відкрийте секцію(Declarations) і додайте в неї наступний фрагмент:

 

Function Encrypt(infile As String) As Boolean

Dim fileno1 As Integer

Dim fileno2 As Integer

Dim outfile As String

Dim xpos As Long

Dim x As Byte

 

‘ Вивести покажчик у вигляді пісочного годинника

MousePointer = vbHourglass

 

xpos = 4

 

outfile = " c: \temp.enc"

 

fileno1 = FreeFile

Open infile For Binary As fileno1

fileno2 = FreeFile

Open outfile For Binary As fileno2

Put #fileno2, 1, 0

Put #fileno2, 2, 128

Put #fileno2, 3, 0

Put #fileno2, 4, 128

 

Do While Not EOF(fileno1)

xpos = xpos + 1

Get #fileno1, xpos, x

Get #fileno2, xpos, x + 128

Loop

Close fileno2

Close fileno1

 

‘ Видалити початковий файл і замінити його шифрованим

Kill infile

FileCopy outfile, infile

Kill outfile.

Encrypt = True

 

‘ Відновити покажчик миші

MousePointer = vbNormal

End Function

 

Цей фрагмент варто розглянути детальніше, оскільки саме в нім відбувається основна робота програми. Зверніть увагу на те, що замість процедури Sub використовується функція - річ у тому, що функція передає зухвалій процедурі код повернення. По йому можна визначити, чи успішно сталося шифрування, перш ніж повідомляти про це користувачеві або продовжувати виконання програми. Ця функція просто повертає True, якщо шифрування пройшло успішно, і False інакше. Крім того, функції передається параметр infile. Він містить повне ім'я шифрованого файлу. Значення infile визначається викликом функції GetFile().

Після стандартного оголошення змінних ми перетворюємо покажчик миші на пісочний годинник. Це означає, що користувач повинен почекати завершення поточної операції. Річ у тому, що побайтове читання файлу може виявитися досить довгим процесом.

Як згадувалося раніше, команда FreeFile використовується для отримання вільного файлового номера. Коли я працював над цим прикладом, в моїй програмі поряд стояли два оператори FreeFile. Я поступив так, оскільки прагну по можливості групувати логічно пов'язані команди. При запуску програми вона постійно видавала помилку " Файл вже відкритий". Чому? Я перевірив у відналадчику значення infile і outfile - вони були правильними. Мої файли не відкривалися іншими застосуваннями, тому вони не могли бути заблоковані іншою програмою. Після деяких роздумів я зрозумів, що файловий номер виділяється програмі не в операторові FreeFile, a при відкритті файлу оператором Open (FreeFile просто повідомляє, які файлові номери доступні в даний момент). У результаті я отримував один і той же номер для fileno1 і fileno2. Як тільки я перемістив команди FreeFile до відповідних операторів Open, програма запрацювала. Мораль: прагніть тримати виклик FreeFile як можна ближче до оператора Open, особливо якщо ваша процедура працює з декількома файлами. Як бачите, навіть просту програму іноді доводиться відналагоджувати!

Перш ніж приступати до безпосередньої обробки даних, ми додаємо в початок шифрованого файлу деяку подібність " електронного підпису". По їй алгоритм розшифровки визначає, чи дійсно файл зашифрований. Підпис має бути послідовністю байтів, яка практично ніколи не зустрічається у файлах. У своєму прикладі я використовував чотирьохбайтовий підпис 0, 128, 0, 128. Саме цю конкретну послідовність байтів шукатиме алгоритм дешифрування. Функції Encrypt і Decrypt можна додатково удосконалити, щоб електронний підпис генерувався прямо в них.

Зверніть увагу - змінна x має байтовий, а не цілий тип. Причина полягає в тому, що її максимальне значення не повинне перевищувати 255. Якщо при складанні x з іншим числом результат перевищить 255, значення x обнулюється, після чого підсумовування триває. Якщо скласти 128 і 128, вийде 256. Оскільки 256 більше, ніж 255, змінна x обнулюється - на цьому принципі заснований наш алгоритм шифрування. При дешифруванні файлу той же алгоритм відновлює початкові значення байтів. Якщо двічі додати 128 до будь-якого байта, ви отримаєте початкову величину, тобто зашифрований символ повернеться до колишнього стану.

У кінці функції стоять оператори Kill, які видаляють файли з диска. Після такої послідовності команд файл infile замінюється файлом outfile. B результаті у вас залишається зашифрований файл, а тимчасовий файл стирається з диска. Проте перед перейменуванням файлу необхідно потурбуватися про те, щоб ім'я результуючого файлу було унікальним, - саме з цієї причини ми видаляємо infile перед тим, як перейменовувати outfile. Після успішного перейменування outfile віддаляється з диска.

Шифрування завершене, тому ми відновлюємо колишній вид покажчика миші - користувач повинен зрозуміти, що програма готова до роботи. Функція Encrypt повертає значення True, щоб зухвала процедура могла нормально тривати.

1. Основа програми (функція шифрування) готова. Тепер необхідно створити процедуру, з якої вона викликатиметься. Для цього ми скористаємося процедурою події mnuEncrypt_Click():

Private Sub mnuActEncrypt_Click()

Dim filename As String

filename = GetFile()

If filename < > " " Then

If Encrypt(filename) = False Then

MsgBox " Помилка при шифруванні файлу"!

End If

End If

 

End Sub

2. Перед викликом функції Encrypt команда меню повинна отримати ім'я файлу за допомогою функції GetFile():

Function GetFile() As String

dlgFile.CancelError = True

On Error GoTo filerr

dlgFile.DialogTitle =" Виберіть файл.".

dlgFile.DefaultExt = " *.txt"

dlgFile.Filter = " Текстові файли (*.txt)|*, txt* _

Усі файли (*. *)|*.*"

dlgFile.FilterIndex = 1

dlgFile.MaxFileSize = 32767

dlgFile.ShowOpen

GetFile = dlgFile.filename

Exit Function

filerr:

GetFile = " "

End Function

Функцію GetFile() теж слід розглянути уважніше. У основі її лежить елемент стандартного діалогового вікна. Він надає усі засоби, необхідні для отримання імені файлу. Можливо, ви вже знаєте, що вікно Open, що зустрічається в багатьох застосуваннях, не відкриває файл - воно усього лише отримує і повертає додатку його ім'я. Потім інша процедура використовує це ім'я і відкриває файл для подальшої обробки. Наша програма поступає точно так же.

Робота функції GetFile() починається з того, що властивості CancelError привласнюється значення True. В цьому випадку при натисненні користувачем кнопки Cancel діалогове вікно посилає повідомлення про помилку. Ми перехоплюємо цю помилку, щоб у разі відміни програма не намагалася продовжувати шифрування. Процедура шифрування пропускається за допомогою команди On Еггог.

З естетичних міркувань ми задаємо властивості DialogTitle значення " Виберіть файл."., що робить нашу програму трохи наочнішою. Насправді в заголовок діалогового вікна можна помістити будь-який текст.

За умовчанням для файлів в діалоговому вікні вибирається розширення *.txt. Читачі, знайомі з командами DOS, зрозуміють, що з цим шаблоном у вікні відображуватимуться лише файли з розширенням.txt - це допомагає зосередити увагу користувача лише на файлах, що цікавлять його. Якщо у ваших застосуваннях використовуються стандартні діалогові вікна, прагніть спростити роботу користувача.

Після шаблону задається фільтр (властивість Filter). Він є рядком, в якому описи чергуються з фактичними значеннями фільтру, а як роздільник застосовується символ " вертикальна риса" (|). У нашому застосуванні, як і в багатьох інших, задано декілька фільтрів. Від вас вимагається лише правильно відділяти їх один від одного вертикальною рисою. Доступ до різних фільтрів здійснюється за допомогою властивості FilterIndex. FilterIndex - індекс поточного фільтру, що відображується в діалоговому вікні. Перший фільтр має індекс 1, другий - 2 і т. д. При завданні цієї властивості встановлюється лише початкове значення індексу. Поточний фільтр вибирається в діалоговому вікні (мал. 8.6).

 

Мал. 8.6. Стандартне діалогове вікно.

Зверніть увагу - властивості MaxFileSize задається значення 32 767. Якщо задати цю властивість, в діалоговому вікні відображуватимуться лише імена файлів розміром 32 До і менше. Цій властивості можна задати довільне значення, але необхідно потурбуватися про те, щоб файли, що відкриваються, не виходили за межі можливостей елементів. Втім, у виконуваних нами операціях розмір файлу ніде не обмежується, так що для цього додатку властивість MaxFileSize не має особливого значення.

Нарешті, ми задаємо властивість ShowOpen, щоб відобразити діалогове вікно. Якщо користувач натискає кнопку Cancel, діалогове вікно повертає код помилки, а робота функції відміняється. Інакше властивості FileName задається ім'я файлу, вибраного користувачем, і це значення повертається функцією GetFile(). Якщо ім'я файлу не вибране, функція повертає порожній рядок. Давайте напишемо алгоритм дешифрування, який відновлюватиме початковий вид файлу:

1. Додайте наступний фрагмент:

Private Function Decrypt(infile As String) As Boolean

Dim fileno1 As Integer

Dim fileno2 As Integer

Dim outfile As String

Dim xpos As Long

Dim x As Byte

Dim t(3) As Byte

 

‘ Вивести покажчик у вигляді пісочного годинника

MousePointer = vbHourglass

 

xpos = 4

outfile = " c: \temp.enc"

fileno1 = FreeFile

Open infile For Binary As fileno1

fileno2 = FreeFile

Get #fileno1, 1, t(0)

Get #fileno1, 2, t(1)

Get #fileno1, 3, t(2)

Get #fileno1, 4, t(3)

If (t(0)=0 And t(1)=128 And t(2)=0 And t(3)=128) Then

Open outfile For Binary As fileno2

Do While Not EOF(fileno1)

xpos = xpos + 1

Get #fileno1, xpos, x

Get #fileno2, xpos - 4, x + 128

Loop

Close fileno2

 

Decrypt = True

Else

Decrypt = False

End If

 

Close fileno1

 

‘ Видалити початковий файл і замінити його шифрованим

If Decrypt Then

Kill infile

FileCopy outfile, infile

Kill outfile

End If

 

‘ Відновити покажчик миші

MousePointer = vbNormal

 

End Function

 

Зверніть увагу на те, що ця функція майже співпадає з функцією шифрування. Перед розшифровкою файлу необхідно переконатися, що він починається з електронного підпису, тобто ланцюжки байтів 0, 128, 0, 128. В процесі шифрування програма вставляє її в початок зашифрованого файлу. Завдяки підпису додаток визначає, чи дійсно файл був зашифрований, перед тим, як намагатися розшифрувати його.

2. Додайте код для виклику функції Decrypt при виборі з меню відповідної команди:

 

Private Sub mnuActDecrypt_Click()

Dim filename As String

 

filename = GetFile()

If filename < > " " Then

If Decrypt(filename) = False Then

MsgBox " Помилка при розшифровці файлу"!

End If

End If

End Sub

 

Програма готова - збережете і Запустіть її. Хоча нічого особливо ефектного не відбувається, цей приклад наочно показує, як відбуваються запис і читання файлів з диска. Тепер ви маєте достатній досвід роботи з файлами і зможете застосовувати їх у своїх програмах.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.