Mã hóa, và giải mã và các khai báo ở đầu một module

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,699
Giới tính
Nam
Mã:
Option Explicit
Option Private Module

'Đây là mã khoá mặc định để Mã hoá hoặc giải mả (Decrypt or Encrypt)
Private Const csKeyCode As String = "Le Hoang"
'XOR encryption
'http://www.codetoad.com/visual_basic_better_xor.asp

'---------------------------------------------------------------------------------------
' Procedure         : Decrypt
' DateTime          : 13/07/2008 12:40
' Author            : http://www.codetoad.com/visual_basic_better_xor.asp
' Purpose/Mục đích   : Giải mã dữ liệu / Decrypt data
'                    CodeKey: chuổi ký tự dùng để giả mã
'                    DataIn: chuổi ký tự cần giải mã
'                     
' Ví dụ   : x = Decrypt("24044E3E412048251B2D0D15", "Thanh Nhan")
'             Kết quả ta được chuổi đã giải mã sau
'             x = Le Van Duyet
'---------------------------------------------------------------------------------------
'
Function Decrypt DataIn As String, Optional KeyCode As String = vbNullString) As String

    Dim lonDataPtr As Long
    Dim strDataOut As String
    Dim intXOrValue1 As Integer
    Dim intXOrValue2 As Integer
    If Len(KeyCode) = 0 Then
        KeyCode = csKeyCode
    End If
    For lonDataPtr = 1 To (Len(DataIn) / 2)
        'The first value to be XOr-ed comes from the data to be encrypted
        intXOrValue1 = Val("&H" & (Mid$(DataIn, (2 * lonDataPtr) - 1, 2)))
        'The second value comes from the code key
        intXOrValue2 = Asc(Mid$(KeyCode, ((lonDataPtr Mod Len(KeyCode)) + 1), 1))
        strDataOut = strDataOut + Chr(intXOrValue1 Xor intXOrValue2)
    Next lonDataPtr
    Decrypt = strDataOut

End Function

'---------------------------------------------------------------------------------------
' Procedure : Encrypt
' DateTime  : 13/07/2008 12:38
' Author    : http://www.codetoad.com/visual_basic_better_xor.asp
' Purpose   : Mã hoá dữ liệu / Encrypt data
'             CodeKey: chuổi ký tự dùng để mã hoá
'             DataIn: chuổi ký tự cần mã hoá
'                     
' Ví dụ   : x = Encrypt("Le Van Duyet", "Thanh Nhan")
'             Kết quả ta được chuổi đã mã hoá sau:
'             x = 24044E3E412048251B2D0D15

'---------------------------------------------------------------------------------------
'
Function Encrypt DataIn As String, Optional KeyCode As String = vbNullString) As String

    Dim lonDataPtr As Long
    Dim strDataOut As String
    Dim Temp As Integer
    Dim tempstring As String
    Dim intXOrValue1 As Integer
    Dim intXOrValue2 As Integer
    If Len(KeyCode) = 0 Then
        KeyCode = csKeyCode
    End If
    For lonDataPtr = 1 To Len(DataIn)
        'The first value to be XOr-ed comes from the data to be encrypted
        intXOrValue1 = Asc(Mid$(DataIn, lonDataPtr, 1))
        'The second value comes from the code key
        intXOrValue2 = Asc(Mid$(KeyCode, ((lonDataPtr Mod Len(KeyCode)) + 1), 1))
        Temp = (intXOrValue1 Xor intXOrValue2)
        tempstring = Hex(Temp)
        If Len(tempstring) = 1 Then tempstring = "0" & tempstring
        strDataOut = strDataOut + tempstring
    Next lonDataPtr
    Encrypt = strDataOut

End Function
Và sau đây là ví dụ sử dụng các thủ tục trên:

Mã:
Private Sub test1()
    Dim sTest As String

    sTest = "Le Van Duyet"
'Bắt đầu mã hoá
    sTest = Encrypt(sTest)
'Thông báo chuổi đã mã hoá
    MsgBox "The encrypt string is " & sTest, vbOKOnly + vbInformation, "Thông báo"
 'Bắt đầu giải mã
    sTest = Decrypt(sTest)
'Thông báo chuổi sau khi giải mã
    MsgBox "The string after decrypt is " & sTest, vbOKOnly + vbInformation, "Thông báo"

