Thiết kế các module chương trình

Một phần của tài liệu ẨN GIẤU THÔNG TIN BẰNG PHƯƠNG PHÁP LSB (LEAST SIGNIFICANT BIT) CẢI TIẾN (Trang 54)

4.2.1. Mô tả thuật toán

Ẩn giấu thông tin bằng phương pháp LSB là phương pháp giấu tin vào bít ít quan trọng trong mẫu là bít có trọng số là 0, giá trị tác động của bít này lên mẫu là ±1 đơn vị. Với phạm vi của đề tài là thực hiện ẩn giấu thông tin bằng phương pháp LSB cải tiến nên thực hiện giấu tin vào các bít có trọng số cao hơn như là 1, 2, 3… và trọng số cao nhất mà đề tài này đề cập đến là 6, giá trị tác động của bít này lên mẫu là ±64 đơn vị. Bên cạnh đó ngoài việc thực hiện giấu tin vào các bít có trọng số cao, phương pháp cải tiến này còn thực hiện điều chỉnh giá trị của các bít có trọng số thấp hơn nhằm làm giảm thiểu việc tác động đến tín hiệu gốc. Cụ thể là nếu tăng hay giảm giá trị của mẫu (thông qua việc thay đổi trạng thái của bít chứa tin) sẽ làm ảnh hưởng đến chất lượng tín hiệu gốc. Để hạn chế điều này, khi tăng hay giảm giá trị của mẫu tại bít tin giấu thông tin mật thì đồng thời tiến hành giảm hay tăng giá trị của mẫu tại các bít tin đằng sau nó để sao cho việc tác động lên tín hiệu gốc là ít nhất.

Việc tệp WAVE chứa thông tin mật bị tấn công là điều hoàn toàn có thể xảy ra, khi bị tấn công việc cộng thêm hoặc trừ đi một giá trị nhỏ vào mẫu có thể tác động vào các bít thấp dẫn đến tác động đến các bít cao hơn. Điều này làm sai lệch giá trị của bít thông tin mật được giấu, dẫn đến nhận được thông tin sai trong quá trình trích xuất. Vì vậy tiến hành đặt một bít đệm có trạng thái giống trạng thái của bít chứa bít tin mật, bít này có trọng số nằm ngay sau trọng số của bít chứa bít tin mật.

Như vậy với trường hợp xấu nhất sảy ra thì tín hiệu gốc bị ảnh hưởng ±96 đơn vị trong chế độ giấu bít ở trọng số 6 (trong trường hợp nhúng bít tin mật giá trị 1 vào byte dạng xx001111 và bít tin mật giá trị 0 vào byte dạng xx110000). Trường hợp tốt nhất sảy ra thì tín hiệu gốc không bị thay đổi (giấu bít tin 1 vào byte dạng xx110000 hoặc bít 0 vào byte dạng xx001111).

Tệp WAVE (ở dạng chuẩn) mà chương trình tác động đều có hai kênh, tần số lấy mẫu là 44100Hz, số bít mỗi mẫu là 16 nên có số lượng mẫu là 44100*2*t với t là thời lượng của âm thanh, nghĩa là 1s phát âm thanh cần 88200 mẫu. Nếu thực hiện giấu lần lượt các bít tin vào các mẫu liên tiếp thì sẽ giấu được 11025 bytes thông tin mật tương đương với gần 6000 ký tự unicode 2 bytes trong 1s phát âm thanh. Tuy nhiên việc đó sẽ làm cho tín hiệu gốc bị thay đổi nhiều và dễ dàng bị trích xuất thông tin một cách không hợp pháp.

Để giải quyết vấn đề này chương trình thực hiện mã hoá thông tin mật bằng một khoá bí mật trước khi thực hiện nhúng. Thêm vào đó sẽ rải các bít tin vào các vị trí không liên tục nhau trong mảng các giá trị mẫu, các bước nhảy này cũng được quy định bởi khoá bí mật. Thực hiện tính toán lần thứ nhất trên mảng dữ liệu mẫu của tệp WAVE gốc để lấy ra các giá trị vị trí của mẫu phù hợp với khoá. Tuy nhiên trong mảng các vị trí được lấy ra có các giá trị mẫu bằng 0, nghĩa là âm thanh lúc này ở trạng thái im lặng. Việc giấu tin vào mẫu này sẽ làm ảnh hưởng lớn đến chất lượng của tín hiệu gốc cũng như không trong suốt với người thứ ba. Thực hiện tiến hành tính toán lần thứ hai trên mảng các vị trí mẫu thu được từ lần tính toán thứ nhất, tuỳ vào trọng số bít giấu tin mà lọc ra các giá trị có độ lớn nhất định, thường là lớn hơn trọng số bít giấu tin một bậc.

