UDF dùng để mã hóa đơn giản đoạn văn bản tiếng Việt không dấu (PHẦN 2) (1 người xem)

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

Người dùng đang xem chủ đề này

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia
8/6/06
Bài viết
14,768
Được thích
23,200
Nghề nghiệp
U80
I./ Mã hóa đối xứng & chìa khóa mật mã:

Cách đây hơn 2.000 năm, loài người đã biết mã hóa những câu văn để giữ bí mật cho riêng mình & người cùng chí hướng với mình.
Hồi đó người ta làm tương tự như vầy:

Người ta đem tất tần tật các chữ cái của ngôn ngữ của mình thay tương đương bằng 1 chữ cái khác bất kỳ theo 1 qui luật nào đó.
Ví dụ thay A => F, B => G,. . . .

Lúc đó các kí tự A, B, C, D, E, F, G, H, I,. . . . được thay bằng F, G, H, I, J, K, L, M, N, O . . . . .

Như vậy từ Ai sẽ được viết là FN

& cứ thế người ta truyền tin cho nhau bằng những bức thư ngỏ.

Tất nhiên ở đây người mã hóa đoạn văn cần truyền đạt trước cho người nhận về độ lệnh giữa từ cần mã hóa (A) & từ cần thay thế (F)

Chẳng bao lâu sau, việc này cũng dễ bị fát hiện vì tính lập lại ngẫu nhiên trong ngôn từ; Ví dụ rõ nhất như ngôn ngữ tiếng Việt ta là xài khá nhiều chữ cái "N"

Fát triển thêm 1 bước, con người đã tìm cách thay ngẫu nhiên hơn, như

như thay A, B, C, D, E, F, G, H, . . . bằng S, O, N, G, C, A, B, D,. . .

Ở đây, các từ SONGCA là từ có nghĩa nào đó làm cho người cần giải mã rất chi là dễ nhớ.
Thêm nữa, các từ còn lại chưa xài (ngoài "SONGCA" ) người ta đem ghép nối tiếp vô theo trật tự vốn có của bảng chữ cái.

Từ SONGCA ở đây được gán cho nó cái tên, đó là chìa khóa của mật mã.
Vậy ống khóa là cái gì? Nó chính là bảng chữ cái A, B, C, . . . ., Z

Ở bài đầu tiên này, mình xin giới thiệu với các bạn hàm người dùng để tạo ra các chìa khóa của ống khóa
0, 1, 2, 3, . . .9, A, B, C, . . . . ,Z

Hàm người dùng đó có tên là TaoKhoa & nội dung của nó như sau:

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'Const FC As String = "FJWZ"    '
Function TaoKhoa(Keys As String, Optional Kh0 As String = Khoa) As String
 Dim Kh As String * 36, KTr As String
 Dim J As Byte, VTr As Byte
 
 Keys = UCase$(Keys)
 For J = 1 To Len(Keys) - 1
    Kh0 = Replace(Kh0, Mid(Keys, J, 1), "")
 Next J
 VTr = InStr(Kh0, Right(Keys, 1))
 TaoKhoa = Keys & Mid(Kh0, VTr + 1, 35) & Left(Kh0, VTr - 1)
End Function


Xin các bạn xem file sẽ rõ thêm
 

File đính kèm

II./ Mã hóa 1 mệnh đề với nhiều chìa khoa khác nhau

Giả sử ta có câu "TRI THUC LA SUC MANH"
Ta muốn mã hóa mệnh đề này & gởi cho ngài Bộ trưởng bộ Giáo dục & ĐT
Nhưng trước tiên ta cần tăng tính bảo mật cho mật mã của chúng ta

1./ Thay khoảng trống giữa các từ bằng kí tự
Nếu sau khi ta mã hóa mệnh đề trên mà kết quả ra là: 75V 7T8O ZK 68O 0K1T
Thì người thường dễ nhận biết đó là 1 mệnh đề tiếng Việt đã được mã hóa;
Nhưng nếu nhìn vô đám rừng 75VR7T8OWZKB68OF0K1T
thì số người tin rằng đây là 1 mệnh đề đã được mã hóa sẽ giảm xuống rất nhiều

