Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Visual Basic 6.0~03.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
4 Мб
Скачать
☆

Мал. 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).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]