Trong quá trình lấy tin, cũng thực hiện việc lấy khoá với các tham số đầu vào giống như với quá trình giấu tin, sau đó sử dụng khoá này để tìm vị trí trích xuất thông tin trên mảng dữ liệu mẫu của tệp tin chứa thông tin mật. Thông tin mật được lấy theo từng bít một, khi lấy đủ 8 bít sẽ đưa vào một byte dữ liệu, quá trình cứ lặp đi lặp lại cho đến khi lấy hết tất cả thông tin ở những vị trí mẫu có thể giấu. Việc này là làm cho thông tin lấy ra có độ dài hơn thông tin mật ban đầu bao gồm thông tin mật và phần thông tin dư thừa. Nhưng việc này là cần thiết vì yêu cầu bảo mật cũng như khả năng chịu tác động trước các tấn công bên ngoài, người nhận tự nhận thức và thu hồi lại thông tin hợp lý.

4.2.2. Thiết kế các modulea. Module tính toán khoá a. Module tính toán khoá

Biểu đồ tiến trình module tính toán khoá:

Đầu vào: tệp WAVE chứa, tệp tin khoá, mật khẩu, chế độ giấu. Đầu ra: mảng khoá, mảng các vị trí mẫu dùng để giấu tin. Diễn giải:

Khoá được sử dụng trong quá trình nhúng và trích xuất thông tin để ngăn chặn những người không được phép truy cập vào thông tin một cách đầy đủ và dễ dàng. Khoá được tạo bằng cách lấy giá trị MD5 (độ dài 32 bytes) của tệp tin khoá do người dùng chọn và mật khẩu do người dùng nhập vào, sau đó tiến hành XOR hai đoạn mã MD5 này với nhau sẽ được một khoá cuối cùng có độ lớn là 32 bytes. Khoá này được sử dụng để mã hoá thông tin mật được thực hiện trong module nhúng thông tin mật. Thêm vào đó, không thực hiện nhúng các bít tin sau khi được mã hoá một cách lần lượt trong mảng dữ liệu mẫu mà sẽ giấu vào các vị trí khác nhau. Các vị trí này được xác định bằng cách chia lấy giá trị dư của các phần tử khoá cho 8 sau đó cộng thêm với 1 để loại bỏ trường hợp giá trị bằng 0, vì bít giấu tin kế tiếp sẽ có vị trí bằng vị trí hiện tại cộng với số dư này. Kết quả thu được bộ 32 giá trị nằm trong tập các giá trị {1, 2, 3, 4, 5, 6, 7, 8}, đây chính là các bước nhảy của vị trí mẫu. Tuỳ vào chế độ giấu mà thực hiện duyệt tìm trên mảng dữ liệu mẫu của tệp WAVE chứa để tìm ra các vị trí mẫu dùng để giấu tin phù hợp với các bước nhảy được quy định bởi khoá. Nếu chế độ giấu là 6 thì tiến hành loại bỏ các vị trí mẫu có giá trị <128 hoặc >= -128, với các chế độ thấp hơn thì giá trị loại bỏ là <64 hoặc >= -64. Các giá trị thoả mãn tạo thành mảng các vị trí mẫu dùng để giấu tin.

Như vậy sau khi kết thúc quá trình tạo khoá, kết quả thu được gồm một mảng khoá số nguyên bao gồm 32 phần tử và một mảng các vị trí các mẫu phục vụ cho giấu thông tin mật. Kích thước tối đa của thông tin mật là bằng độ dài của mảng này chia 8 (với ký tự 1 byte) hoặc 16 (với ký tự 2 bytes unicode).

b. Module nhúng thông tin mật

Sơ đồ giải thuật:

Đầu vào: thông tin tệp WAVE gốc, thông tin mật, khoá bí mật, mảng các vị trí giấu tin, chế độ giấu.

Đầu ra: tệp tin WAVE chứa thông tin mật. Diễn giải:

Thông tin mật được nhập từ tệp hoặc từ bàn phím hiển thị ở dạng chuỗi văn bản được đọc theo kiểu byte nhị phân. Mảng các bytes thông tin mật này được mã hoá bởi khoá bí mật bằng cách XOR lần lượt từng byte thông tin mật với từng phần tử trong khoá bí mật, được lặp lại cho đến khi hết các byte thông tin mật. Thông tin sau khi được mã hoá sẽ được nhúng lần lượt từng bít một vào trong mảng dữ liệu mẫu tệp WAVE chứa, vị trí của mẫu nhúng được quy định bởi các giá trị trong mảng các vị trí mẫu phục vụ giấu tin có được từ quá trình tạo khoá. Vị trí của mẫu giấu bít tin này bằng vị trí của mẫu giấu bít tin trước cộng với giá của bước nhảy lấy lần lượt trong mảng bước nhảy được tính trong quá trình lấy khoá.

