파일을 암호화 시키는 가장 기본적인 방법입니다

블럭단위로 입출력을 하기 위해서 이진모드로 처리를 하겠습니다


암호화 / 복호화 되는 전체구조를 파악하기 위해서 제작되었으니 암호화 관련 학습이 아니더라도 아래의 내용을 학습하는데 도움이 되리라 판단됩니다

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

출처 : 데브피아

+ Recent posts