End Sub

Xin các bạn chú ý cho:
1. Option Private Module
2. Private Const

Các bạn có tự hỏi, làm sao lại có Private không?
Chúng ta sẽ đi tìm hiểu tiếp nha.
 
Lần chỉnh sửa cuối:
Tại sao lại là Option Private hay Private Const

1. Khai báo Option Private Module

Khi sử dụng thì khai báo Option Private phải được đặt ở đầu module, trước tất cả các thủ tục (procedures).

Khi khai báo như trên, các thành phần như: biến (variables), đối tượng (objects) hoặc khai báo kiểu người dùng (user-defined types) ở mức module vẫn có thể dùng được trong project chứa module đó, nhưng các thành phần đó sẽ không dùng được trong các ứng dụng/ project khác.

Nhân tiện đây nói luôn về khai báo Option Explicit
Khai báo này được đặt ở đầu module. Khai báo này nhằm bắt buộc phải khai báo tất cả biến chúng ta sử dụng trong module đó. Lúc này ta phải dùng Dim, Private, Public, ReDim, hay Static để khai báo cho tất cả các biến sử dụng.
Vậy nếu chúng ta không khai báo Option Explicit thì sao?
Khi chúng ta không khai báo, thì các biến sẽ được xem là kiểu Variant. Nói tóm nếu chúng ta dùng khai báo Option Explicit, chương trình sẽ bắt buộc chúng ta khai báo kiểu cho tất cả các biến. Như vậy chúng ta sẽ tránh được tình trạng kiểu không đúng và tránh được việc lảng phí bộ nhớ.

2. Khai báo Option Base {0 | 1}

Đôi khi các bạn đọc một số module được đưa lên diễn đàn, ở đầu module có khai báo
Option Base 1
Đây khai báo gì đây?

Khai báo này tương tự khai báo Option Explicit, cũng phải đặt trên đầu module và phải đặt trước tất cả các thủ tục (procedures).
Khai báo này nhằm quy định phần tử đầu tiên trong mảng sẽ là 1
Mặc định tất cả các mảng sẽ bắt đầu bằng 0.

Chú ý: Mảng được tạo với ParamArray phần tử đầu tiên vẫn bắt đầu từ 0. Khai báo Option Base sẽ không ảnh hưởng đến ParamArray does not affect ParamArray (hoặc hàm mảng, ví dụ như VBA.Array).

Khai báo Option Base chỉ ảnh hưởng đến phần tử đầu tiên của các mảng trong module có khai báo mà thôi.

Ví dụ:
Mã:
Option base 1   

Dim Lower
Dim MyArray(20), TwoDArray(3, 4)   ' Khai báo các biến mảng
' Use LBound function to test lower bounds of arrays.
Lower = LBound(MyArray)   ' Sẽ trả về 1
Lower = LBound(TwoDArray, 2)   ' Sẽ trả về 1

Dim ZeroArray(0 To 5)   ' [COLOR="blue"]Thử khai báo phần tử phần tử đầu tiên bắt đầu từ 0[/COLOR].
Lower = LBound(ZeroArray)   ' [COLOR="blue"]Sẽ trả về 0[/COLOR]

Vậy khi đã khai báo Option base 1 ở đầu module. Nếu muốn phần tử đầu tiên bắt đầu từ 0 thì bạn phải khai báo như ví dụ ở trên.
Các bạn đọc thêm tại đây.

3. Khai báo Option Compare
Vị trí khai báo cũng tương tự như các khai báo tôi đã nói ở trên.

Option Compare {Binary | Text}

Nếu không khai báo thì mặc định là Option Compare Binary
Với khai báo Option Compare Binary thì chuỗi được so sánh theo mã của các ký tự ANSI như sau:
Mã:
A < B < E < Z < a < b < e <...< z < À <...< Ê < Ø < à < ê < ø
Với khai báo Option Compare Text thì chuỗi được so sánh dựa trên case-insensitive sort order (tùy thuộc vào việc thiết lập của từng máy tính).
Mã:
A = a < À = à < B = b < . . . < Z = z < Ø = ø
Vậy việc khai báo Option Compare được dùng chủ yếu trong những module có việc so sánh các chuổi ký tự/hoặc các thao tác tìm kiếm chuổi.

Các bạn có thể đọc thêm tại đây.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom