Hôm nay chủ nhật nắng đẹp, trời trong, tôi quyết định ngồi hoàn thành cho xong cái phần mềm nho nhỏ mà hồi Tết Ta 2017 (là hồi đầu năm nay) có ngồi nghiên cứu nhưng chưa hoàn thành xong. Dạo này cắm đầu ôn luyện CTF (vẫn là con gà) nên có xài khá nhiều tới những tool hỗ trợ decrypt mã hoá Caesar. Cứ vô mấy trang tập luyện cho newbie chơi là kiểu gì bạn cũng gặp chí ít 1 câu Crypto dính tới Caesar cipher. Bật mí luôn là hồi trước không tài nào viết đúng chính tả tên của ông này, nhưng ngồi nghiền ngẫm cách demo nó suốt cả một ngày trời thì cũng viết đúng được!

Thật ra mã hoá Caesar nếu nhớ không lầm thì tôi từng viết về nó trên blog một vài lần rồi. Chỉ không chắc là có xoá mất bài viết đó không. Tóm tắt sơ sơ về mã này đi cho dễ hiểu.

Mã hoá Caesar được vua Julius Caesar sáng chế ra để nhằm truyền tin trong thời chiến tranh. Khởi điểm ý tưởng cổ điển của nó là bạn chỉ cần viết ra toàn bộ bảng chữ cái gốc ở trên, sau đó viết thêm một bảng nữa nhưng đặt xê dịch vị trí các chữ so với bản gốc một vị trí nhất định. Giả dụ, ta để khác 3 vị trí, thì chữ ‘a’ trong bản gốc sẽ trở thành chữ ‘d’ trong bản mã hoá. Rất đơn giản.

Tôi sử dụng nó rất nhiều, không đếm nổi số lần luôn. Có lần xài ở trang web này, có lần xài ở trang web kia, tuỳ theo lần search nào nó ra thứ tự kết quả kiểu gì. Thì nguyên tắc là vậy, phải giải nhanh để còn tìm ra flag mà đem submit thôi. Nhưng rồi mấy bữa nay mạng tốc độ bị chập chờn, thế là vô mấy trang tool đó cực khổ vô cùng. Nghĩ bụng sao mình không tự code một cái luôn để trong máy có mà xài, việc gì phải đi nhờ vả mấy trang web kia? Thế là tối hôm thứ 7 đi ngồi đọc lại lý thuyết một lần nữa.

Ý tưởng của các thuật giải mã hoá luôn là: văn bản gốc nhập vào phải là ở dạng chữ thường, không dấu cách và khi encrypt thì văn bản mã phải ở dạng chữ IN HOA. Ok. Nắm ý tưởng rồi. À quên, trong lúc lục tìm tài liệu, tôi có tìm được 2 công thức chính của mã hoá Caesar này.

Công thức cho mã hoá:

encrypt

Công thức để giải mã:

decrypt

Rồi, sau khi ăn sáng, đọc báo, ôm hun người yêu một cái rồi vào ngồi vào bàn, mở máy lên và bắt đầu thực hiện ý tưởng. Nói như vầy không phải để bạn thấy nó khó khăn, ghê gớm, nguy hiểm, cao siêu hay gì hết. Người nào học lập trình giỏi là làm trong 10 phút là xong thôi. Do tôi lập trình dở, ý tưởng dỏm nên code hơi lâu. Cả quá trình làm phần mềm nhỏ này, tôi viết nó bằng C# trên bộ Visual Studio hết. Bạn thích thì bạn viết bằng ngôn ngữ khác đều được.

Mất gần 1 tiếng để viết ra bản hoàn chỉnh của phần mềm trên nền giao diện Console. Do tôi thử nhiều dạng rồi cuối cùng mới chọn cách đẹp và đơn giản nhất để viết. Lúc đầu còn ngớ ngẩn đi lấy Dex number của character trong bảng ASCII, cho đến khi thử luôn i=’a’ thì thấy nó chạy trơn tru =))))

caesar console.PNG

Mã hoá plain text nhập vào với rotate = 3

Nhìn ngon lành rồi phải không? Thật ra nó chưa có catch hết các trường hợp lỗi đó. Trên Console thì nhìn ngon lành, nhưng đem qua Window Form thì nó xuất ra duy nhất 1 ký tự cuối cùng! Sau khi viết dạng Windows Form rồi đưa bạn bè test thử, tôi mới thấy nó quá trời lỗi luôn. Không xử lý vụ chữ hoa chữ thường chen lẫn (nhập vào “Vo Tinh Thuong” thay vì nhập “vo tinh thuong” là dính chưởng), các ký tự dạng symbol cũng mã luôn, bảng số đếm cũng mã, nhập chữ hoa toàn bộ cũng mã luôn (dù trật lất).

Chưa kể, lúc viết phần decrypt ngược lại để lấy plain text, công thức còn sai dẫn đến trả kết quả tầm bậy. Nói không tham khảo tut, article trên mạng thì nguỵ biện, nhưng quả thật tham khảo xong thấy nó….khó hiểu quá! @@ Ngồi tự lấy giấy nháp ra viết ý tưởng rồi code thấy dễ hiểu hơn. Chỉ có công thức mã hoá thì tham khảo trên mạng, và vì nó cũng kinh điển quá rồi, nhưng có vẻ cũng không hẳn là giống, vì có sửa đổi chút xíu. Chính cái sửa đổi đó mà lao đao cả buổi, báo hại phải chạy lên Stackoverflow hỏi mới thấy cái ngu!

Tới chiều cũng code xong bản 1.1 sửa lỗi cho bản 1.0 được công bố cách đó 15 phút! hahaha…

windows form.PNG

Có một góp ý mà tôi băn khoăn rồi cuối cùng quyết định không làm bản 1.2 để sửa nó. Theo ý tưởng gốc thì văn bản mã hoá phải được chuyển hết thành chữ IN HOA khi xuất kết quả ra. Nhưng trong nhiều lần chơi các bài thi ở các site luyện CTF, tôi thấy vấn đề này không còn quá nặng nề nữa. Bạn chỉ cần giải ra được mã hoá và tuỳ thuộc yêu cầu của hệ thống tổ chức CTF game có yêu cầu gì khác biệt không (như Wargame của Whitehat thì yêu cầu băm flag bằng SHA-1 chẳng hạn) thì mới phải xử lý kết quả tìm được. Còn đa số trường hợp, chỉ cần tìm ra được flag là ngon rồi. Không cần cầu kỳ phức tạp. Muốn thì thêm một xíu vào code là được thôi. Nhưng để công cụ linh hoạt cho công việc – chung quy tôi viết nó cũng để bản thân xài chứ ai xài đâu – nên không thay đổi gì nhiều nữa.

Link tải bản 1.1 để xài thử ở đây. Do tôi viết nó trên nền Visual Studio 2015 và build ra với .NET Framework 4.5.2 nên nếu bạn không cài đúng version của .NET này (cao hơn thì ok) thì có khả năng không chạy được.

Video để xem tham khảo cách xài: https://youtu.be/nkv0V4Lcs40

VÕ TÌNH THƯƠNG

votinhthuong9@gmail.com

Advertisements