• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Ba phương pháp mã hóa chuỗi đơn giản

Các thủ thuật liên quan đến xử lý chuỗi và thời gian
Hình đại diện của người dùng
alexanderdna
Guru
Guru
Bài viết: 214
Ngày tham gia: T.Ba 14/07/2009 11:13 am
Đến từ: Sài Gòn
Has thanked: 3 time
Been thanked: 15 time

Ba phương pháp mã hóa chuỗi đơn giản

Gửi bàigửi bởi alexanderdna » 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:

Mã: Chọn hết

  1. 'Mã hóa: sKetQua = Malgo(sChuoiCanMaHoa, sGiaTriBienDoi)
  2. Function Malgo(ByVal src As String, ByVal v As Integer) As String
  3.     Dim result As String
  4.     Dim i%, f As Boolean
  5.     For i = 1 To Len(src)
  6.         result = result & Chr(Asc(Mid$(src, i, 1)) + IIf(f, v, (-v)))
  7.     Next i
  8.     Malgo = result
  9. End Function
  10.  
  11. 'Giải mã: sKetQua = MalgoDecrypt(sChuoiDaMaHoa, iGiaTriBienDoi)
  12. Function MalgoDecrypt(ByVal src As String, v As Integer) As String
  13.     Dim result As String
  14.     Dim i%, f As Boolean: f = True
  15.     For i = 1 To Len(src)
  16.         result = result & Chr(Asc(Mid$(src, i, 1)) + IIf(f, v, (-v)))
  17.     Next i
  18.     MalgoDecrypt = result
  19. 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

  1. 'Mã hóa: sKetQua = Federo(sChuoiCanMaHoa, sMatKhau)
  2. Function Federo(ByVal src As String, ByVal FStr As String) As String
  3.     Dim result As String
  4.     Dim i%, j%
  5.     j = 1
  6.     For i = 1 To Len(src)
  7.         result = result & Chr(Asc(Mid$(src, i, 1)) + Asc(Mid$(FStr, j, 1)))
  8.         j = IIf((j = Len(FStr)), 1, j + 1)
  9.     Next i
  10.     Federo = result
  11. End Function
  12.  
  13. 'Giải mã: sKetQua = FederoDecrypt(sChuoiDuocMaHoa, sMatKhau)
  14. Function FederoDecrypt(ByVal src As String, ByVal FStr As String) As String
  15.     Dim result As String
  16.     Dim i%, j%
  17.     j = 1
  18.     For i = 1 To Len(src)
  19.         result = result & Chr(Asc(Mid$(src, i, 1)) - Asc(Mid$(FStr, j, 1)))
  20.         j = IIf((j = Len(FStr)), 1, j + 1)
  21.     Next i
  22.     FederoDecrypt = result
  23. 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

  1. 'Mã hóa: sKetQua = Federo16(sChuoiCanMaHoa, sMatKhau)
  2. Function Federo16(ByVal src As String, ByVal FStr As String) As String
  3.     Dim result As String
  4.     Dim temp$, h$, i%, j%
  5.     j = 1
  6.     For i = 1 To Len(src)
  7.         h = Hex$(Asc(Mid$(src, i, 1)))
  8.         If Len(h) = 1 Then h = "0" & h
  9.         temp = temp & h
  10.     Next i
  11.     For i = 1 To Len(temp)
  12.         result = result & Chr(Asc(Mid$(temp, i, 1)) + Asc(Mid$(FStr, j, 1)))
  13.         j = IIf((j = Len(FStr)), 1, j + 1)
  14.     Next i
  15.     Federo16 = result
  16. End Function
  17.  
  18. 'Giải mã: sKetQua = Federo16Decrypt(sChuoiDuocMaHoa, sMatKhau)
  19. Function Federo16Decrypt(ByVal src As String, ByVal FStr As String) As String
  20.     Dim result As String
  21.     Dim temp$, i%, j%
  22.     j = 1
  23.     For i = 1 To Len(src)
  24.         temp = temp & Chr(Asc(Mid$(src, i, 1)) - Asc(Mid$(FStr, j, 1)))
  25.         j = IIf((j = Len(FStr)), 1, j + 1)
  26.     Next i
  27.     For i = 1 To Len(temp) Step 2
  28.         result = result & Chr(CLng("&H" & Mid$(temp, i, 2)))
  29.     Next i
  30.     Federo16Decrypt = result
  31. 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.



Hình đại diện của người dùng
delta_hung1992
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 81
Ngày tham gia: T.Năm 06/11/2008 10:51 pm

Re: Ba phương pháp mã hóa chuỗi đơn giản

Gửi bàigửi bởi delta_hung1992 » T.Hai 15/02/2010 1:52 pm

Em cũng xin mạn phép up lên một cách nữa: Toán tử Xor
Nó có một đặc điểm sau:
Giả dụ ta có 2 số A và B. Nếu lấy: A Xor B thì ta được một số C. Nhưng khi lấy C Xor B ta lại được A! Vì vậy, ý tưởng của em là:
-B1: Chuyển kí tự thành mã ASCII
-B2: Dùng toán tử Xor, mã hóa từng kí tự
-B3: Cuối cùng lưu vào file dưới dạng văn bản số
Nếu như theo công thức: A Xor B = C, thì B đóng vai trò là mật khẩu. Ta có thể lợi dụng điều này để phát triển thành một chương trình có khả năng dùng password để bảo vệ văn bản. Password ở đây là dạng số, tuy nhiên cũng có thể chuyển từ chữ => số dễ dàng. Tất nhiên, mật khẩu càng dài thì độ bảo mật càng cao, đồng nghĩa là dung lượng lớn! Dù vậy, đây cũng là một cách để mã hóa một file văn bản hiệu quả, em xin chia sẻ với mọi người. :)
Tập tin đính kèm
Encode, decode.rar
Encode and Decode
(10.05 KiB) Đã tải 835 lần
Keep moving forward

Hình đại diện của người dùng
doicanhden
Thành viên tích cực
Thành viên tích cực
Bài viết: 160
Ngày tham gia: T.Tư 02/09/2009 4:29 pm
Đến từ: Tp.HCM
Has thanked: 7 time
Been thanked: 3 time
Liên hệ:

Re: Ba phương pháp mã hóa chuỗi đơn giản

Gửi bàigửi bởi doicanhden » T.Hai 15/03/2010 3:12 pm

Giống Cái File Archive của Yahoo Nhỉ?
Chỉ Toàn Dùng Xor để mã hóa nội dung chat decode dễ ợt
Câu Lạc Bộ VB

bolide_1909
Bài viết: 1
Ngày tham gia: T.Sáu 18/03/2011 11:36 am

Re: Ba phương pháp mã hóa chuỗi đơn giản

Gửi bàigửi bởi bolide_1909 » T.Sáu 18/03/2011 11:52 am

Hiện tại em có học thêm C++, các anh có thể post lên diễn đàn cho em tham khảo.
post lên sớm nha các anh, em sắp thi C++ rồi.
cám ơn mấy anh trước nha !


Quay về “[VB] Chuỗi và Thời gian”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.0 khách