Như ta đã thấy, chúng ta đã dùng đến 36 kí tự & kí số để làm ống khóa; Nhưng trong mệnh đề tiếng Việt hãn hữu mới gặp các chữ cái ZJFW
Ta có thể lần lượt xài các kí tự này thay vô khoảng trống giữa hai từ.

2./ Nội dung hàm người dùng mã hóa mệnh đề trên có nội dung như sau:

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function MaHoa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String
 Dim J As Integer, VTr As Byte, Dem As Byte

 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 StrC = UCase$(StrC)
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    If KT <> " " Then
        VTr = InStr(Khoa, KT)
        MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)
    Else
        Dem = Dem + 1
        If Dem > 4 Then Dem = 1
        VTr = InStr(Khoa, Mid(FC, Dem, 1))
        MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)
    End If
 Next J
End Function

Hàm cần được cung cấp 2 tham chuỗi, đó là
StrC là mệnh đề chúng ta cần mã hóa &
ChiaKhoa là cụm từ (viết liền) mà ta muốn nó là chìa khóa
Cụm từ này có thể là:

"AnhYeuEm" / "EmYeuAnh"
"HaDong" / "DongHa"

Cụm từ này có 1 yêu cầu là các kí tự không trùng nhau; Chúng có thể chứa 1 vài con số cho vui cửa nhà.

3./ Cách sử dụng:

Tại 1 ô trống nào đó trên trang tính ta áp cú fáp =MaHoa(AL1,"DongThap")
Ở đây, AL1 là ô đang chứa mệnh đề ta cần mã hóa
& kết quả sẽ là EB1YE0FV24SJCFVM5S60

Chúc các bạn nhiều thành công!
 
Upvote 0
Giả sử ta có câu "TRI THUC LA SUC MANH"
Ta muốn mã hóa mệnh đề này & gởi cho ngài Bộ trưởng bộ Giáo dục & ĐT
Nhưng trước tiên ta cần tăng tính bảo mật cho mật mã của chúng ta

1./ Thay khoảng trống giữa các từ bằng kí tự
Nếu sau khi ta mã hóa mệnh đề trên mà kết quả ra là: 75V 7T8O ZK 68O 0K1T
Thì người thường dễ nhận biết đó là 1 mệnh đề tiếng Việt đã được mã hóa;
Nhưng nếu nhìn vô đám rừng 75VR7T8OWZKB68OF0K1T
thì số người tin rằng đây là 1 mệnh đề đã được mã hóa sẽ giảm xuống rất nhiều

Như ta đã thấy, chúng ta đã dùng đến 36 kí tự & kí số để làm ống khóa; Nhưng trong mệnh đề tiếng Việt hãn hữu mới gặp các chữ cái ZJFW
Ta có thể lần lượt xài các kí tự này thay vô khoảng trống giữa hai từ.

2./ Nội dung hàm người dùng mã hóa mệnh đề trên có nội dung như sau:

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function MaHoa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String
 Dim J As Integer, VTr As Byte, Dem As Byte

 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 StrC = UCase$(StrC)
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    If KT <> " " Then
        VTr = InStr(Khoa, KT)
        MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)
    Else
        Dem = Dem + 1
        If Dem > 4 Then Dem = 1
        VTr = InStr(Khoa, Mid(FC, Dem, 1))
        MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)
    End If
 Next J
End Function

Hàm cần được cung cấp 2 tham chuỗi, đó là
StrC là mệnh đề chúng ta cần mã hóa &
ChiaKhoa là cụm từ (viết liền) mà ta muốn nó là chìa khóa
Cụm từ này có thể là:

"AnhYeuEm" / "EmYeuAnh"
"HaDong" / "DongHa"

Cụm từ này có 1 yêu cầu là các kí tự không trùng nhau; Chúng có thể chứa 1 vài con số cho vui cửa nhà.

3./ Cách sử dụng:

Tại 1 ô trống nào đó trên trang tính ta áp cú fáp =MaHoa(AL1,"DongThap")
Ở đây, AL1 là ô đang chứa mệnh đề ta cần mã hóa
& kết quả sẽ là EB1YE0FV24SJCFVM5S60

