Từng bước giải mã một mật thư nhỏ
Trước đây trong bài “Mật thư (bài căn bản)” chúng ta đã biêt qua khái niệm mật thư. Trong bài viết này ta thử phân tích một trường hợp lạc lối điển hình trong quá trình giải mật thư. Mặc dù vậy đó cũng là bài học để chúng ta rút ra những kinh nghiệm hữu ích.
Decode một mật mã nhỏ – Hoàng Huỳnh
Vừa rồi có một người nhờ tôi decode một đoạn code như thế này:
01010100 01101111 01101101 - 01101000 01110101 01101101 - 01100011 01110101 01100001 - 01110010 01101001 01100101 01101110 01100111 - 01100101 01101101.
01000101 01101101 - 01111001 01100101 01110101 - 01100001 01101110 01101000, - 01110110 01100001 - 01100101 01101101 - 01101101 01110101 01101110 01101110 - 01101110 01101111 01101001 - 01100011 01101000 01101111 - 01110100 01100001 01110100 - 01100011 01100001 - 01101101 01101111 01101001 - 01100010 01101001 01100101 01110100. - 01000101 01001101 - 01011001 01000101 01010101 - 01000001 01001110 01001000.
Đoạn code rõ ràng là mã nhị phân, hơn nữa các số lại được nhóm theo từng bộ 8 ký tự rất giống 8 bits của 1 byte. Những ký tự ‘-’, ‘ ‘, ‘.’, ‘,’ có lẽ là những dấu ngắt từ và ngắt câu bình thường. Quan sát một chút, tất cả các số nhị phân này đều bắt đầu bằng 0 nên tôi mạnh dạn mở ngay calulator (calc) lên chuyển thử mấy số nhị phân đầu tiên ra thập phân. Ah, số thứ 3 và số thứ 6 có cùng giá trị. Tôi copy tất cả dán vào notepad thử tìm xem còn những số nào giống nhau. Có khá nhiều. Vậy rất có thể văn bản được mã hóa theo khóa kiểu Caesar. Nếu đúng vậy thì thật mừng , vì cùng lắm thì tôi sẽ brute force attack.
Trong đoạn này Hoàng Huỳnh đã sử dụng một số thuật ngữ.
1. Decode: tức là giải mã.
2. Khóa kiểu Caesar: Mật mã Caesar là một trong những loại mật mã lâu đời nhất xuất hiện dưới triều đại Caesar đại đế, tương truyền do Caesar sáng tạo ra. Đây là một mật mã thuộc hệ thống thay thế, theo đó một ký tự sẽ được thay thế bằng một ký tự.
3. Brute force attack: Dịch từng chữ là tấn công bạo lực. Đây là phương pháp bẻ khóa bằng cách duyệt tất cả các trường hợp và thử sai từng trường hợp cho đến khi mật mã bị phá hoàn toàn. Thực ra đây là cách dùng rất phổ biến trong giải mật thư GĐPT, để thực hiện cách giải này nhanh chóng anh chị em nên chia mật thư thành nhiều bản và giải theo nhiều hướng khác nhau. Cách này là tối ưu!
Nhưng trước tiên phải chuyển hết văn bản sang số nhị phân đã. Tôi viết một đoạn code nhỏ để làm việc này cho nhanh.
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("code.txt");
ofstream fout("decode.txt");
int main() {
char ch;
int i,s,p;
while (!fin.eof()) {
fin.get(ch);
if (ch=='0' || ch=='1') {
s=0; p=128;
if (ch=='1') s+=(ch-48)*p;
for (i=0; i < 7; i++) {
p/=2;
fin.get(ch);
if (ch=='1') s+=(ch-48)*p;
}
fout << s;
}
else
fout << ch;
}
return 0;
}
Chạy thử, file decode.txt cho ta:
84 111 109 - 104 117 109 - 99 117 97 - 114 105 101 110 103 - 101 109.
69 109 - 121 101 117 - 97 110 104, - 118 97 - 101 109 - 109 117 110 110 - 110 111 105 - 99 104 111 - 116 97 116 - 99 97 - 109 111 105 - 98 105 101 116. - 69 77 - 89 69 85 - 65 78 72.
Hừm, rõ ràng là mã hóa Caesar, những “ký tự” như 109 và 117 lặp lại khá nhiều (đây hẳn là các nguyên âm). Cụm 101 109 lặp lại 2 lần. Nhìn vào cấu trúc mỗi tiếng có không quá 5 ký tự, tôi đoán đây là văn bản Tiếng Việt, có lẽ không dấu. Tuy nhiên đoạn 110 110 – 110 làm tôi khá lúng túng, trong văn bản Tiếng Việt không dấu không thể tìm từ nào 2 ký tự cuối giống nhau cả. Liệu đây có phải đây là văn bản Caesar? Chắn chắn rồi.Nhận thấy số hiệu của các ký tự khá lớn, tôi nghĩ chắc phải (1) chia lấy dư cho 26 (số chữ cái từ A-Z) hoặc (2) lùi tất cả về cùng một lượng nào đó. Cũng có khả năng xấu nhất là (3) phải tìm bảng đối chiếu từng số với mỗi ký tự, công việc này chắc chắn là khó khăn hơn nhiều. (Dù sao thì nhờ vào một bảng phân bố số lượng các chữ cái thì việc này cũng không đến nỗi quá mất thời gian.)
Thay vì dùng giấy viết Hoàng Huỳnh dùng chương trình để chuyển đổi. Mặc dù chưa đi đúng hướng nhưng những nhận xét đoạn trên là tinh tế rất đáng để học hỏi khi giải một mật mã không có khóa.
Bảng phân bố số lượng chữ cái thường được áp dụng để giải mật mã. Người ta phân tích mật mã xem xét số lần xuất hiện các ký hiệu trong mật mã rồi so sánh nó với số lần xuất hiện các ký tự trong bảng chữ cái rồi từ đó rút ra kết luận. VD trong tiếng anh ký tự e xuất hiện nhiều nhất kế đến là a… nếu trong mật mã một ký hiệu nào đó xuất hiện nhiều nhất rất có thể đó là e hoặc a. Để hiểu rõ thêm về cách suy luận này có thể tìm đọc truyện “Những hình nhân nhảy múa – Sherlock Holmes” (*)
Vậy là tôi tiếp tục với đoạn mã C++. Thử (1) chia cho 26 xem sao.
//fout << s;
fout << (char) (s%26 + 97); // cộng thêm 97 vì 97 là vị thứ của chữ 'a' trong bảng mã ASCIIKết quả: g h f - a n f - v n t - k b x g z - x f.
r f - r x n - t g a, - o t - x f - f n g g - g h b - v a h - m t m - v t - f h b - u b x m. - r z - l r h - n a u.
Ký tự có vẻ loạn xạ ngầu. Không sao, thử dịch lên và xuống vài đơn vị xem sao. Thay Vẫn không thành công. Có thể tiếp tục thử thêm nhiều trường hợp những tôi quyết định không làm nữa mà chuyển qua phương án sau. Tôi thấy trong code số 65 là nhỏ nhất, nên quyết định shift tất cả về 65 đơn vị. Mới đầu thì toàn là ký tự loạn xạ, nhưng thật bất ngờ, đoạn cuối có một văn bản đọc được: “-em – yeu – anh”.
Vậy là đã có chút manh mối, có thể tiếp tục với cách decode này. Tại sao lại chỉ có 1 phần văn bản được decoded?
Bài viết đến đây chấm dứt bởi vì Hoàng Huỳnh đã giải được mật mã trên một cách hết sức đơn giản: chuyển đổi trực tiếp từ mã nhị phân (binary) sang ký tự (text). Bạn có thể chép mật mã trên vào trang này để giải mã.
Bạch văn là:
“Tom hum cua rieng em. Em yeu anh va em mun noi cho tat ca moi biet. EM YEU ANH”.
Thực chất code này rất đơn giản và người ta có thể giải trong vòng vài phút. Vấn đề chính ở đây là ngay từ đầu Hoàng Huỳnh đã định hướng sai do đã “phức tạp hóa”. Thực tế trong giải mật thư trường hợp này gặp rất nhiều. Để vượt qua được cần người giải phải có thật nhiều kinh nghiệm. (*)
Trong bài viết này, các bạn không nên chú ý dến các đoạn code rắc rối phức tạp mà chú ý đến phương pháp làm của Hoàng Huỳnh, và kiến thức cơ bản của anh ta về giải mật thư. Đó đều là những thứ đáng để học hỏi.
Hồng Hòa Vi
(*) Chú thích của người viết
Giải hộ mình kí tiwj 01001000
ReplyDelete