Do tệp WAVE ở dạng có độ lớn mỗi mẫu là 16 bít, các bước nhảy thuộc trong tập hợp {1, 2, 3, 4, 5, 6, 7, 8} nên trường hợp nhảy mẫu với các bước nhảy lẻ thì vị trí giấu tin rơi vào byte cao của mẫu. Nên trong trường hợp vị trí giấu là lẻ thì thực hiện cộng thêm 1 vào giá trị đó để có được vị trí của byte thấp của mẫu đó. Vì dữ liệu được lưu trữ trong hệ thống Intel thuộc kiểu LE nên nếu thực hiện giấu vào vị trí lẻ nghĩa là giấu vào byte cao của mẫu, giá trị tác động lúc đó (với trọng số là 6) sẽ là ±16384 đơn vị, dẫn tới giá trị của mẫu tăng lên hay giảm đi một giá trị rất lớn hoặc có thể bị phá huỷ hoàn toàn.

Tuỳ vào chế độ giấu mà thực hiện phương pháp giấu tin phù hợp, nhìn chung là tương đối giống nhau về cơ chế giữa các chế độ giấu. Ví dụ việc thực hiện nhúng thông tin mật vào bít có trọng số là 6 sử dụng phương pháp điều chỉnh bít được thực hiện như sau:

- Nếu giá trị bít giấu tin bằng 1 thì chuyển về 0, đệm thêm một bít có giá trị bằng 0 ngay sau bít giấu tin, các bít còn lại thay đổi hết về giá trị 1. Ví dụ: byte chứa có dạng x1xx xxxx với x là 1 hoặc 0 thì ta có x1xx xxxx => x001 1111

- Nếu giá trị bít giấu tin bằng 0 thì chuyển về 1, đệm thêm một bít có giá trị bằng 1 ngay sau bít giấu tin, các bít còn lại thay đổi hết về giá trị 0. Ví dụ: byte chứa có dạng x0xx xxxx với x là 1 hoặc 0 thì ta có x0xx xxxx => x110 0000

Nếu giá trị bít giấu tin giống giá trị của bít thông tin mật thì giá trị này giữ nguyên, các bít sau thay đổi giống với trường hợp trên. Ví dụ:

- Byte chứa có dạng x1xx xxxx => x110 0000 - Byte chứa có dạng x0xx xxxx => x001 1111

Với phương pháp không điều chỉnh thì chỉ thực hiện thay đổi giá trị tại bít giấu nếu giá trị đó khác với giá trị của bít tin mật, còn với trường hợp giống thì không thực hiện thay đổi, coi như đã thực hiện giấu bít tin vào đó và thực hiện giấu bít tin tiếp theo ở vị trí mẫu tiếp theo.

Quá trình nhúng thông tin hoàn tất, thực hiện ghi tệp WAVE mới có chứa thông tin mật, có kích thước giống hệt với tệp WAVE gốc. Chất lượng giảm so với tệp WAVE gốc tuỳ vào vị trí giấu, vị trí giấu bít có trọng số càng cao thì chất lượng càng giảm.

Tuy nhiên, nếu xét ở cả 2 phương pháp giấu có điều chỉnh và không có điều chỉnh thì có nhưng vấn đề sau cần giải quyết là khả năng trong suốt và khả năng chống lại tác động bên ngoài.

Về khả năng trong suốt:

Với phương pháp giấu tin không điều chỉnh thì việc thay đổi giá trị một bít trong byte sẽ không làm ảnh hưởng gì đến cảm quan bên ngoài về byte đó.

Với phương pháp điều chỉnh mọi byte mẫu có chứa thông tin mật đều có dạng x001 1111 hoặc x110 0000 với x là giá trị bất kì 0 hoặc 1. Điều này là

không thực sự trong suốt với những người cố tình đọc thông tin từng byte và diễn giải ra dạng nhị phân. Lúc này người đó sẽ tìm cách trích xuất thông tin lấy thông tin mật, có khả năng có những bít không giấu tin mật cũng có dạng tương tự như vậy. Tuy nhiên, đây là một khả năng chịu may rủi cao nên vấn đề đặt ra là phải tạo các byte giả thông tin. Nghĩa là tạo các byte bên cạnh byte chứa thông tin mật với dạng tương tự như byte giấu tin, mặt trái của vấn đề này là sẽ làm ảnh hưởng đến chất lượng tín hiệu khá nhiều cũng như mất thông tin nếu như không có phương pháp hợp lý. Có một hướng giải pháp là với những bước nhảy lớn hơn 4 (như là 5, 6, 7 và 8) thì thực hiện tạo byte “mặt nạ” trên mẫu ngay sau mẫu đó. Và phải hạn chế tối đa mức độ ảnh hưởng lên tín hiệu gốc bằng cách coi như giá trị bít thông tin giấu giống với giá trị bít giấu tin, lúc này mức độ thay đổi cao nhất cũng chỉ là ±32. Có thể hiểu như sau:

