Dùng VBA trong excel để mã hóa 1 đoạn văn bản

  • Thread starter SA_DQ
  • Ngày gửi
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
CÁC LOẠI MẬT MÃ THAY THẾ KHÁC NHAU​

Trước đây hơn 20 thế kỷ, khu vực Trung Đông lúc bấy giờ có nền văn minh nổi bậc nhất thế giới;
Người ta đã biết mã hóa những mệnh đề cần thiết gởi cho người cần biết í nghĩa thực về nó (Còn những người khác, tuy có đọc nó cũng không biết í nghĩa thực của đoạn văn bản là gì)

Để làm được điều đó thời bấy giờ, người ta dùng các chữ cái khác thay thế cho các chữ cái trong mệnh đề;

Để các bạn dễ hình dung, ta lấy vì dụ ta có mệnh đề: "TRI THUC LA SUC MANH" (Mệnh đề A)

Đó là mệnh đề do dùng ngôn ngữ tạo bỡi các chữ cái
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" (Bảng chữ cái) tạo ra;

Nhưng để bí mật mệnh đề này với hầu hết mọi người, tác giả hẹn ước với người nhận thư tín (người được fép đọc nó) với nhau là tôi đã thay chữ cái 'A' là kí tự 'F', 'B' bằng 'G', & cứ thế tiếp tục,. . . .

Có nghĩa là người này dùng các chữ cái

"VWZXYABCDEFGHIJKLMNOPQRSTU" (Bảng mã hóa) để thay tương tứng

Như vậy mệnh đề A sẽ được thể hiện như vầy: "OMD OCPX GV NPX HVIC"

Chú í ta sẽ thấy chữ 'O' ở dòng thuộc bảng mã hóa trùng cột với kí tự 'T' của bảng chữ cái & chữ 'C' tương ứng với 'H' của bảng chữ cái,. . . . .

Nhưng người xưa người ta dò bằng tay để lấy ra những kí tự tương ứng & thay thế;

Giờ mà làm chuyện như vậy, tổ tiên sẽ cười chúng ta là cái chắc!

Vậy nên để mã hóa 1 văn bảng dài, ta đem nó đưa lên các dòng của excel & xài hàm sau để mã hóa cũng như giải mã (chu trình ngược lại với việc mã hóa) các đoạn văn bản:

Mã:
Option Explicit
[B]Function MaHoa5(StrC As String, Optional Thuan As Boolean = True) As String[/B]
 Const Alf As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 Const Khoa As String = "VWXYZ" & Alf
 Dim J As Long, I As Long, VTr As Long

 For J = 1 To Len(StrC)
    VTr = InStr(IIf(Thuan, Alf, Khoa), Mid(StrC, J, 1))
    If VTr > 0 Then
        MaHoa5 = MaHoa5 & Mid(IIf(Thuan, Khoa, Alf), VTr, 1)
    Else
        MaHoa5 = MaHoa5 & " "
    End If
 Next J
[B]End Function[/B]

Chúc các bạn vui vẻ!
 
Khóa học Quản trị dòng tiền
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
Ðề: Xin diễn dịch & hướng dẫn cách sử dụng.

Trong hàm tự tạo trên, vào đầu chúng ta khai báo 2 hằng kiểu chuỗi (Đó là Alf & Khoa)
Mà trong đó hằng đầu là bảng chữ cái 26 kí tự của ngôn ngữ anh văn); Còn hằng sau là chuỗi fát sinh từ hằng trước nhưng dịch chuyển đi 5 kí tự
Sau đó ta khai báo các biến kiểu 'Long' để dùng trong hàm;

Tiếp tới ta xây dựng vòng lặp để duyệt từ đầu chí cuối mệnh đề ta cần mã hóa hay giải mã; (Ở đây mệnh đề cần mã hóa chúng ta ví dụ là "TRI THUC LA SUC MANH")
Có nghĩa là ta duyệt lần lượt từng từ, kể từ vần 'T' cho đến vần cuối là vần 'H'
Để vậy ta nhờ hàm InStr(..,...) để xác định vị trí từng kí tự đem duyệt nằm ở vị trí nào trong hằng Alf
Khi ta biết được vị trí của nó trong Alf, ta cắt lấy kí tự của vị trí ấy trong hằng 'Khoa' để nối tiếp vô kết quả của lần trước đó đã thực hiện; & cứ thế cho đến hết.