Chúc các bạn nhiều thành công!
Tôi thấy rất hay nhưng thực sự chưa biết ứng dụng nó vào việc gì trong thực tế.
 
Upvote 0
Tôi thấy rất hay nhưng thực sự chưa biết ứng dụng nó vào việc gì trong thực tế.

Có thể mã hóa di chúc chẳng hạn. (Muốn giao cho thằng nào thì lén cho nó cái chìa khóa)
Chỉ người có chìa khóa mới hiểu được nội dung.
Híc!
 
Upvote 0
Có thể mã hóa di chúc chẳng hạn. (Muốn giao cho thằng nào thì lén cho nó cái chìa khóa)
Chỉ người có chìa khóa mới hiểu được nội dung.
Híc!
Nếu di chúc thì phải nhiều người đọc được mới có hiệu lực chứ? Chỉ môi người được thừa kế hiểu thì ai công nhận bác!
 
Upvote 0
Nếu di chúc thì phải nhiều người đọc được mới có hiệu lực chứ? Chỉ môi người được thừa kế hiểu thì ai công nhận bác!

Muốn tránh giành giật nhau khi mình còn sống, hoặc tên "súc sinh" nào đó sửa di chúc khi mình "hy sanh" không đối chứng.
Dĩ nhiên là người nào muốn đọc thì phải có chìa khóa, công khai chìa khóa trước mọi người thì thành giá trị thôi.
Tôi chỉ ví dụ thôi mà.
Hay là vầy đi.
Giao cho "em bồ" chùm chìa khóa, mình viết theo kiểu này rủ bồ đi chơi "đã luôn".
"Má nó" đọc cũng hổng biết gì.Tưởng mình "khùng".
Híc!
 
Upvote 0
Mỗi lần sử dụng toán tử & thì VBA phải bỏ chuỗi cũ, lập chuỗi mới. Nếu chuỗi dài vài chục ngàn ký tự thì VBA chạy tít mù.

Để khắc phục nhược điểm này, VBA có cho phép hàm MID làm việc trực tiếp trên chuỗi.

Theo bài này, nếu phép mã hoá đổi từng ký tự sang từng ký tự thì chuỗi đầu ra dài bằng chuỗi đầu vào. Như vậy ta có thể tạo
MaHoa = space(len(strC)) trước và sau đó cứ việc
Mid(MaHoa, J, 1) = ...
Sẽ đở tốn năng lượng máy hơn nhiều.
 
Upvote 0
Rất vui vì cac bạn đã tham gia & rất mong các bạn khác góp vui theo hướng sau:

(1) Dịch sang tiếng Việt 2 hàm tự tạo biên trên;

(2) Viết hàm tự tạo để chuyển mệnh đề "TOI RAT YEU GPE VA TAT CA CAC BAN"

===>> để có dạng như ===>>
[TABLE="width: 297"]
[TR]
[TD]
"60T 4F6 BP7 R2P 8F 6F6 LF LFL JFZ"

(3) Chỉ ra thêm những sai sót hay chưa hay của các bài trên

(4) Nếu các giải thuật khác để cùng học hỏi lẫn nhau.

Xin chân thành cảm ơn các bạn nhiều!
[/TD]
[/TR]
[/TABLE]
 
Lần chỉnh sửa cuối:
Upvote 0
Bài 3: Hàm giải mã, một khi ta đã biết chìa khóa

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function GiaiMa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String, Sp As String
 Dim J As Integer, VTr As Byte
 
 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 GiaiMa = Space(Len(StrC))                  'Theo Khuyén Cáo Cua VetMini!'
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    VTr = InStr(ChuoiMa, KT)
    Sp = Mid(Khoa, VTr, 1)
    GiaiMa = LTrim$(GiaiMa) & IIf(InStr(FC, Sp), " ", Sp)
 Next J
End Function
Mã:
Function MaHoa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String
 Dim J As Integer, VTr As Byte, Dem As Byte

 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 StrC = UCase$(StrC)
 MaHoa = Space(Len(StrC))
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    If KT <> " " Then
        VTr = InStr(Khoa, KT)
        MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)
    Else
        Dem = Dem + 1
        If Dem > 4 Then Dem = 1
        VTr = InStr(Khoa, Mid(FC, Dem, 1))
        MaHoa = Trim$(MaHoa) & Mid(ChuoiMa, VTr, 1)
    End If
 Next J