- Byte chứa có dạng x1xx xxxx => x110 0000 - Byte chứa có dạng x0xx xxxx => x001 1111 (adsbygoogle = window.adsbygoogle || []).push({});

Về khả năng chống lại tác động bên ngoài:

Với phương pháp giấu tin không điều chỉnh thì sẽ không thể kiểm soát được được giá trị của các bít phía sau bít giấu tin và khi đó khả năng chịu tác động từ bên ngoài phụ thuộc vào may rủi. Ví dụ:

Byte có dạng 1100 0000 khi trừ 1 thì sẽ được 1011 1111. Byte có dạng 1011 1111 khi cộng 1 thì sẽ được 1100 0000.

Nghĩa là giá trị bít tin mật bị mất mặc dù mức độ tác động là cực kì nhỏ, dẫn tới sự mất thông tin mà ta không thể quản lý. Việc sai lệch thông tin một bít sẽ dẫn tới sai lệch của một byte hay nhiều bytes (ký tự unicode).

Với phương pháp giấu tin có điều chỉnh thì byte chứa thông tin có dạng x001 1111 hoặc x110 0000, việc ta tạo bít đệm là để chống lại tác động từ bên ngoài vào ở một mức độ nào đó. Ở đây giá trị tối đa mà bít đệm có thể chịu được là + 31 và -32 với trường hợp giấu tin vào bít có trọng số là 6.

Cách thức hoạt động cụ thể của module nhúng thông tin mật trong trường hợp trọng số của bít giấu tin là 6 với phương pháp giấu tin có điều chỉnh:

Thực hiện vòng lặp duyệt từ byte đầu tới byte cuối của thông tin mật, tại mỗi byte thông tin mật thực hiện một vòng lặp 8 lần để lấy ra từng bít của byte thông tin mật đó.

Để làm được điều này sử dụng phép dịch trái bít “>>” các giá trị bít này sẽ lần lượt được so sánh với giá trị của bít có trọng số là 6 trong byte thuộc mảng dữ liệu mẫu dùng để giấu tin. Để lấy được giá trị bít này thực hiện phép AND “&” với byte có giá trị là 64 (thập phân) hay 0x40 (hexa).

Nếu giá trị của bít tin mật khác với giá trị của bít vị trí giấu tin mật thì thì thực hiện đổi giá trị của bít vị trí giấu tin mật bằng với giá trị của bít tin mật, thiết lập bít đệm có giá trị bằng bít tin mật và điều chỉnh các bít sau đó phù hợp với thuật toán. Thực hiện như sau, lưu ý sử dụng phép XOR “^” và OR “|” với byte dạng thích hợp để giải quyết yêu cầu:

x1xx xxxx ^ 0x40 => x0xx xxxx | 0x3f => x011 1111 ^ 0x20 => x001 1111 x0xx xxxx | 0x7f => x111 1111 ^ 0x3f => x100 0000 ^ 0x20 => x110 0000

Nếu giá trị của bít tin mật giống với giá trị của bít vị trí giấu tin mật thì thiết lập bít đệm có giá trị bằng bít tin mật và thực hiện đổi các giá trị các bít sau đó cho phù hợp với thuật toán. Thực hiện như sau, lưu ý sử dụng phép XOR “^” và OR “|” với byte dạng thích hợp để giải quyết yêu cầu:

x1xx xxxx | 0x3f => x111 1111 ^ 0x1f => x110 0000 x0xx xxxx | 0x3f => x011 1111 ^ 0x20 => x001 1111

c. Module trích xuất thông tin mật

Sơ đồ giải thuật:

Đầu vào: tệp WAVE gốc, tệp WAVE chứa thông tin mật, khoá bí mật, chế độ giấu.

Đầu ra: nội dung thông tin mật. Diễn giải:

Tệp WAVE chứa thông tin mật được truyền tải qua các phương tiện truyền

Một phần của tài liệu ẨN GIẤU THÔNG TIN BẰNG PHƯƠNG PHÁP LSB (LEAST SIGNIFICANT BIT) CẢI TIẾN (Trang 54)