(Quá trình giải mã cũng là quá trình mã hóa, nhưng hằng đích & hằng nguồn đổi vị trí cho nhau mà thôi)

Để thực hiện trên excel, ta lấy trang tính trắng; Tại cột [A:A] ta nhập các mệnh đề cần mã hóa
Tại cột [c:C] với các hàng tương ứng bến [A:A] chứa dữ liệu, ta nhập cú fáp =MaHoa5(A1) (cho dòng đầu)
Sau khi {ENTER} ta sẽ thấy kết quả: OMD OCPX GV NPX HVIC (Trong trường hợp [A1] đang chứa mệnh đề nêu trên)

Nếu ở ô nào đó trên [A:A], ta nhập chuỗi này "OMD OCPX GV NPX HVIC" (như [A7])
& ở [C7] ta nhập cú fáp hàm =MaHoa5(A7,FALSE) ta sẽ có lại mệnh đề ban đầu

Như vậy, ta thấy: Để mã hóa, cú fáp hàm ta không cần nhập tham biến; & để tái hiện mệnh đề nguồn đã mã hóa, ta thêm tùy chọn 'FALSE'

Tất cả những điều này là ta đang nói đến bảng chữ cái tiếng Anh; Với tiếng Việt ta hãn hữu gặp các từ Z, F, W & J được sử dụng; Nếu trong giao hẹn giữa bên truyền tin & bên nhận tin không xài các kí tự này trong các mệnh đề nguồn, thì lúc đó ta có thể biến hóa, để mệnh đề mã hóa không có khoảng trống nào; Các bạn có thể hỏi: Để làm chi vậy?
Xin trả lời: Để việc bảo mật cao hơn có thể
Vì khi có việc mã hóa, thì sẽ xuất hiện đội ngũ tò mò giải mã, 1 khi đang có trong tay 1 văn bản đã mã hóa

& các từ "OMDAOCPXAGVANPXAHVIC" khó hóa giải hơn các từ trong cụm "OMD OCPX GV NPX HVIC"

Thân & chúc vui!@
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
Ðề: Dùng 26 kí tự tiếng Anh để biểu diễn 22 kí tự tiếng Việt & khoảng trống

Macro sau đây sẽ thay thế các khoảng trống trong mệnh đề cần mã hóa trong tiếng Việt
& dịch ngược các mệnh đề mã hóa sang tiếng Việt (không dấu)

Ví dụ tại [A1] ta có câu: "TRI THUC LA SUC MANH"

Tại [C1] ta xài cú fáp =Mahoa_(J1), ta sẽ thấy xuất hiện tại ô này, có thể là chuỗi: "OMDJOCPXFGVZNPXJHVIC"

& khi cần dịch ngược, ta xài cú fáp: =Mahoa_(C2,FALSE) để thu được mệnh đề ban đầu

Hàm tự tạo để giúp các bạn trong việc này là :

Mã:
[B]Function MaHoa_(StrC As String, Optional Thuan As Boolean = True) As String[/B] Const Alf As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 Const Khoa As String = "VWXYZ" & Alf
 Dim J As Long, I As Long, VTr As Long
    
 For J = 1 To Len(StrC)
    VTr = InStr(IIf(Thuan, Alf, Khoa), Mid(StrC, J, 1))
    If VTr > 0 Then
        If InStr("FJWZ", Mid(StrC, J, 1)) Then
            MaHoa_ = MaHoa_ & " "
        Else
            MaHoa_ = MaHoa_ & Mid(IIf(Thuan, Khoa, Alf), VTr, 1)
        End If
    Else
        If Thuan Then
            Randomize
            MaHoa_ = MaHoa_ & Mid("FJWZ", 1 + Rnd() * 3 \ 1, 1)
        End If
    End If
 Next J
[B]End Function[/B]

