BÀI TẬP 1:
Tôi có 1 mệnh đề : "TRI THUC LA SUC MANH"
Xin nhờ các bạn mã hóa mệnh đề này để tôi gởi cho CIA với chìa khóa mã như sau:
Kí tự|Thay bằng
F|A
G|B
H|C
..|..
Z|U
A|V
B|W
C|X
D|Y
E|Z
Đáp án: ". . . . HVIC"
Function Encrypt(ByVal text As String) As String
Dim tmp As String, k As Long, code As Byte
text = UCase(text)
For k = 1 To Len(text)
code = Asc(Mid(text, k, 1))
If code > 64 And code < 70 Then
code = code + 21
ElseIf code > 69 And code < 91 Then
code = code - 5
End If
tmp = tmp & Chr(code)
Next
Encrypt = tmp
End Function
BÀI 2:Các bạn hãy viết 1 hàm có thể dịch đoạn văn bản nào đó theo cả chiều thuận & chiều ngược lại
Hàm có cú fáp = MaHoa5(Txt As String, Optional Thuan As Boolean = True)
Ví dụ:= MaHoa5("TRI THUC LA SUC MANH") => "OMD OCPX GV NPX HVIC"
&=MaHoa5( "OMD OCPX GV NPX HVIC", FALSE)= "TRI THUC LA SUC MANH"
Function Encrypt(ByVal text As String, ByVal enc As Boolean) As String
' enc = True --> Ma hoa, = FALSE --> Giai ma
Dim tmp As String, k As Long, code As Byte
text = UCase(text)
For k = 1 To Len(text)
code = Asc(Mid(text, k, 1))
If code > 64 And code < 91 Then
If enc Then
code = code + 21
Else
code = code - 21
End If
If code > 90 Then
code = code - 26
ElseIf code < 65 Then
code = code + 26
End If
End If
tmp = tmp & Chr(code)
Next
Encrypt = tmp
End Function
' gài mã chuỗi ký tự theo luật độ lệch bảng ký tự A-Z
Function MaKyTu(ByVal s As String, ByVal doLech As Integer) As String
Const MAUTU = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim bm As String, i As Integer, c As String
' lập bảng tra
If doLech < 0 Then
bm = Space(Asc("A") - 1) & Right(MAUTU, -doLech) & MAUTU
Else
bm = Space(Asc("A") - 1 - doLech) & MAUTU & Left(MAUTU, doLech)
End If
' dùng bảng tra để chuyển mã
For i = 1 To Len(s)
c = Mid(s, i, 1)
If c >= "A" And c <= "Z" Then Mid(s, i, 1) = Mid(bm, Asc(c))
Next i
MaKyTu = s
End Function
BÀI 3Ta cũng dùng 26 chữ cái tiếng Anh làm mã thay thế; Nhưng các khoảng trống giữa các từ (tiếng Việt) được thay bằng các từ "F", "J", "W" hay "Z"
Lúc đó mệnh đề ở bài 1 sẽ có đáp án là "OMDAOCPXAGVANPXAHVIC"
(Mình tạm gán tên khóa mật mã này là "504")
Function Encrypt(ByVal text As String, ByVal offset As Long, Optional ByVal bangtra As String = "") As String
' neu Ma voi offset = a thi Giai Ma voi offset = -a
' bangtra khong duoc co cac ky tu F, J, W, Z la cac ky tu dung thay cho dau cach - SPACE
' cac dau cach trong text theo chu ky F, J, W, Z
Const spaces = "FJWZ"
Const default = "ABCDEGHIKLMNOPQRSTUVXY"
Dim tmp As String, k As Long, code As Byte, dic As Object, c As String, pos As Long, c1 As String
text = UCase(text)
If bangtra = "" Then bangtra = default
Set dic = CreateObject("Scripting.Dictionary")
' cho cac cap ky tu (ky_tu, ky_tu_thay_the) vao tu dien
For k = 1 To Len(bangtra)
c = Mid(bangtra, k, 1)
If Not dic.exists(c) Then dic.Add c, Mid(bangtra, ((k - 1 + offset + Len(bangtra)) Mod Len(bangtra)) + 1, 1)
Next
' chuyen tung ky tu thanh ky tu thay the
For k = 1 To Len(text)
' doc ky tu
c = Mid(text, k, 1)
' neu la dau cach thi thay bang F, J, W hoac Z
If Asc(c) = 32 Then
c = Mid(spaces, (pos Mod 4) + 1, 1)
pos = pos + 1
' neu la ky tu thay the cho dau cach thi chuyen thanh dau cach
ElseIf InStr(1, spaces, c) > 0 Then
c = Chr(32)
' neu la ky tu trong bangtra thi chuyen thanh ky tu thay the. Neu khong thi de nguyen
ElseIf dic.exists(c) Then
c = dic.Item(c)
End If
tmp = tmp & c
Next
Encrypt = tmp
End Function
Sub test()
Dim s As String
s = Encrypt("TRI THUC LA SUC MANH?", -5)
Debug.Print s
s = Encrypt(s, 5)
Debug.Print s
Debug.Print "--------------"
s = Encrypt("TRI THUC LA SUC MANH", -5, "ADBCEGHIKLONMPQRUTSXYV")
Debug.Print s
s = Encrypt(s, 5, "ADBCEGHIKLONMPQRUTSXYV")
Debug.Print s
Debug.Print "--------------"
s = Encrypt("TOI THICH CO BE HANG XOM!", 7)
Debug.Print s
s = Encrypt(s, -7)
Debug.Print s
End Sub
Hình như thiếu "R"Trước khi đi vào mã hóa & giải mã dạng bài tập ứng dụng hình vuông Vigenère fức tập nêu trên, xin các bạn thử sức với bài tập sau đây
BÀI TẬP 4
Ta có bảng chữ cái tiếng Việt như sau
A B C D E G H I K L M N O P Q S T U V X Y
Và dẫy đễ mã hóa có tên là HOASUNG như dưới đây:
H O A S U N G I K L M P Q T V X Y A B C D E
Các bạn hãy mã hóa cụm từ "TRI THUC LA SUC MANH" giúp nha.
Function Encrypt(ByVal text As String, ByVal offset As Long, Optional ByVal bangtra As String = "") As String
' neu Ma voi offset = a thi Giai Ma voi offset = -a
' bangtra khong duoc co cac ky tu F, J, W, Z la cac ky tu dung thay cho dau cach - SPACE
' cac dau cach trong text theo chu ky F, J, W, Z
Const spaces = "FJWZ"
Const default = "ABCDEGHIKLMNOPQRSTUVXY"
Dim tmp As String, k As Long, code As Byte, dic As Object, c As String, pos As Long, c1 As String
text = UCase(text)
If bangtra = "" Then bangtra = default
Set dic = CreateObject("Scripting.Dictionary")
' cho cac cap ky tu (ky_tu, ky_tu_thay_the) vao tu dien
For k = 1 To Len(bangtra)
c = Mid(bangtra, k, 1)
If Not dic.exists(c) Then dic.Add c, Mid(bangtra, ((k - 1 + offset + Len(bangtra)) Mod Len(bangtra)) + 1, 1)
Next
' chuyen tung ky tu thanh ky tu thay the
For k = 1 To Len(text)
' doc ky tu
c = Mid(text, k, 1)
' neu la dau cach thi thay bang F, J, W hoac Z
If Asc(c) = 32 Then
c = Mid(spaces, (pos Mod 4) + 1, 1)
pos = pos + 1
' neu la ky tu thay the cho dau cach thi chuyen thanh dau cach
ElseIf InStr(1, spaces, c) > 0 Then
c = Chr(32)
' neu la ky tu trong bangtra thi chuyen thanh ky tu thay the. Neu khong thi de nguyen
ElseIf dic.exists(c) Then
c = dic.Item(c)
End If
tmp = tmp & c
Next
Encrypt = tmp
End Function
Function EncryptWithKey(ByVal text As String, ByVal offset As Long, ByVal key As String) As String
Const bangchu = "ABCDEGHIKLMNOPQRSTUVXY"
Dim k As Long, bangtra As String, c As String, s As String
key = UCase(key)
bangtra = key
s = Mid(bangchu, Len(key) + 1) & Left(bangchu, Len(key))
For k = 1 To Len(s)
c = Mid(s, k, 1)
If InStr(1, key, c) = 0 Then bangtra = bangtra & c
Next
EncryptWithKey = Encrypt(text, offset, bangtra)
End Function
Sub test()
Dim s As String
s = EncryptWithKey("TRI THUC LA SUC MANH?", -5, "hoasung")
Debug.Print s
s = EncryptWithKey(s, 5, "hoasung")
Debug.Print s
End Sub
Function Encrypt(ByVal Str As String, ByVal Key As String) As String
Const Default = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Dim k As Long
Dim Bangma(1 To 26, 1 To 26)
Dim sArr()
ReDim sArr(1 To Len(Str), 1 To 2)
'Dua du lieu vao bang ma
For i = 1 To 26
For j = 1 To 26
If k = 26 Then
k = 1
Else
k = k + 1
End If
Bangma(i, j) = Mid(Default, k, 1)
Next
k = i
Next
'Tao NKey co do dai bang do dai Str
If Len(Str) > Len(Key) Then
For i = 1 To Int(Len(Str) / Len(Key))
NKey = NKey & Key
Next
NKey = NKey & Left(Key, Len(Str) - Int(Len(Str) / Len(Key)) * Len(Key))
End If
'Tim theo truc x
For k = 1 To Len(Str)
For i = 1 To 26
If UCase(Bangma(1, i)) = UCase(Mid(Str, k, 1)) Then
sArr(k, 1) = i
Exit For
Else
sArr(k, 1) = ""
End If
Next
Next
'Tim theo truc y
For k = 1 To Len(NKey)
For j = 1 To 26
If UCase(Bangma(j, 1)) = UCase(Mid(NKey, k, 1)) Then
sArr(k, 2) = j
End If
Next
Next
For k = 1 To Len(Str)
If sArr(k, 1) <> "" Then
Encrypt = Encrypt & Bangma(sArr(k, 1), sArr(k, 2))
Else
Encrypt = Encrypt & " "
End If
Next
End Function
Sub Test()
Dim Str As String, Key As String, s As String
Str = "TRI THUC LA SUC MANH CUA LOAI NGUOI"
Key = "HANOI"
s = Encrypt(Str, Key)
Debug.Print s
End Sub
Dim Arr(1 To 26, 1 To 26), R As Long, C As Long
Sub Vigenere()
For C = 1 To 26
For R = 1 To 26
ii = R + C - 1
Arr(R, C) = Chr(ii - 26 * (ii \ 27) + 64)
Next
Next
' Range("A1").Resize(26, 26) = Arr
End Sub
Function Encrypt(ByVal MyStr As String, ByVal Key As String) As String
Dim i As Long, Char1 As String, Char2 As String
Call Vigenere
For i = 1 To Len(MyStr)
Char1 = UCase(Mid(MyStr, i, 1))
If Char1 <> " " Then
Char2 = Mid(Key, i - Len(Key) * ((i - 1) \ Len(Key)), 1)
Else
Encrypt = Encrypt & Char1
End If
For C = 1 To 26
For R = 1 To 26
If Arr(R, 1) = Char2 And Arr(1, C) = Char1 Then
Encrypt = Encrypt & Arr(R, C)
End If
Next
Next
Next
End Function
Sub Test()
MsgBox Encrypt("TRI THUC LA SUC MANH CUA LOAI NGUOI", "HANOI")
End Sub
Function UnEncrypt(ByVal MyStr As String, ByVal Key As String) As String
Dim i As Long, Char1 As String, Char2 As String
Call Vigenere
For i = 1 To Len(MyStr)
Char1 = UCase(Mid(MyStr, i, 1))
If Char1 <> " " Then
Char2 = Mid(Key, i - Len(Key) * ((i - 1) \ Len(Key)), 1)
Else
UnEncrypt = UnEncrypt & Char1
End If
For C = 1 To 26
For R = 1 To 26
If Arr(R, 1) = Char2 And Arr(R, C) = Char1 Then
UnEncrypt = UnEncrypt & Arr(1, C)
End If
Next
Next
Next
End Function
Sub Test2()
Debug.Print UnEncrypt("ARV BOUP TH FIK MNBP CHO SONW UGHCQ", "HANOI")
End Sub
Option Explicit
Function DongThapMuoi(StrC As String) As String
ReDim Arr(1 To 12) As String
Dim J As Integer, VTr As Byte, W As Byte
Arr(1) = "DEFGHIJKLMNOPQRSTUVWXYZABC" 'D'
Arr(2) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O'
Arr(3) = "NOPQRSTUVWXYZABCDEFGHIJKLM" 'N'
Arr(4) = "GHIJKLMNOPQRSTUVWXYZABCDEF" 'G'
Arr(5) = "TUVWXYZABCDEFGHIJKLMNOPQRS" 'T'
Arr(6) = "HIJKLMNOPQRSTUVWXYZABCDEFG" 'H'
Arr(7) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'A'
Arr(8) = "PQRSTUVWXYZABCDEFGHIJKLMNO" 'P'
Arr(9) = "MNOPQRSTUVWXYZABCDEFGHIJKL" 'M'
Arr(10) = "UVWXYZABCDEFGHIJKLMNOPQRST" 'U'
Arr(11) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O'
Arr(12) = "IJKLMNOPQRSTUVWXYZABCDEFGH" 'I'
For J = 1 To Len(StrC)
VTr = InStr(Arr(7), Mid(StrC, J, 1))
If VTr Then
W = J Mod (Len("DongThapMuoi"))
If W = 0 Then W = Len("DongThapMuoi")
DongThapMuoi = DongThapMuoi & Mid(Arr(W), VTr, 1)
Else
DongThapMuoi = DongThapMuoi & " "
End If
Next J
End Function
Function MaHoa5(StrC As String, Optional Thuan As Boolean = True) As String
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
End Function
Option Explicit
Function DongThapMuoi(StrC As String, Optional Thuan As Boolean = True) As String
ReDim Arr(1 To 12) As String
Dim J As Integer, VTr As Byte, W As Byte
Arr(1) = "DEFGHIJKLMNOPQRSTUVWXYZABC" 'D'
Arr(2) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O'
Arr(3) = "NOPQRSTUVWXYZABCDEFGHIJKLM" 'N'
Arr(4) = "GHIJKLMNOPQRSTUVWXYZABCDEF" 'G'
Arr(5) = "TUVWXYZABCDEFGHIJKLMNOPQRS" 'T'
Arr(6) = "HIJKLMNOPQRSTUVWXYZABCDEFG" 'H'
Arr(7) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'A'
Arr(8) = "PQRSTUVWXYZABCDEFGHIJKLMNO" 'P'
Arr(9) = "MNOPQRSTUVWXYZABCDEFGHIJKL" 'M'
Arr(10) = "UVWXYZABCDEFGHIJKLMNOPQRST" 'U'
Arr(11) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O'
Arr(12) = "IJKLMNOPQRSTUVWXYZABCDEFGH" 'I'
For J = 1 To Len(StrC)
If Thuan Then
VTr = InStr(Arr(7), Mid(StrC, J, 1))
Else
W = J Mod (Len("DongThapMuoi"))
If W = 0 Then W = Len("DongThapMuoi")
VTr = InStr(Arr(W), Mid(StrC, J, 1))
End If
If VTr Then
If Thuan Then
W = J Mod (Len("DongThapMuoi"))
If W = 0 Then W = Len("DongThapMuoi")
DongThapMuoi = DongThapMuoi & Mid(Arr(W), VTr, 1)
Else
DongThapMuoi = DongThapMuoi & Mid(Arr(7), VTr, 1)
End If
Else
DongThapMuoi = DongThapMuoi & " "
End If
Next J
End Function
Hàm mã hóaBÀI TẬP SỐ 5Các bạn giúp tôi mã hóa mệnh đề "TRI THUC LA SUC MANH CUA LOAI NGUOI"
nhờ hình vuông Vigenère có từ khóa là HANOI, như sau:
...
Ví dụ minh họa: Để mã hóa chữ cái đầu của mệnh đề ('T'), ta xem chữ 'T' của dòng đầu tiên của hình vuông ứng với cột nào của dòng có chữ 'H' ở đầu dòng & lấy nó làm mã; (Đó là chữ 'A')
Tiếp theo ta tra đến chữ thứ nhì là chữ 'R' với dòng đầu tiên của hình vuông (Ở trường hợp này là chính nó luôn: 'R'); (Vì từ thứ 2 trong từ khóa là từ 'A'); Vậy là ta có 2 từ mã hóa của TR sẽ là AR
Từ 'I' của mệnh đề sẽ được tra tại dòng có chữ 'N' ở đầu dòng
. . . . .
Function MaHoa(MyStr As String, Key As String) As String
Dim i As Long
Const Str = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY "
For i = 1 To Len(MyStr)
MaHoa = MaHoa & IIf(Mid(MyStr, i, 1) = " ", " ", Mid(Str, InStr(Str, Mid(Key, ((i - 1) Mod Len(Key)) + 1, 1)) + InStr(Str, Mid(MyStr, i, 1)) - 1, 1))
Next
End Function
Function GiaiMa(MyStr As String, Key As String) As String
Dim i As Long
Const Str = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXY "
For i = 1 To Len(MyStr)
GiaiMa = GiaiMa & IIf(Mid(MyStr, i, 1) = " ", " ", Mid(Str, InStr(InStr(Str, Mid(Key, ((i - 1) Mod Len(Key)) + 1, 1)), Str, Mid(MyStr, i, 1)) - InStr(Str, Mid(Key, ((i - 1) Mod Len(Key)) + 1, 1)) + 1, 1))
Next
End Function
Mình gộp code mã hoá và giải mã của mình lại là được code sau:BÀI 5AHãy viết hàm mã hóa & giãi mã mệnh đề nào đó với từ khóa là 'STOP' áp dụng cho hình vuông bên trên;Các bạn có thể tham khảo hàm sau:PHP:Option ExplicitFunction DongThapMuoi(StrC As String, Optional Thuan As Boolean = True) As String ReDim Arr(1 To 12) As String Dim J As Integer, VTr As Byte, W As Byte Arr(1) = "DEFGHIJKLMNOPQSTUVWXYZABC" 'D' Arr(2) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O' Arr(3) = "NOPQRSTUVWXYZABCDEFGHIJKLM" 'N' Arr(4) = "GHIJKLMNOPQRSTUVWXYZABCDEF" 'G' Arr(5) = "TUVWXYZABCDEFGHIJKLMNOPQRS" 'T' Arr(6) = "HIJKLMNOPQRSTUVWXYZABCDEFG" 'H' Arr(7) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'A' Arr(8) = "PQRSTUVWXYZABCDEFGHIJKLMNO" 'P' Arr(9) = "MNOPQRSTUVWXYZABCDEFGHIJKL" 'M' Arr(10) = "UVWXYZABCDEFGHIJKLMNOPQRST" 'U' Arr(11) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O' Arr(12) = "IJKLMNOPQRSTUVWXYZABCDEFGH" 'I' For J = 1 To Len(StrC) If Thuan Then VTr = InStr(Arr(7), Mid(StrC, J, 1)) Else W = J Mod (Len("DongThapMuoi")) If W = 0 Then W = Len("DongThapMuoi") VTr = InStr(Arr(W), Mid(StrC, J, 1)) End If If VTr Then If Thuan Then W = J Mod (Len("DongThapMuoi")) If W = 0 Then W = Len("DongThapMuoi") DongThapMuoi = DongThapMuoi & Mid(Arr(W), VTr, 1) Else DongThapMuoi = DongThapMuoi & Mid(Arr(7), VTr, 1) End If Else DongThapMuoi = DongThapMuoi & " " End If Next JEnd Function
Option ExplicitDim Arr(1 To 26, 1 To 26), R As Long, C As LongSub Vigenere() Dim ii As Long For C = 1 To 26 For R = 1 To 26 ii = R + C - 1 Arr(R, C) = Chr(ii - 26 * (ii \ 27) + 64) Next NextEnd SubFunction Encrypt(ByVal MyStr As String, ByVal Key As String, Optional Thuan As Boolean = True) As String Dim i As Long, Char1 As String, Char2 As String, Ox As String, XY As String Call Vigenere For i = 1 To Len(MyStr) Char1 = UCase(Mid(MyStr, i, 1)) If Char1 " " Then Char2 = UCase(Mid(Key, i - Len(Key) * ((i - 1) \ Len(Key)), 1)) Else Encrypt = Encrypt & Char1 End If For C = 1 To 26 For R = 1 To 26 If Thuan Then If Arr(R, 1) = Char2 And Arr(1, C) = Char1 Then Encrypt = Encrypt & Arr(R, C) Else If Arr(R, 1) = Char2 And Arr(R, C) = Char1 Then Encrypt = Encrypt & Arr(1, C) End If Next Next NextEnd Function
Sub Test() Dim Encrypted As String Encrypted = Encrypt("TRI THUC LA SUC MANH CUA LOAI NGUOI", "DongThapMuoi") Debug.Print Encrypted Debug.Print Encrypt(Encrypted, "DongThapMuoi", False)End Sub
BÀI 5A
Hãy viết hàm mã hóa & giãi mã mệnh đề nào đó với từ khóa là 'STOP' áp dụng cho hình vuông bên trên;
Các bạn có thể tham khảo hàm sau:
PHP:Option Explicit Function DongThapMuoi(StrC As String, Optional Thuan As Boolean = True) As String ReDim Arr(1 To 12) As String Dim J As Integer, VTr As Byte, W As Byte Arr(1) = "DEFGHIJKLMNOPQSTUVWXYZABC" 'D' Arr(2) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O' Arr(3) = "NOPQRSTUVWXYZABCDEFGHIJKLM" 'N' Arr(4) = "GHIJKLMNOPQRSTUVWXYZABCDEF" 'G' Arr(5) = "TUVWXYZABCDEFGHIJKLMNOPQRS" 'T' Arr(6) = "HIJKLMNOPQRSTUVWXYZABCDEFG" 'H' Arr(7) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'A' Arr(8) = "PQRSTUVWXYZABCDEFGHIJKLMNO" 'P' Arr(9) = "MNOPQRSTUVWXYZABCDEFGHIJKL" 'M' Arr(10) = "UVWXYZABCDEFGHIJKLMNOPQRST" 'U' Arr(11) = "OPQRSTUVWXYZABCDEFGHIJKLMN" 'O' Arr(12) = "IJKLMNOPQRSTUVWXYZABCDEFGH" 'I' For J = 1 To Len(StrC) If Thuan Then VTr = InStr(Arr(7), Mid(StrC, J, 1)) Else W = J Mod (Len("DongThapMuoi")) If W = 0 Then W = Len("DongThapMuoi") VTr = InStr(Arr(W), Mid(StrC, J, 1)) End If If VTr Then If Thuan Then W = J Mod (Len("DongThapMuoi")) If W = 0 Then W = Len("DongThapMuoi") DongThapMuoi = DongThapMuoi & Mid(Arr(W), VTr, 1) Else DongThapMuoi = DongThapMuoi & Mid(Arr(7), VTr, 1) End If Else DongThapMuoi = DongThapMuoi & " " End If Next J End Function
Option Explicit
Dim Arr(1 To 26, 1 To 26), R As Long, C As Long
Sub Vigenere()
Dim ii As Long
For C = 1 To 26
For R = 1 To 26
ii = R + C - 1
Arr(R, C) = Chr(ii - 26 * (ii \ 27) + 64)
Next
Next
End Sub
Function Encrypt(ByVal MyStr As String, ByVal Key As String, Optional Thuan As Boolean = True) As String
Dim i As Long, Char1 As String, Char2 As String, Ox As String, XY As String
Call Vigenere
For i = 1 To Len(MyStr)
Char1 = UCase(Mid(MyStr, i, 1))
If Char1 <> " " Then
Char2 = UCase(Mid(Key, i - Len(Key) * ((i - 1) \ Len(Key)), 1))
Else
Encrypt = Encrypt & Char1
End If
For C = 1 To 26
For R = 1 To 26
If Thuan Then
If Arr(R, 1) = Char2 And Arr(1, C) = Char1 Then Encrypt = Encrypt & Arr(R, C)
Else
If Arr(R, 1) = Char2 And Arr(R, C) = Char1 Then Encrypt = Encrypt & Arr(1, C)
End If
Next
Next
Next
End Function
Sub Test()
Dim Encrypted As String
Encrypted = Encrypt("TRI THUC LA SUC MANH CUA LOAI NGUOI", "DongThapMuoi")
Debug.Print Encrypted
Debug.Print Encrypt(Encrypted, "DongThapMuoi", False)
End Sub
Code Anh đưa tham khảo sao mã hóa chữ T đầu tiên thành chữ X nhỉ? lẽ ra phải là chữ W mới đúng?
Option Explicit
Function NghiaLo(StrC As String, TuKhoa As String, Optional Thuan As Boolean = True) As String
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
End Function
BÀI 5A
Hãy viết hàm mã hóa & giãi mã mệnh đề nào đó với từ khóa là 'STOP' áp dụng cho hình vuông bên trên;
[thongbao]Bây giờ mình đề xuất cột chứa các ký tự của mật mã và dòng chứa các ký tự của chuỗi cần mã hóa là bất kỳ: X, Y với X, Y là số nguyên và thuộc [1, 26]. Viết hàm để mã hóa và giải mã như trên nhưng có thêm hai tham số X và Y.
Hàm có dạng Mahoa(Chuỗi, khóa, X, Y, tùy chọn khóa hoặc mở).
[/thongbao]
Mình nhất trí với bạn; Nhưng ta nên viết hàm
= MaHoa(Chuỗi, khóa, X, Optional Y=1, tùy chọn khóa hoặc mở)
Sau đó mới tiến dần đến 2 tham số X & Y đều biến thiên.
Bạn nghỉ sao?
Ok! Xin mời các bạn giải.
-------------------------------------------------------------------------------------------------
Đúng là tính học thuật có tăng lên, nhưng tính bảo mật cũng tăng: Lỡ "lộ" khóa thì "đối phương" khó mò ra hơn, giả sử là họ biết cách giải, biết khóa, nhưng không biết X, Y cũng tốn nhiều thời gian vì phải xét 26^2 trường hợp!
Option Explicit
[B]Sub GPE()
[/B]Dim Rng As Range, Cls As Range
Dim StrC As String, SMa As String
Dim J As Long
[COLOR=#0000cd]'Xác Dinh Vùng Khoá Ma Buóc 1:'[/COLOR]
Set Rng = [b2].CurrentRegion
[COLOR=#0000cd]'Chuyen Menh Dè Càn Ma Hóa Vo Bién:'
[/COLOR]StrC = [i1].Value
[COLOR=#0000cd]'Nhan Chuoi Ma Hoá Buóc I:'
[/COLOR]SMa = MaHoaADFGVX1(Rng, StrC)
[COLOR=#0000cd]'Fan Fói Chuoi Da Ma Hoá Len Vùng Hien Thi Két Qua:'[/COLOR]
For Each Cls In Range("B13:g19")
J = J + 1
Cls.Value = Mid(SMa, J, 1)
Next Cls
[B]End Sub
[/B]
Function MaHoaADFGVX1(Rng As Range, StrC As String) As String
Dim sRng As Range: Dim J As Integer
StrC = UCase$(StrC) '*'
'Loai Bót, Chi Láy Vùng Chúa Du Lieu 6x6=36 O:'
If Rng.Rows.Count > 6 Then Set Rng = Rng(1).Offset(1, 1).Resize(6, 6)
'Tao Vòng Lap Duyet Tùng Ký Tu Trong Chuoi Càn Ma Hóa:'
For J = 1 To Len(StrC)
'Tìm Dia Chi Dang Chúa Ký Tu Ma Hóa Dang Duyet:'
Set sRng = Rng.Find(Mid(StrC, J, 1), , xlValues, xlWhole)
'Khi Tìm Tháy, Ta Láy Tù Dàu Dong & Tù Dàu Cot Dua Vo Chuoi Két Qua Ma Hóa:'
If Not sRng Is Nothing Then
MaHoaADFGVX1 = MaHoaADFGVX1 & Cells(sRng.Row, "A").Value & Cells(1, sRng.Column).Value
End If
Next J
End Function
Option Explicit
Function MaHoa(StrC As String)
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
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
End Function