Kỹ thuật giấu tin LSB

Ngày xửa ngày xưa tôi đã viết bài đăng đầu tiên trên trung tâm. Và bài đăng đó được dành riêng cho một vấn đề rất thú vị, đó là kỹ thuật giấu tin. Tất nhiên, giải pháp được đề xuất trong chủ đề cũ đó không thể được gọi là steganography theo đúng nghĩa của từ này. Đây chỉ là một trò chơi có định dạng tệp nhưng dù sao cũng là một trò chơi khá thú vị.

Hôm nay chúng ta sẽ cố gắng tìm hiểu sâu hơn một chút và xem xét thuật toán LSB. Nếu bạn quan tâm, bạn được chào đón dưới con mèo. (Dưới phần cắt là lưu lượng truy cập: khoảng một megabyte.)

Trước hết cần phải giới thiệu ngắn gọn. Mọi người đều biết rằng mục đích của mật mã là làm cho thông tin bí mật không thể đọc được. Tất nhiên, mật mã có những ứng dụng của nó, nhưng có một cách tiếp cận khác để bảo vệ dữ liệu. Chúng tôi không phải mã hóa thông tin nhưng giả vờ như chúng tôi không có thông tin đó. Đây chính xác là lý do tại sao kỹ thuật giấu tin được phát minh. Wikipedia đảm bảo với chúng ta rằng “steganography (từ tiếng Hy Lạp στεγανοσ - ẩn và tiếng Hy Lạp γραφω - tôi viết, nghĩa đen là “văn bản bí mật”) là khoa học về việc truyền tải thông tin ẩn bằng cách giữ bí mật sự thật về việc truyền tải.

Tất nhiên, không ai cấm việc kết hợp các phương pháp mật mã và steganographic. Hơn nữa, trong thực tế họ làm điều này, nhưng nhiệm vụ của chúng ta là hiểu những điều cơ bản. Nếu bạn nghiên cứu kỹ bài viết trên Wikipedia, bạn sẽ phát hiện ra rằng các thuật toán steganography bao gồm cái gọi là. thùng chứa và tin nhắn. Vùng chứa là bất kỳ thông tin nào giúp che giấu thông điệp bí mật của chúng tôi.

Trong trường hợp của chúng tôi, vùng chứa sẽ là hình ảnh ở định dạng BMP. Đầu tiên chúng ta hãy xem cấu trúc của tập tin này. Tệp có thể được chia thành 4 phần: tiêu đề tệp, tiêu đề hình ảnh, bảng màu và chính hình ảnh. Vì mục đích của chúng tôi, chúng tôi chỉ cần biết những gì được viết trong tiêu đề.

Hai byte đầu tiên của tiêu đề là chữ ký BM, sau đó kích thước tệp tính bằng byte được ghi bằng một từ kép, 4 byte tiếp theo được dành riêng và phải chứa số 24, và cuối cùng, một từ kép khác chứa phần bù từ đầu của tập tin vào byte thực tế của hình ảnh. Trong tệp bmp XNUMX bit, mỗi pixel được mã hóa bằng ba byte BGR.

Bây giờ chúng ta đã biết cách truy cập vào hình ảnh, tất cả những gì còn lại là hiểu cách chúng ta có thể viết thông tin chúng ta cần vào đó. Đối với điều này, chúng ta sẽ cần phương pháp LSB. Bản chất của phương pháp này như sau: chúng tôi thay thế các bit có trọng số thấp nhất trong các byte chịu trách nhiệm mã hóa màu. Giả sử nếu byte tiếp theo của tin nhắn bí mật của chúng ta là 11001011 và các byte trong hình ảnh là...11101100 01001110 01111100 0101100111..., thì mã hóa sẽ trông như thế này. Chúng ta sẽ chia byte thông điệp bí mật thành 4 phần hai bit: 11, 00, 10, 11 và thay thế các bit bậc thấp của hình ảnh bằng các đoạn kết quả: ...11101111 01001100 01111110 0101100111…. Sự thay thế như vậy thường không được mắt người nhận thấy. Hơn nữa, nhiều thiết bị đầu ra cũ hơn thậm chí sẽ không thể hiển thị những thay đổi nhỏ như vậy.

Rõ ràng là bạn có thể thay đổi không chỉ 2 bit có ý nghĩa nhỏ nhất mà còn có thể thay đổi bất kỳ số nào trong số chúng. Có mô hình sau: chúng ta càng thay đổi nhiều bit thì chúng ta càng có thể ẩn nhiều thông tin hơn và điều này sẽ gây ra nhiều nhiễu hơn cho ảnh gốc. Ví dụ: đây là hai hình ảnh:

Kỹ thuật giấu tin LSB
Kỹ thuật giấu tin LSB

Mặc dù đã cố gắng hết sức, tôi không thể nhận ra sự khác biệt giữa chúng, tuy nhiên, trong hình ảnh thứ hai, sử dụng phương pháp được mô tả, bài thơ “The Hunting of the Snark” của Lewis Carroll đã bị ẩn đi. Nếu bạn đã đọc đến đây thì có thể bạn sẽ quan tâm đến việc tìm hiểu về cách triển khai. Nó khá đơn giản nhưng tôi sẽ cảnh báo ngay với bạn rằng mọi thứ đều được thực hiện ở Delphi. Có hai lý do cho việc này: 1. Tôi nghĩ Delphi là một ngôn ngữ tốt; 2. Chương trình này ra đời trong quá trình chuẩn bị một khóa học về kiến ​​thức cơ bản về thị giác máy tính và những người mà tôi đang dạy khóa học này chưa biết gì khác ngoài Delphi. Đối với những người không quen với cú pháp, một điều cần được giải thích: shl x là dịch chuyển bit sang trái x, shr x là dịch chuyển bit sang phải x.

Chúng tôi giả sử rằng chúng tôi đang viết văn bản được lưu trữ trong một chuỗi vào vùng chứa và thay thế hai byte thấp hơn:
Mã ghi âm:

đối với i:=1 thành length(str) thì làm
    bắt đầu
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Vị trí:=f.Vị trí-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Vị trí:=f.Vị trí-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Vị trí:=f.Vị trí-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Vị trí:=f.Vị trí-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    kết thúc;

mã để đọc:

for i:=1 tới MsgSize thì làm
    bắt đầu
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    kết thúc;

Chà, dành cho những người thực sự lười biếng - liên kết đến chương trình và mã nguồn của nó.

Cảm ơn bạn.

Nguồn: www.habr.com

Thêm một lời nhận xét