Trong hàm có xài đến hàm tạo số ngẫu để lấy ngẫu nhiên 1 trong 4 kí tự F, J, W & Z để thay cho khoảng trống
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
Ðề: Dùng 2 chuỗi mã hóa lần lượt để thay thế.

Như chúng ta đã biết, đã có đoạn mã bí mật thì sẽ có nhu cầu giải mã để biết hay trộm thông tin; Bỡi vậy mà từ 20 thế kỷ trước đã xuất hiện ngành fân tích & tìm chìa khóa mật mã của đoạn văn đã mã hóa để biết rõ về nó.

Vậy ta tự hỏi, chìa khóa trong mã hóa nêu ở bài 1 là gì?

Đó là chuỗi ký tự liên tiếp các chữ cái tiếng Anh bắt đầu bằng kí tự 'V'
Hay ngắn gọn, ta nói mệnh đề đó được mã hóa bằng khóa là chuỗi 'V', hay chỉ đơn giản là: Chìa khóa là chữ 'V'

Chỉ vài năm sau, việc mã hóa này cũng lộ tảy, tuy có thay chìa khóa 'V' bằng các chìa khóa khác (ngoài 'A', hiễn nhiên)
Cách mà người giải mã là thống kê tần suất xuất hiện các kí tự & tìm ra qui luật của chìa khóa;

Bỡi thế nên cách mã hóa trên trở thành bỏ xó; Người đời sản sinh là chìa khóa gồm 2, 3, 4,. . . từ, như

'HN': Gồm 2 chuỗi bắt đầu bỡi 1 trong 2 kí tự đó, & lầu những từ tương ứng lần lượt trong 2 chuỗi để thay vô mệnh đề cần mã hóa.

Sau đó người ta còn fát triển lên rất nhiều chìa khóa, như: "STOP', "HANOI", "NGHIALO", "DONGTHAPMUOI", . . . .
để mã hóa những bài văn dài. Vì 1 bài văn dài rất dễ sẩy ra trùng lặp & làm mồi ngon cho những nhà giải mả.

Ta bắt tay cải biên hàm tự tạo bài 1 để nó đa năng trong mọi trường hợp mã hoá & giải mã các mệnh đề cần thiết;
Hàm tự tạo đó có nội dung như sau:

Mã:
[B]Function NghiaLo(StrC As String, TuKhoa As String, Optional Thuan As Boolean = True) As String[/B]
 Const Alf As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
 ReDim Arr(1 To Len(TuKhoa))
 Dim J As Integer, VTr As Byte, W As Byte
 
 TuKhoa = UCase$(TuKhoa)
 For J = 1 To Len(TuKhoa)
    Arr(J) = InStr(Alf, Mid(TuKhoa, J, 1))
 Next J
 For J = 1 To Len(StrC)
    If Thuan Then
        VTr = InStr(Alf, Mid(StrC, J, 1))
    Else
        W = J Mod (Len(TuKhoa))
        If W = 0 Then W = Len(TuKhoa)
        VTr = InStr(Mid(Alf, Arr(W), 26), Mid(StrC, J, 1))
    End If
    If VTr Then
        If Thuan Then
            W = J Mod (Len(TuKhoa))
            If W = 0 Then W = Len(TuKhoa)
            NghiaLo = NghiaLo & Mid(Mid(Alf, Arr(W), 26), VTr, 1)
        Else
            NghiaLo = NghiaLo & Mid(Alf, VTr, 1)
        End If
    Else
        NghiaLo = NghiaLo & " "
    End If
 Next J
[B]End Function[/B]
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
Ðề: Dùng VBA trong excel để mã hóa

MÃ HÓA TIẾNG VIỆT THÀNH CÁC CHUỖI SỐ​


Tiếng Việt của chúng ta gồm những từ đơn, độ dài tối đa là 7 kí tự;
Sau đây mình sẽ tiến hành mã hóa, chuyển sang chuỗi các số biểu diễn những mệnh đề tiếng Việt không dấu, như chuỗi “Ho Chi Minh” sẽ chuyển thành “57 33 18 411 512 “; Có nghĩa là từ “Ho” trong mệnh đề được biểu diễn thàng số 57; Từ “Chi” được biểu diễn bằng cụm 2 nhóm số “33 18”; , , , ,
Có nghĩa là mình đã ghép đôi 2 kí tự thành 1 nhóm & mỗi nhóm có 1 số gồm 2 hay 3 chữ số, biểu diễn chúng. (Ví dụ: từ “Minh” tách thành 2 nhóm; Nhóm đầu được biểu diễn bằng chuỗi số 411;. . )

