Ba phương pháp mã hóa chuỗi đơn giản
Đã gửi: T.Bảy 19/09/2009 8:46 pm
Thủ thuật: Ba phương pháp mã hóa đơn giản về chuỗi ký tự
Tác giả: Alexander Đặng Nhật Anh
Mô tả: Dùng các phương pháp này để mã hóa những nội dung nhạy cảm một cách dễ dàng nhưng cũng khó "hack".
Trong bài viết này, Alex xin trình bày với các anh em ba cách đơn giản để mã hóa một chuỗi ký tự, giới hạn ở phạm vi ASCII. Dùng một trong các cách này, hoặc phối hợp với nhau, chúng ta có thể biến chuỗi ký tự bình thường thành một nội dung không dễ dịch ngược nếu không có mật mã. Kỹ thuật cốt lõi là biến đổi ký tự theo một giá trị nhứt định, kiểu như "abc" thành "def", nhưng làm cho nó phức tạp lên một chút.
Vì tên gọi đầy đủ của các phương pháp hơi dài dòng nên xin dùng tạm các tên mã (codename).
Phương pháp 1: Malgo - Biến đổi ký tự theo kiểu lên xuống lần lượt
Cách thực hiện là lấy mã ASCII của ký tự rồi cộng hoặc trừ cho một giá trị (tạm gọi là Shifting value). Nếu ký tự trước được cộng mã, thì ký tự sau được trừ mã. Theo mặc định khi mã hóa sẽ thực hiện phép cộng ở ký tự đầu tiên, còn khi giải mã thì phép trừ được làm trước. Do bản chất của phương pháp này nên nó còn được gọi là Zigzag Shifting. Đây là phương pháp đơn giản nhứt trong số ba phương pháp. Chỉ cần biết giá trị biến đổi (một con số) là giải mã được.
Mã nguồn:
Phương pháp 2: Federo - Biến đổi ký tự bằng cách cộng toàn chuỗi
Cách thực hiện là dùng một chuỗi khóa (Key String) để cộng vào chuỗi ban đầu. Thí dụ: chuỗi ban đầu là "abcdefgh", chuỗi khóa (hay mật mã) là "xyz" thì ta thực hiện (a+x, b+y, c+z, d+x, e+y, f+z, g+x, f+y). Phương pháp này cần một mật khẩu để giải mã.
Mã nguồn:
Phương pháp 3: Federo16 (HexaFedero) - Thập lục phân hóa và biến đổi bằng cách cộng toàn chuỗi
Cách thực hiện gồm 2 bước. Bước thứ nhứt là tính mã ASCII của ký tự ra hai chữ số thập lục phân. Cứ vậy mà thực hiện, thì tương ứng với mỗi ký tự ở chuỗi ban đầu, ta có hai chữ số thập lục phân từ mã ASCII của nó. Bước thứ nhì là mã hóa chuỗi thập lục phân bằng phương pháp Federo. Trong số ba phương pháp thì đây là phương pháp khó bẻ khóa nhứt, nhưng cũng sẽ làm nội dung ban đầu tăng gấp đôi kích thước.
Mã nguồn:
Trên đây là ba phương pháp mã hóa tuy đơn giản nhưng cũng khá hữu hiệu đối với các công việc cần đến mã hóa nhưng không yêu cầu tính chất bảo mật cao. Các phương pháp này do Alex nghĩ ra, nhưng có thể trùng với các phương pháp đã có. Nếu thực vậy, và có ai nhận ra, thì xin nói ra đây cho mọi người cùng biết.
Tác giả: Alexander Đặng Nhật Anh
Mô tả: Dùng các phương pháp này để mã hóa những nội dung nhạy cảm một cách dễ dàng nhưng cũng khó "hack".
Trong bài viết này, Alex xin trình bày với các anh em ba cách đơn giản để mã hóa một chuỗi ký tự, giới hạn ở phạm vi ASCII. Dùng một trong các cách này, hoặc phối hợp với nhau, chúng ta có thể biến chuỗi ký tự bình thường thành một nội dung không dễ dịch ngược nếu không có mật mã. Kỹ thuật cốt lõi là biến đổi ký tự theo một giá trị nhứt định, kiểu như "abc" thành "def", nhưng làm cho nó phức tạp lên một chút.
Vì tên gọi đầy đủ của các phương pháp hơi dài dòng nên xin dùng tạm các tên mã (codename).
Phương pháp 1: Malgo - Biến đổi ký tự theo kiểu lên xuống lần lượt
Cách thực hiện là lấy mã ASCII của ký tự rồi cộng hoặc trừ cho một giá trị (tạm gọi là Shifting value). Nếu ký tự trước được cộng mã, thì ký tự sau được trừ mã. Theo mặc định khi mã hóa sẽ thực hiện phép cộng ở ký tự đầu tiên, còn khi giải mã thì phép trừ được làm trước. Do bản chất của phương pháp này nên nó còn được gọi là Zigzag Shifting. Đây là phương pháp đơn giản nhứt trong số ba phương pháp. Chỉ cần biết giá trị biến đổi (một con số) là giải mã được.
Mã nguồn:
Mã: Chọn hết
- 'Mã hóa: sKetQua = Malgo(sChuoiCanMaHoa, sGiaTriBienDoi)
- Function Malgo(ByVal src As String, ByVal v As Integer) As String
- Dim result As String
- Dim i%, f As Boolean
- For i = 1 To Len(src)
- result = result & Chr(Asc(Mid$(src, i, 1)) + IIf(f, v, (-v)))
- Next i
- Malgo = result
- End Function
-
- 'Giải mã: sKetQua = MalgoDecrypt(sChuoiDaMaHoa, iGiaTriBienDoi)
- Function MalgoDecrypt(ByVal src As String, v As Integer) As String
- Dim result As String
- Dim i%, f As Boolean: f = True
- For i = 1 To Len(src)
- result = result & Chr(Asc(Mid$(src, i, 1)) + IIf(f, v, (-v)))
- Next i
- MalgoDecrypt = result
- End Function
Phương pháp 2: Federo - Biến đổi ký tự bằng cách cộng toàn chuỗi
Cách thực hiện là dùng một chuỗi khóa (Key String) để cộng vào chuỗi ban đầu. Thí dụ: chuỗi ban đầu là "abcdefgh", chuỗi khóa (hay mật mã) là "xyz" thì ta thực hiện (a+x, b+y, c+z, d+x, e+y, f+z, g+x, f+y). Phương pháp này cần một mật khẩu để giải mã.
Mã nguồn:
Mã: Chọn hết
- 'Mã hóa: sKetQua = Federo(sChuoiCanMaHoa, sMatKhau)
- Function Federo(ByVal src As String, ByVal FStr As String) As String
- Dim result As String
- Dim i%, j%
- j = 1
- For i = 1 To Len(src)
- result = result & Chr(Asc(Mid$(src, i, 1)) + Asc(Mid$(FStr, j, 1)))
- j = IIf((j = Len(FStr)), 1, j + 1)
- Next i
- Federo = result
- End Function
-
- 'Giải mã: sKetQua = FederoDecrypt(sChuoiDuocMaHoa, sMatKhau)
- Function FederoDecrypt(ByVal src As String, ByVal FStr As String) As String
- Dim result As String
- Dim i%, j%
- j = 1
- For i = 1 To Len(src)
- result = result & Chr(Asc(Mid$(src, i, 1)) - Asc(Mid$(FStr, j, 1)))
- j = IIf((j = Len(FStr)), 1, j + 1)
- Next i
- FederoDecrypt = result
- End Function
Phương pháp 3: Federo16 (HexaFedero) - Thập lục phân hóa và biến đổi bằng cách cộng toàn chuỗi
Cách thực hiện gồm 2 bước. Bước thứ nhứt là tính mã ASCII của ký tự ra hai chữ số thập lục phân. Cứ vậy mà thực hiện, thì tương ứng với mỗi ký tự ở chuỗi ban đầu, ta có hai chữ số thập lục phân từ mã ASCII của nó. Bước thứ nhì là mã hóa chuỗi thập lục phân bằng phương pháp Federo. Trong số ba phương pháp thì đây là phương pháp khó bẻ khóa nhứt, nhưng cũng sẽ làm nội dung ban đầu tăng gấp đôi kích thước.
Mã nguồn:
Mã: Chọn hết
- 'Mã hóa: sKetQua = Federo16(sChuoiCanMaHoa, sMatKhau)
- Function Federo16(ByVal src As String, ByVal FStr As String) As String
- Dim result As String
- Dim temp$, h$, i%, j%
- j = 1
- For i = 1 To Len(src)
- h = Hex$(Asc(Mid$(src, i, 1)))
- If Len(h) = 1 Then h = "0" & h
- temp = temp & h
- Next i
- For i = 1 To Len(temp)
- result = result & Chr(Asc(Mid$(temp, i, 1)) + Asc(Mid$(FStr, j, 1)))
- j = IIf((j = Len(FStr)), 1, j + 1)
- Next i
- Federo16 = result
- End Function
-
- 'Giải mã: sKetQua = Federo16Decrypt(sChuoiDuocMaHoa, sMatKhau)
- Function Federo16Decrypt(ByVal src As String, ByVal FStr As String) As String
- Dim result As String
- Dim temp$, i%, j%
- j = 1
- For i = 1 To Len(src)
- temp = temp & Chr(Asc(Mid$(src, i, 1)) - Asc(Mid$(FStr, j, 1)))
- j = IIf((j = Len(FStr)), 1, j + 1)
- Next i
- For i = 1 To Len(temp) Step 2
- result = result & Chr(CLng("&H" & Mid$(temp, i, 2)))
- Next i
- Federo16Decrypt = result
- End Function
Trên đây là ba phương pháp mã hóa tuy đơn giản nhưng cũng khá hữu hiệu đối với các công việc cần đến mã hóa nhưng không yêu cầu tính chất bảo mật cao. Các phương pháp này do Alex nghĩ ra, nhưng có thể trùng với các phương pháp đã có. Nếu thực vậy, và có ai nhận ra, thì xin nói ra đây cho mọi người cùng biết.