End Function
 
Upvote 0
Mình hình dung nó có ích trong việc sau

Tôi thấy rất hay nhưng thực sự chưa biết ứng dụng nó vào việc gì trong thực tế.

Ví dụ tên tôi là Dương Huỳnh Thanh Trang
nếu tôi dùng chìa khóa là "HaDong" để mã hóa, ta sẽ nhận được chuỗi R821UTV8E1VX7VM1VB75M1U
Ta biết rằng, nếu dùng hàm giải mã vừa đăng với chìa khóa của nó là "HaDong", ta sẽ lại có kết quả Dương Huỳnh Thanh Trang là hiễn nhiên
Nhưng ta viết thêm vô hàm giải mã này vài câu lệnh để nó chỉ trả lời là Jes-No khi đối chiếu với chuỗi "Duong Huynh Thanh Trang"

Tiến thêm 1 bước, khi 1 anh A nào khác giải mã với từ khóa "1DiKhongVe"
thì sẽ không nhận lại được chuỗi "Duong Huynh Thanh Trang" nữa, mà sẽ là "GVP0 I8V908LU8D08YUSD0"
Vậy hàm mà anh A đang nắm giữ với chìa khóa '1DiKhongVe" với chuỗi "GVP0 I8V908LU8D08YUSD0" sẽ trả lời là "JES" 1 khi nó được thêm câu lệnh so sánh chuỗi.

Ta có thể mường tượng ta gởi cho nhiều đồng nghiệp khác nhau với những chìa khóa khác nhau để giải mã chuỗi R821UTV8E1VX7VM1VB75M1U
& nếu đúng chìa khóa đều có kết quả là JES
 
Upvote 0
@SA_DQ: sử dụng Mid trong bài này có thể bỏ hẳn không dùng & :