Để thực hiện điều này trên excel, ta cần lấy 1 vùng bắt đầu từ ô [A1] trang tính trắng & lập bảng như sau:

|A|B|C|D|E|G|. . . |Y
|1|2|3|4|5|6. . |22
1|A||C||E|G|. . .|Y
2|AI|BA|CA|DA|EI|GA|..|YA
3|AM|BE|CH|DD|EM|GE|..|YE
4|AN|BI|CI|DE|EN|GH|..|YI
5|AO|BO|CO|DI|EO|GI|..|YO
6|AU|BU|CU|DO|ET|GO|..|YU
7|AY|BY|CY|DU|EU|GU|..|YZ
8|AJ||CF|DY|EY|GZ|..|
9|||CW|.|.|.|..|

Ta thấy bảng gồm gần chục hàng & có số cột bằng với số chữ cái tiếng Việt.

Sau khi lập bảng như vậy, ta gán tên vùng này là ‘Alf’

Tiếp theo đó ta viết 1 hàm người dùng đơn giản để chuyển các từ trong mệnh đề cần dịch sang chuỗi số tương ứng;
Hàm này có nội dung như sau:

Mã:
Option Explicit
[b]Function MaHoa(StrC As String)[/b]
 Dim Rng As Range, sRng As Range
 Dim J As Byte, VTr As Byte
 Const KT As String = " ":                      Dim Tmp  As String
 
 Set Rng = Range("Alf")
 StrC = UCase$(Trim(StrC)) & KT
 Do
    VTr = InStr(StrC, KT):                      If VTr < 1 Then Exit Do
    Tmp = Trim(Left(StrC, VTr - 1)):            StrC = Mid(StrC, VTr + 1, 99)
    For J = 1 To Len(Tmp) Step 2
        Set sRng = Rng.Find(Trim(Mid(Tmp, J, 2)), , xlFormulas, xlWhole)
        If Not sRng Is Nothing Then
            MaHoa = MaHoa & Cells(sRng.Row, "A").Value & Cells(2, sRng.Column).Value & KT
        End If
    Next J
 Loop
End Function

Cách sử dụng:
Tại 1 ô trống nào đó trên trang tính ta nhập mệnh đề cần mã hóa như “Cong Hoa Xa Hoi Chu Nghia Viet Nam”

Tại 1 ô trống khác ta nhập cú fáp hàm =MaHoa(B14)

‘B14’ là ô đang chứa dữ liệu cần mã hóa; & sau khi {ENTER} ta sẽ nhận được chuỗi số sau:

“53 412 57 11 221 57 18 33 119 412 47 11 420 65 212 111”

:angel: :angel: :angel:​

Đã có hàm mã hóa, ta cũng cần có hàm giải mã; Nó có nội dung như sau:

Mã:
Function GiaiMa(StrC As String)
 Const KT As String = " ":                      Dim Tmp  As String
 Dim J As Byte, VTr As Byte, Dg As Integer, Col As Byte
 Dim Rng As Range
 
 StrC = UCase$(Trim(StrC)) & KT:                Set Rng = Range("Alf")
 Do
    VTr = InStr(StrC, KT):                      If VTr < 1 Then Exit Do
    Tmp = Trim(Left(StrC, VTr - 1)):            StrC = Mid(StrC, VTr + 1, 99)
    Dg = CInt(Left(Tmp, 1)):                    Col = CByte(Mid(Tmp, 2, 2))
    GiaiMa = GiaiMa & Rng(1).Offset(Dg, Col - 1).Value & KT
 Loop
[b]End Function[/b]

Khác với các hàm trên, hàm chuyển thành mã & hàm giải mã có thể nhốt chung trong 1; Thì ở đây, ta fải
xài 2 giải thuật khác xa nhau để xử lý trong mỗi 1 hàm, nên viết chung trong 1 hàm sẽ không cho lắm.


Chúc các bạn vui vẻ!
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
569
100
43
66
HCM city
Ðề: Dùng VBA trong excel để mã hóa 1 đoạn văn bản

CÁC CHÌA KHÓA MẬT MÃ VỚI ỐNG KHÓA 6 x 6


Giả dụ Công ti khóa Việt Tiệp làm ra ổ khóa là hình vuông 6 x 6 có dạng sau:

| A | B | C | D | E | G 1 |A|B|C|D|E|0|
2 |F|G|H|I|J|1
3 |K|L|M|N|O|2
4 |P|Q|R|S|T|3
5 |U|V|W|X|Y|4
6 |Z|5|6|7|8|9

Ta thấy bảng gồm 6 hàng & 6 cột chứa các chữ cái tiếng La tinh & kí số.
Bảng này được bố trí theo 1 qui luật nhất định. Đó là các dòng đầu lần lượt là các chữ cái; Cuối dòng là 1 số. Hơn nữa số này được tăng dần qua các hàng.
Sau khi lập bảng như vậy trên excel, ta gán tên vùng của bảng có địa chỉ [A1:G6] này là ‘ABC1’

Tiếp theo đó ta viết 1 hàm người dùng đơn giản để chuyển các từ trong mệnh đề cần dịch sang chuỗi số tương ứng;
Hàm này có nội dung như sau:

Mã:
Option Explicit
Function MaHoaABC1(StrC As String) As String
 Dim Rng As Range, sRng As Range
 Dim J As Long, VTr As Byte
 Const KT As String = " ":                      Dim Tmp  As String
 
 StrC = UCase$(Trim(StrC)) & KT
 Set Rng = Range("ABC1")
 For J = 1 To Len(StrC)
    Tmp = Mid(StrC, J, 1)
     If Tmp <> KT Then
        Set sRng = Rng.Find(Tmp, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            MaHoaABC1 = MaHoaABC1 & "? "
        Else
            MaHoaABC1 = MaHoaABC1 & CStr(sRng.Row) & CStr(sRng.Column)
        End If
    Else
        MaHoaABC1 = MaHoaABC1 & KT
    End If
 Next J
End Function

Cách sử dụng:
Tại 1 ô trống nào đó, ví dụ [H1] trên trang tính ta nhập mệnh đề cần mã hóa như “Giai Phap Excel Sang Tuoi Thu 7”


Tại 1 ô trống khác ta nhập cú fáp hàm =MaHoaABC1(H1)

‘H1’ là ô đang chứa dữ liệu cần mã hóa; & sau khi {ENTER} ta sẽ nhận được chuỗi số sau:

“ 22241124 41231141 1554131532 44113422 45513524 452351 64”

Như vậy là ta đã mã hóa mệnh đề ở [H1] xong, sau đó ta bỏ vô tủ & cài then; Nói là chỉ cài then do tủ hồ sơ này chưa có khóa.
Cái bảng ‘ABC1’ nêu trên chỉ là 1 ống khóa không chìa; Chức năng của nó hiện giờ chỉ là cái móc hình khóa mà thôi.

Sau đây ta sẽ thấy công đoạn chế ống khóa với chìa là “VIET NAM”

| A | B | C | D | E | G 1 | V | I | E | T |0|1
2 | N | A | M |2|3|4
3 |B|C|D|F|G|5
4 |HJ|K|L|O|6
5 |P|Q|R|S|U|7
6 |W|X|Y|Z|8|9


Khi đó hồ sơ mật của chúng ta sẽ là dòng chuỗi “35122212 51412251 1362321344 54222135 14554512 144155 56 “

Để í ta thấy con số 7 bên trên được mã hóa thành 64, thì giờ đây đã được mã thành 56

Nếu ta chọn cụm từ “HOA-SEN-TIM” làm chìa khóa mật mã theo qui luật trên, tài liệu chúng ta sẽ là chuỗi: “45321332 54111354 2264422253 21132345 31611232 311161 35”
 

Xem nhiều

Webketoan Zalo OA