파일을 암호화 시키는 가장 기본적인 방법입니다
블럭단위로 입출력을 하기 위해서 이진모드로 처리를 하겠습니다
암호화 / 복호화 되는 전체구조를 파악하기 위해서 제작되었으니 암호화 관련 학습이 아니더라도 아래의 내용을 학습하는데 도움이 되리라 판단됩니다
1. Const 선언과 활용법
2. Type문 및 레코드 처리
3. For~Next문
4. Binary I/O 및 Get,Put
5. Drive,Dir,File 컨트롤 활용
1. 초기화면을 살펴보겠습니다
2. 암호화를 한 화면입니다
처리할 폴더로 이동한 다음 파일을 선택하고 <암호화>를 누릅니다
그러면 아래와 같이 처리가 완료되었다는 메세지가 나옵니다
3. 원본 파일과 암호화된 파일의 내용을 보겠습니다
4. 소스 코드를 살펴보겠습니다
변수의 선언을 요구합니다
Option Explicit
임시로 사용할 파일입니다
Const TEMP_FILE = "C:\TEMPFILE.$$$"
암호화된 파일의 첫부분에 들어갈 문자열입니다
Const ID = "나만의 암호화 프로그램 V1.0"
암호화 키(KEY)입니다. 키를 확장하실려면 이부분을 배열로 선언하고 길이를 늘리면 됩니다
Const LOCK_CODE = &H13
암호화된 파일의 첫부분에 들어갈 구조입니다(파일헤더 입니다)
Private Type HEAD_RECORD
ID As String * 50 내가 만든 암호화 데이터인지 확인할 식별 코드
METHOD As Byte 암호화 방식(1: XOR) (2,3,.... 알고리즘 코드입니다)
End Type
Dim HEAD As HEAD_RECORD HEAD_RECORD형을 갖는 변수 HEAD
Dim i%, cnt&
Dim data As Byte 파일에서 읽고/쓸때 필요한 바이트형 변수
-------------------------------------------------------------------------------------------
사용자 함수: 파일리스트에 있는 파일들을 전체선택/전체해제 합니다
선택: True-선택, False-해제
Private Sub 선택해제(선택 As Boolean)
For i% = 0 To File1.ListCount - 1
File1.Selected(i%) = 선택
Next i%
End Sub
-------------------------------------------------------------------------------------------
Private Sub cmd모두선택_Click()
Call 선택해제(True)
End Sub
-------------------------------------------------------------------------------------------
Private Sub cmd모두해제_Click()
Call 선택해제(False)
End Sub
-------------------------------------------------------------------------------------------
선택된 파일을 복호화 합니다
Private Sub cmd복호화_Click()
파일 리스트에 있는 파일들을 처리할려고 시도합니다
ListIndex는 0부터니까 -1을 해줍니다
For i% = 0 To File1.ListCount - 1
선택된 파일만 처리합니다
If (File1.Selected(i%)) Then
선택된 파일을 읽기 전용으로 엽니다
Open Dir1.Path & "\" & File1.List(i%) For Binary Access Read As #1
Get #1, , HEAD
내가 만든 암호화 파일인지를 검사하여 맞으면 처리합니다
If (Left$(HEAD.ID, Len(ID)) = ID) Then
임시파일을 쓰기 전용으로 엽니다
Open TEMP_FILE For Binary Access Write As #2
파일전체 길이에서 헤더길이를 뺀 길이만큼 수행합니다
For cnt& = 1 To FileLen(Dir1.Path & "\" & File1.List(i%)) - Len(HEAD)
한바이트를 읽어옵니다
Get #1, , data
LOCK_CODE와 XOR 연산을 하여 임시파일에 저장합니다
data = data Xor LOCK_CODE
Put #2, , data
Next cnt&
열려있는 파일을 모두 닫습니다
Close
원본 파일을 삭제하고 임시파일을 원시파일로 이름 변경합니다
Kill Dir1.Path & "\" & File1.List(i%)
Name TEMP_FILE As Dir1.Path & "\" & File1.List(i%)
Else
내가 만든 암호화 파일이 아니면 처리하지 않습니다
Close #1
End If
End If
Next i%
처리가 완료 되었으면 메세지를 출력합니다
MsgBox "복호화 작업을 완료하였습니다", vbInformation, "정보"
End Sub
-------------------------------------------------------------------------------------------
선택된 파일을 암호화 합니다
주의: 암호화된 파일이 두 번 암호화 되지 않도록 하는것은 숙~~제 입니다
Private Sub cmd암호화_Click()
HEAD.ID = ID 식별 코드 문자열입니다
가능한 길게 주어서 한 번 암호화된 파일이 두번 되지 않도록 합니다
HEAD.METHOD = 1 1(XOR 연산) 2(DES),3(SEED),4,... 255
파일 목록에 있는 모든 파일을 처리할려고 시도합니다
For i% = 0 To File1.ListCount - 1
선택된 파일만 처리하도록 합니다
If (File1.Selected(i%)) Then
원본 파일을 읽기전용으로 엽니다
Open Dir1.Path & "\" & File1.List(i%) For Binary Access Read As #1
임시파일을 쓰기전용으로 엽니다
Open TEMP_FILE For Binary Access Write As #2
해더정보를 먼저 저장합니다
Put #2, , HEAD
원본 파일의 길이만큼 암호화 시킵니다
For cnt& = 1 To FileLen(Dir1.Path & "\" & File1.List(i%))
원본 파일에서 한바이트를 읽습니다
Get #1, , data
암호화 비트연산을 수행합니다
data = data Xor LOCK_CODE
임시파일에 저장합니다
Put #2, , data
Next cnt&
열려있는 모든 파일을 닫습니다
Close
원본 파일을 삭제합니다
Kill Dir1.Path & "\" & File1.List(i%)
임시파일을 원본파일로 이름 변경합니다
Name TEMP_FILE As Dir1.Path & "\" & File1.List(i%)
End If
Next i%
처리가 완료되었다는 메세지를 보여줍니다
MsgBox "암호화 작업을 완료하였습니다", vbInformation, "정보"
End Sub
-------------------------------------------------------------------------------------------
프로그램을 종료합니다
Private Sub cmd종료_Click()
End
End Sub
-------------------------------------------------------------------------------------------
드라이브가 변경되었을때 처리
Private Sub Drive1_Change()
On Error GoTo ERROR_DRIVE
Dir1.Path = Drive1.Drive
Exit Sub
드라이브를 변경했는데, 오류가 나면 여기로 옵니다
A:드라이브에 디스켓이 없는 경우,CD_ROM 드라이브에 CD가 없는 경우등 입니다
ERROR_DRIVE:
MsgBox Err.Description, vbCritical, "오류"
End Sub
-------------------------------------------------------------------------------------------
다른 폴더가 선택이 되었을때 처리
Private Sub Dir1_Change()
File1.Path = Dir1.Path
End Sub
-------------------------------------------------------------------------------------------
시작 함수
Private Sub Form_Load()
폼을 화면의 중앙에 위치하도록 합니다
Left = (Screen.Width - Me.Width) / 2
Top = (Screen.Height - Me.Height) / 2
End Sub
==============================================================================
==============================================================================
5. 여러분이 확장할 수 있는 부분들입니다
(1) 해더부분에 여러분의 정보등 기타 정보들을 넣을 수 있습니다
(2) 속도 개선을 위하여 블럭단위(배열이용)로 입출력합니다
(3) 암호화 알고리즘(SEED,DES,....R...)을 접목할 수 있으며, 알고리즘을 선택하도록 할 수도 있습니다
(4) 하위 폴더까지 처리를 할 수 있습니다
(5) 암호화 키의 자릿수를 확장할 수 있습니다
감사합니다
강좌의 원본페이지: http://www.complus.pe.kr/lecture/vb/VB_fileio_09.html
출처 : 데브피아