Mã:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function GiaiMa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String, Sp As String
 Dim J As Integer, VTr As Byte
 
 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 GiaiMa = Space(Len(StrC))                  'Theo Khuyén Cáo Cua VetMini!'
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    VTr = InStr(ChuoiMa, KT)
    Sp = Mid(Khoa, VTr, 1)
    [COLOR=#008000]' GiaiMa = LTrim$(GiaiMa) & IIf(InStr(FC, Sp), " ", Sp)[/COLOR]
    [COLOR=#0000ff][B]If InStr(FC, Sp) Then Mid(GiaiMa, J, 1) = Sp[/B][/COLOR] [COLOR=#008000]' nếu điều kiện không thoả thì GiaiMa vẫn giữ dấu trăng ở vị trí đó[/COLOR]
 Next J
End Function
Mã:
Function MaHoa(StrC As String, ChiaKhoa As String) As String
 Dim ChuoiMa As String, KT As String
 Dim J As Integer, VTr As Byte, Dem As Byte

 ChuoiMa = TaoKhoa(UCase$(ChiaKhoa))
 StrC = UCase$(StrC)
 MaHoa = Space(Len(StrC))
 For J = 1 To Len(StrC)
    KT = Mid(StrC, J, 1)
    If KT <> " " Then
        VTr = InStr(Khoa, KT)
        [COLOR=#008000]' MaHoa = MaHoa & Mid(ChuoiMa, VTr, 1)[/COLOR]
    Else
        Dem = Dem + 1
        If Dem > 4 Then Dem = 1
        VTr = InStr(Khoa, Mid(FC, Dem, 1))
        [COLOR=#008000]' MaHoa = Trim$(MaHoa) & Mid(ChuoiMa, VTr, 1)[/COLOR]
    End If
    [COLOR=#0000ff][B]Mid(MaHoa, J, 1) = Mid(ChuoiMa, VTr, 1)[/B][/COLOR]
 Next J
End Function
 
Upvote 0
Bài IV: Tạo chìa khóa với 2 dòng

Như ở bài đầu ta đã thấy, chìa khóa mật mã được tạo ra bỡi các từ có nghĩa (để người dùng dễ nhớ), kết hợp với sự xáo trộn theo quy luật của các kí tự & kí số còn lại.

Như chìa khóa "EmYeuAnh" sẽ là tập hợp của chuỗi "EMYEUANHIJKLOPQRSTVWXZ0123456789BCDFG"
Tập hợp này có cấu trúc tạm chia làm 3 fần;
Fần thứ nhất là những kí tự làm nên chìa khóa, đó là cụm từ "EmYeuAnh"
Fần kế tiếp gồm chuỗi kí số & kí tự 0 1 2 3 . . . 9 A B . . . .Z sau khi đã được bỏ đi các kí tự trong chìa khóa & được ghép bỡi từ kế tiếp của từ cuối của chìa khóa; Cụ thể trong trường hợp này, từ cuối trong chìa khóa là 'H', thì ta sẽ ghép tiếp nối bắt đầu bỡi kí tự 'I' (màu đỏ)
Fần cuối là cụm các kí tự còn lại mà chúng đứng trước kí tự 'I'

Để tăng tính xáo trộn, chúng ta có thể tạo ra chìa khóa gồm 2 hàng, như mô tả dưới đây:
S O N G H I J K L P Q R T 0 1 2 3 4
M A U V W X Y Z B C D E F 5 6 7 8 9


Như vậy chìa khóa cùa ta đã tăng độ tinh vi hơn & vì thế độ fức tạp sẽ tăng cao hơn. Chìa khóa này sẽ được hàm tự tạo sau đây tạo ra:

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function TaoKhoa2(Keys As String)
 ReDim Arr(1 To 2, 1 To 18)
 Dim Str1 As String, Str2 As String, Kh0 As String, Tmp As String
 Dim VTr As Byte, J As Byte
    
 Kh0 = Mid(Khoa, 11, 26)
 Keys = UCase$(Keys):                           VTr = InStr(Keys, " ")
 Str1 = Left(Keys, VTr - 1):                    Str2 = Mid(Keys, VTr + 1, 9)
 For J = 1 To Len(Str1) - 1
    Kh0 = Replace(Kh0, Mid(Str1, J, 1), "")
 Next J
 For J = 1 To Len(Str2)
    Kh0 = Replace(Kh0, Mid(Str2, J, 1), "")
 Next J
 VTr = InStr(Kh0, Right(Str1, 1))
9 Tmp = Mid(Kh0, VTr + 1, 35) & Left(Kh0, VTr - 1)
 TaoKhoa2 = Str1 & Left(Tmp, 13 - Len(Str1)) & "01234" & Str2 & Mid(Tmp, 14 - Len(Str1), 20) & "56789"
 For J = 1 To 18
    Arr(1, J) = Mid(TaoKhoa2, J, 1)
    Arr(2, J) = Mid(TaoKhoa2, J + 18, 1)
 Next J
 TaoKhoa2 = Arr
End Function
 
Upvote 0
V. Tạo chìa khóa mật mã là hình chữ nhật 4 x 9

Để fần nào đó tăng độ fức tạp, nhưng chủ iếu là dễ truyền tin, chúng ta viết ra hàm người dùng để tạo chìa khóa gồm bảng kí tự & kí số gồm 4 hàng, mỗi hàng có 9 kí tự (hay kí số). Thêm nữa, ta gán sẵn 3 ô cuối của hàng đầu & hàng thứ 4 gồm 3 kí số mỗi hàng {0, 1, 2} & {7, 8, 9}, hai hàng còn lại sẽ là {3, 4} & {5, 6}.

Sau đây là nội dung của hàm
PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function TaoKhoa4(Keys As String) As Variant
 ReDim Arr(1 To 4, 1 To 9) As String
 Dim Kh0 As String, Tmp As String, KS As String, SHg As String
 Dim J As Byte, VTr As Byte, Dm As Byte, W As Byte

 Kh0 = Mid(Khoa, 11, 26)
 Keys = UCase$(Keys) & " "
 For J = 1 To Len(Keys)
    If Mid(Keys, J, 1) <> " " Then Kh0 = Replace(Kh0, Mid(Keys, J, 1), "")
 Next J
 Do
    VTr = InStr(1, Keys, " "):              If VTr < 1 Then Exit Do
    Dm = 1 + Dm
    Tmp = Left(Keys, VTr - 1):              Keys = Mid(Keys, VTr + 1, 29)
    KS = Choose(Dm, "012", "34", "56", "789", "GPE.COM")
    SHg = Tmp & Left(Kh0, 9 - Len(KS) - Len(Tmp)) & KS
    For W = 1 To 9
        Arr(Dm, W) = Mid(SHg, W, 1)
    Next W
    Kh0 = Mid(Kh0, 10 - Len(KS) - Len(Tmp), 26)
 Loop
 TaoKhoa4 = Arr()
End Function

Ví dụ: Ta dùng chuột tô chọn vùng các ô trống từ [A14:I17] & nhập lên thanh công thức cú fáp hàm =TaoKhoa4("MaDiKhongVe") & kết thúc bằng tổ hợp các fím {CTRL}+{SHIFT}+{ENTER} ta sẽ nhận được kết quả như sau:

M A B C F J 0 1 2
D I L P Q R S 3 4
K H O N G T U 5 6
V E W X Y Z 7 8 9
 
Lần chỉnh sửa cuối:
Upvote 0
Bài VI: Mã hóa đoạn văn bản bằng tọa độ hàng & cột của ký tự trong bảng chứa chìa kóa

Như bài trên ta đã thấy, chìa khóa có chứa mệnh đề "MaDiKhongVe" thể hiện trên vùng ô [A14:I17] của trang tính;
Khác với các bài trước, ta sẽ mã hóa mệnh đều không theo kí tự trong khóa, mà sẽ biểu diễn theo tọa độ hàng & cột của kí tự trong chìa khóa.

Sau đây là hàm tự tạo mã hóa mệnh đề tiếng Việt không dấu:
PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function MaHoa4(Nguon As String)
 Dim Rng As Range
 Dim J As Integer, Dem As Byte, Rws As Byte, Col As Byte
 ReDim Arr(1 To 4, 1 To 9) As String
 Dim TT As Boolean:                     Dim Tmp As String
 
 Nguon = UCase$(Nguon):                 MaHoa4 = Space(2 * Len(Nguon))
 For J = 1 To Len(Nguon)
    Tmp = Mid(Nguon, J, 1)
    If Tmp = " " Then
        Dem = 1 + Dem:                  If Dem = 4 Then Dem = 1
        Tmp = Mid(FC, Dem, 1)
    End If
    For Rws = 14 To 17
        For Col = 1 To 9
            If Cells(Rws, Col).Value = Tmp Then
                Mid(MaHoa4, 2 * J - 1, 2) = CStr((Rws - 13) * 10 + Col)
                TT = True:              Exit For
            End If
        Next Col
        If TT Then
            TT = False:                 Exit For
        End If
    Next Rws
 Next J
End Function

Ví dụ tại [L9] ta có mệnh đề "Tri Thuc La Suc Manh Em Yeu"
Khi áp dụng hàm trên ta nhận được kết quả như sau:
"362622153632371416231243273714151112343216421143454237"

Ta thấy:
Chiều dài các kí số sau mã hóa tăng 2 lần
Ta thấy chưa xuất hiện các kí số 8 & 9 & ít kí số 7, do trong mệnh đề không có kí số.
 
Upvote 0
Bài VIb: Hàm tự tạo giải mã với chìa khóa bố trí trong hính chữ nhật 4 x 9

PHP:
Option Explicit
Const Khoa As String = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Const FC As String = "FJWZ"
Function GiaiMa4(Ma As String) As String
 Dim J As Integer, Hg As Byte, Cot As Byte
 Dim Rng As Range
 Dim Tmp As String, KT As String
 
 Set Rng = Range("BonChin")
 GiaiMa4 = Space(Len(Ma) \ 2)
 For J = 1 To Len(Ma) Step 2
    Tmp = Mid(Ma, J, 2)
    Hg = CByte(Left(Tmp, 1)):           Cot = CByte(Right(Tmp, 1))
    KT = Rng.Cells(Hg, Cot).Value
    If InStr(FC, KT) < 1 Then
        Mid(GiaiMa4, (J + 1) / 2, 1) = KT
    End If
 Next J
End Function
Ghi chú: Vùng gán tên "BonChin" các bạn tham khảo ở #13
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom