Tải bản đầy đủ (.pdf) (50 trang)

Nghiên cứu thuật toán giấu tin vào ảnh số và hiện thực

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.48 MB, 50 trang )

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA
---------------------------------------

DƯƠNG TẤN THÀNH

NGHIÊN CỨU THUẬT TOÁN GIẤU TIN VÀO
ẢNH SỐ VÀ HIỆN THỰC
RESEARCH ALGORITHMS HIDING
MESSAGES INTO DIGITAL IMAGES AND
IMPLEMENTATION
Ngành: Khoa học máy tính
Mã số: 60.48.01.01

LUẬN VĂN THẠC SĨ

TP. HỒ CHÍ MINH, tháng 7 năm 2018


CƠNG TRÌNH ĐƯỢC HỒN THÀNH TẠI
TRƯỜNG ĐẠI HỌC BÁCH KHOA –ĐHQG -HCM
Cán bộ hướng dẫn khoa học : ..................................................................
(Ghi rõ họ, tên, học hàm, học vị và chữ ký)
Cán bộ chấm nhận xét 1 : ........................................................................
(Ghi rõ họ, tên, học hàm, học vị và chữ ký)
Cán bộ chấm nhận xét 2 : ........................................................................
(Ghi rõ họ, tên, học hàm, học vị và chữ ký)
Luận văn thạc sĩ được bảo vệ tại Trường Đại học Bách Khoa, ĐHQG Tp.
HCM ngày . . . . . tháng . . . . năm 2018
Thành phần Hội đồng đánh giá luận văn thạc sĩ gồm:


(Ghi rõ họ, tên, học hàm, học vị của Hội đồng chấm bảo vệ luận văn thạc sĩ)
1. ............................................................
2. ............................................................
3. ............................................................
4. ............................................................
5. ............................................................
Xác nhận của Chủ tịch Hội đồng đánh giá LV và Trưởng Khoa quản lý
chuyên ngành sau khi luận văn đã được sửa chữa (nếu có).
CHỦ TỊCH HỘI ĐỒNG

TRƯỞNG KHOA KH&KTMT

i


ĐẠI HỌC QUỐC GIA TP.HCM
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
TRƯỜNG ĐẠI HỌC BÁCH KHOA
Độc lập - Tự do - Hạnh phúc

NHIỆM VỤ LUẬN VĂN THẠC SĨ
Họ tên học viên: Dương Tấn Thành......................................... MSHV: 7140836 ......
Ngày, tháng, năm sinh: 20/12/1990 ......................................... Nơi sinh: Bến Tre .....
Ngành: Khoa học máy tính ...................................................... Mã số : 60.48.01.01

I.

TÊN ĐỀ TÀI: Nghiên cứu thuật toán giấu tin vào ảnh số và hiện thực................

..................................................................................................................................

II.

NHIỆM VỤ VÀ NỘI DUNG: Dựa trên cơ sở của mục đích và các yêu cầu của

việc giấu tin, cũng như phân tích các ưu khuyết điểm của các phương pháp giấu tin
vào ảnh số, từ đó đề xuất thuật tốn giấu tin hiệu quả và hiện thực thuật toán bằng
phần mềm ....................................................................................................................
III. NGÀY GIAO NHIỆM VỤ: 04/01/2018 ............................................................
IV. NGÀY HOÀN THÀNH NHIỆM VỤ: 18/06/2018 ............................................
V. CÁN BỘ HƯỚNG DẪN: Tiến sĩ Nguyễn Đức Thái ...........................................
..................................................................................................................................

Tp. HCM, ngày . . . . tháng .. . . năm 2018
CÁN BỘ HƯỚNG DẪN
(Họ tên và chữ ký)

TRƯỞNG KHOA KH & KTMT
(Họ tên và chữ ký)

ii


LỜI CẢM ƠN
Trân trọng cảm ơn thầy TS. Nguyễn Đức Thái đã tận tình hướng dẫn, cảm ơn
các thầy cơ trong khoa KH & KTMT trường đại học Bách Khoa TP HCM,
các anh chị và các bạn cùng khóa đã nhiệt tình giải đáp các thắc mắc để tạo
điều kiện tốt nhất cho tôi, cũng như đã động viên tôi trong suốt thời gian qua.
Cảm ơn các anh chị tác giả của các cơng trình nghiên cứu trước đã nhiệt tình
giải đáp thắc mắc cho tơi qua email, cũng như định hướng giúp tơi để tơi có
điều kiện tốt nhất thực hiện luận văn này.

Học viên

Dương Tấn Thành

iii


Tóm tắt: Giấu tin là một nhu cầu cấp thiết đã có từ xa xưa. Căn cứ vào mục
đích giấu tin trên ảnh số, có thể chia thành hai lĩnh vực như sau: giấu thơng
tin bí mật và thủy vân số. Giấu thơng tin bí mật với mong muốn truyền tải
thông điệp qua internet mà không bị phát hiện, lĩnh vực giấu thơng tin bí mật
địi hỏi lượng thơng tin có thể giấu phải lớn và phải được bảo mật trong
trường hợp có bị phát hiện cũng khơng thể giải mã được. Thủy vân số với
mục đích là bảo vệ bản quyền, do đó lượng thơng tin cần giấu vào bức ảnh
thường thấp, thường là một ảnh logo với kích thước nhỏ, tuy nhiên lĩnh vực
thủy vân số yêu cầu độ bền thơng tin phải cao để có thể tránh được các tấn
công phá vỡ bản quyền.
Giấu tin trên ảnh số có thể được thực hiện trên miền khơng gian hoặc trên
miền tần số của ảnh, luận văn sẽ nghiên cứu và thực nghiệm hai phương pháp
giấu tin này trên ảnh bitmap, cũng như đánh giá ưu điểm khuyết điểm của
từng phương pháp, từ đó đưa đến kết luận trong trường hợp nào nên hay
không nên dùng phương pháp giấu tin nào.
Abstract: Data hiding is an urgent need that has existed in the past. Based on
the purpose of data hiding on digital images, it can be divided into two areas:
steganography and watermarking. Steganography is the hiding the
confidential information into digital images with the desire to transmit
messages over the internet without being detected, steganography requires
large amounts of information to be kept hidden and kept confidential in the
event of detection. Watermarking is for the protection of copyright, so the
amount of information to hide in the image is usually small, it is usually a

small logo image, but watermarking requires high durability, to avoid
breaking the copyright.
Data hiding can be done on the spatial domain or on the frequency domain of
the digital image. In this, i will study and experiment with these two methods
of data hiding in bitmap images, as well as assess the strengths and
weaknesses of each method, thus leading to a conclusion on whether or not to
use the hidden method.

iv


LỜI CAM ĐOAN
Tơi xin cam đoan luận văn này hồn tồn do tơi thực hiện dưới sự hướng dẫn
của thầy TS. Nguyễn Đức Thái. Các giải thuật, mã nguồn tham khảo trong
luận án có nguồn gốc rõ ràng, và có độ chính xác cao nhất trong phạm vi hiểu
biết của tôi. Các kết quả nghiên cứu trong luận án do tơi tự tìm hiểu. Nếu
khơng đúng như trên, tơi xin hồn tồn chịu trách nhiệm về đề tài của mình.
Học viên

Dương Tấn Thành

v


MỤC LỤC
MỞ ĐẦU ....................................................................................................... 1
CHƯƠNG 1. GIỚI THIỆU ĐỀ TÀI ........................................................... 2
1.1. Tính cấp thiết của đề tài ..................................................................... 2
1.2. Mục tiêu của đề tài ............................................................................. 3
1.3. Phương pháp thực hiện đề tài ............................................................. 4

1.4. Bố cục báo cáo luận văn..................................................................... 7
CHƯƠNG 2. NHỮNG CƠNG TRÌNH LIÊN QUAN ................................ 8
CHƯƠNG 3. CƠ SỞ LÝ THUYẾT............................................................. 9
3.1. Giới thiệu ảnh bitmap (BMP) ............................................................. 9
3.2. Làm việc với ảnh bitmap bằng NNLT C# ........................................ 10
3.3. Phép biến đổi DCT........................................................................... 11
3.4. Giải thuật mã hóa Triple DES .......................................................... 12
3.5. Giải thuật mã hóa RSA .................................................................... 14
CHƯƠNG 4. KỸ THUẬT GIẤU TIN TRÊN ẢNH BITMAP ................. 19
4.1. Giấu tin trên miền không gian .......................................................... 19
4.2. Giấu tin trên miền tần số .................................................................. 20
4.3. So sánh và ứng dụng ........................................................................ 22
4.4. Cải tiến giải thuật giấu tin ................................................................ 22
CHƯƠNG 5. CÀI ĐẶT VÀ THỬ NGHIỆM ............................................ 28
5.1. Giao diện tổng quan ......................................................................... 28
5.2. Giấu thông tin bí mật ....................................................................... 28
5.3. Thủy vân số ..................................................................................... 32
5.4. Chương trình sinh khóa RSA ........................................................... 36
CHƯƠNG 6. ĐÁNH GIÁ GIẢI THUẬT .................................................. 38
KẾT LUẬN ................................................................................................. 40
TÀI LIỆU THAM KHẢO.......................................................................... 41

vi


MỞ ĐẦU
Giấu tin (data hiding) là thuật ngữ chỉ các kỹ thuật giấu thơng tin nói chung
bao gồm cả giấu thông tin mật (steganography) và thuỷ vân số (watermarking).
Giấu tin là kỹ thuật giấu (nhúng) một lượng thông tin nào đó vào trong một đối
tượng dữ liệu số khác (ví dụ như file âm thanh, file ảnh, file text,...) nhằm giữ

bí mật và xác thực thơng tin.
Với hai mục đích là bảo mật cho những dữ liệu được giấu trong đối tượng
mạng và bảo đảm an tồn cho chính các đối tượng chứa dữ liệu giấu trong đó
(bảo vệ bản quyền) nên kỹ thuật giấu thông tin được phát triển thành hai lĩnh
vực với những yêu cầu và tính chất khác nhau đó là giấu thơng tin bí mật và
thủy vân số [11].
Giấu thơng tin bí mật là một nhu cầu đã có từ rất lâu, từ thời xa xưa người
ta tìm cách giấu thơng tin trên các thiết bị, dụng cụ ngồi đời thực (bì thư, bài
báo, giấu trong giày dép, hoặc dùng mực vơ hình, …). Hiện nay, với khoa học
kỹ thuật phát triển, cùng với sự phát triển của máy tính và internet thì bài tốn
giấu tin cũng địi hỏi phải có những giải pháp đối với các tài liệu điện tử, để có
thể truyền tải một bức thư thông qua internet mà không bị phát hiện. Đây là
một đề tài vô cùng cấp thiết đối với lĩnh vực An ninh – Quốc phịng, khơng chỉ
để áp dụng nó mà cịn để cảnh giác và phát hiện nó.
Khác với giấu thơng tin mật, kỹ thuật thủy vân xuất hiện muộn hơn (vào
cuối thế kỷ 13 tại Ý) với mục đích bảo vệ bản quyền. Thủy vân có 2 loại: thủy
vân có thể phát hiện được bằng mắt và thủy vân không thể phát hiện được bằng
mắt thường.
Luận văn này sẽ quan tâm đến hai vấn đề là giấu thông tin mật và thủy
vân không thể phát hiện được bằng mắt thường. Việc giấu tin sẽ được thực hiện
trên ảnh bitmap trong miền không gian và miền tần số, cũng như so sánh đánh
giá ưu điểm khuyết điểm của việc giấu tin trên hai miền này. Từ đó đưa ra kết
luận về phạm vi áp dụng của từng lĩnh vực.

1


CHƯƠNG 1. GIỚI THIỆU ĐỀ TÀI
Giấu thơng tin bí mật là một nghệ thuật khoa học về việc viết và chuyển
tải các thơng điệp một cách bí mật, sao cho ngoại trừ người gửi và người nhận,

không ai biết đến sự tồn tại của thông tin, là một dạng của bảo mật bằng cách
che giấu. Từ steganography có gốc Hy lạp có nghĩa là "giấu thư" kết hợp từ hai
từ steganos (στεγανός) nghĩa là "ẩn nấp để bảo vệ" và graphein (γράφειν) nghĩa
là "viết" [7].
Thuật ngữ steganography được Johannes Trithemius sử dụng lần đầu năm
1499 trong cuốn sách Steganographia, một luận văn về mật mã và kỹ thuật giấu
thư được ngụy trang dưới dạng một cuốn sách ma thuật. Trong kỹ thuật giấu
thư, thông thường thông điệp xuất hiện dưới một dạng khác trong quá trình
truyền tải: hình ảnh, bài báo, danh sách mua hàng, bì thư, hoặc thơng điệp ẩn
có thể được viết bằng mực vơ hình giữa các khoảng trống trong một lá thư bình
thường [7].
Đề tài này sẽ tập trung nghiên cứu giấu tin vào ảnh bitmap, tìm hiểu cách
biểu diễn ảnh bitmap trên máy tính, cách thể hiện ảnh trên miền không gian và
miền tần số, tìm hiểu những ứng dụng thực tiễn cũng như các yêu cầu của việc
giấu tin trong ảnh số, phân tích và đánh giá các kỹ thuật giấu tin, từ đó lựa chọn
giải pháp thích hợp với từng mục đích nhất định, cải tiến và đề xuất hướng phát
triển thuật tốn.
1.1.

Tính cấp thiết của đề tài

Giấu thơng tin bí mật là một lĩnh vực vô cùng cấp thiết trong An ninh –
Quốc phịng, khơng chỉ để sử dụng nó mà cịn để cảnh giác và phát hiện ra nó.
Trong lĩnh vực này địi hỏi ta phải làm chủ cơng nghệ và đơi khi cần phải giữ
bí mật cả với giải thuật, vì thế khơng nên sử dụng lại các ứng dụng, giải thuật
của một tổ chức hay cá nhân nào khác. Thay vào đó việc cần phải nghiên cứu
và xây dựng phương pháp mới, thuật toán mới cá biệt cho riêng mình là vơ
cùng cấp thiết.
Song song đó, thủy vân số được sử dụng trong phổ biến trong lĩnh vực in
ấn xuất bản, với mục đích là bảo vệ bản quyền ảnh số. Một thông điệp là logo

hoặc thông tin bản quyền sẽ được chèn vào bên trong ảnh gốc (ảnh cần bảo vệ
2


bản quyền) mà khơng ai có thể phát hiện được bằng mắt thường, từ đó làm cơ
sở cho việc minh chứng bản quyền bức ảnh.
1.2.

Mục tiêu của đề tài

Giấu thông tin bí mật yêu cầu tính bí mật là trên hết. Tính bí mật ở đây
được hiểu theo hai nghĩa:
- Tính bí mật của nội dung thơng điệp: nội dung thơng điệp bên trong bức
ảnh là tuyệt mật, vì thế trong trường hợp xấu nhất nếu có kẻ thứ ba phát
hiện thì cũng khơng thể nào đọc được nội dung này.
- Tính bí mật của việc giấu tin: tức là đặc tính ẩn của thơng điệp, hay nói
cách khác là không thể phát hiện sự tồn tại của thông điệp bên trong bức
ảnh.
Bên cạnh đó, lĩnh vực này cịn u cầu tính tồn vẹn, tính xác thực và
lượng nội dung thơng tin được giấu bên trong ảnh:
- Tính tồn vẹn: nội dung thơng tin phải chính xác tuyệt đối, khơng được
thừa hoặc thiếu nội dung. Trong trường hợp xấu nhất, nội dung có thể bị
phá vỡ khơng phục hồi được, nhưng phải đảm bảo khơng ai có thể làm
thay đổi nội dung.
- Tính xác thực: trong trường hợp cần thiết phải có thể xác thực được danh
tính người gửi, tránh mạo danh hoặc tráo đổi thông điệp.
- Lượng thông tin cần giấu: thông tin cần giấu thường là các đoạn văn bản,
các thơng điệp có thể ngắn hoặc dài, vì vậy lựa chọn giải thuật có thể giấu
được nhiều thơng tin cũng là một yêu cầu không kém phần quan trọng.
Khác với giấu thơng tin bí mật, thủy vân số yêu cầu tính bền vững là trên

hết. Tính bền vững ở đây có nghĩa là thơng tin được giấu sẽ không bị mất đi
khi truyền tải hoặc phát tán ảnh trên internet, thay đổi định dạng ảnh hoặc ảnh
bị tác động qua các phép biến đổi hình học,…

3


Mục tiêu
Thực hiện

Yêu cầu

Giấu thông tin mật
(Steganography)

Thủy vân số
(Watermaking)

+ Tàng hình các phiên liên
lạc để bảo mật thơng tin
+ Dùng trong các liên lạc
xác định
Không làm thay đổi phương
tiện chứa thông tin
+ Giấu được nhiều thông tin
nhất
+ Không cần quan tâm tới
độ bền của phương tiện
chứa
+ Không thể phát hiện được

việc giấu thơng tin
+ Khơng kiểm tra được nếu
khơng có khóa thích hợp

+ Chủ yếu phục vụ cho mục
đích bảo vệ bản quyền
+ Chủ yếu dùng trong các
hoạt động xuất bản
Có thể tác động nhỏ về cảm
nhận tới phương tiện chứa
+ Chỉ cần nhúng ít dữ liệu
+ Dữ liệu nhúng cần phải bền
vững
+ Đảm bảo trước các phương
pháp nén dữ liệu
+ Dữ liệu nhúng có thể nhận
thấy hay khơng nhận thấy
+ Có thể khơng u cầu khóa
khi kiểm tra

Bảng 1: So sánh giấu thông tin mật và giấu thông tin thủy vân

Mục tiêu của đề tài này là nghiên cứu và đề xuất giải pháp giấu thông tin
trên ảnh bitmap sao cho đáp ứng tốt được các yêu cầu nêu trên, xây dựng ứng
dụng demo, đánh giá giải thuật, từ đó đề xuất hướng phát triển cho giải thuật
và ứng dụng.
1.3.

Phương pháp thực hiện đề tài


Căn cứ vào phạm vi giấu tin trên ảnh số, các kỹ thuật giấu tin được chia
làm hai loại chính: giấu tin trên miền khơng gian và giấu tin trên miền tần số.
- Giấu tin trên miền không gian: trên miền không gian, ảnh số được biểu
diễn là một ma trận các điểm ảnh (pixel), trong đó mỗi điểm ảnh sẽ mang
một giá trị màu sắc nhất định. Dựa vào giá trị màu sắc này, ta có thể giấu
một lượng thơng tin nhất định của thông điệp vào ảnh số.
- Giấu tin trên miền tần số: các phép biến đổi ảnh từ miền không gian sang
miền tần số chẳng hạn như: biến đổi Cosine rời rạc (DCT), biến đổi
Fourier rời rạc (DFT), biến đổi wavelet (DWT),… cho ta một cách biểu
diễn khác của ảnh. Từ đó, thay vì thơng tin được giấu vào các giá trị màu
sắc của điểm ảnh, thì trên miền tần số thông tin sẽ được giấu vào các hệ
số của phép biến đổi này.
4


Để thực hiện đề tài này, cần nghiên cứu cấu trúc ảnh bitmap, nghiên cứu
cách biểu diễn ảnh trên miền không gian, cách truy xuất và thay đổi các giá trị
màu sắc của điểm ảnh, cũng như các phép biến đổi ảnh trên miền tần số để truy
xuất và thay đổi các hệ số của phép biến đổi tương ứng.
Để đáp ứng các yêu cầu khắc khe của lĩnh vực giấu thơng tin bí mật, cần
nghiên cứu và áp dụng các giải thuật mã hóa để mã hóa thơng tin trước khi đem
giấu chúng. Các giải thuật mã hóa chẳng hạn như Triple DES, RSA,… người
nhận phải yêu cầu có đúng khóa thì mới có thể giải mã được thơng tin.
Các giải thuật mã hóa đồng thời có thể giải quyết được các u cầu về tồn
vẹn nội dung thơng tin và xác thực danh tính người gửi. Dựa trên hai mục đích
khác nhau của việc giấu thơng tin bí mật và thủy vân số, hai yêu cầu đưa ra của
hai việc giấu tin này cũng khác nhau. Nghiên cứu và căn cứ vào các đặc tính
của việc giấu tin trên miền không gian và giấu tin trên miền tần số để có thể lựa
chọn phương pháp thích hợp cho từng mục đích nhất định.
Xây dựng ứng dụng thực nghiệp bằng ngơn ngữ lập trình C#, với trình

soạn thảo Visual Studio. Một ứng dụng giấu tin gồm tối thiểu hai thành phần
chính:
- Nhúng thơng tin
- Trích xuất thơng tin

5


Hình 1. Lược đồ thể hiện quá trình giấu tin [10]

Hình 2. Lược đồ thể hiện q trình trích xuất thông tin [10]

6


1.4.

Bố cục báo cáo luận văn

Bố cục báo cáo luận văn bao gồm các nội dung chính như sau:
Chương 2: Nêu các cơng trình nghiên cứu liên quan đến lĩnh vực giấu tin,
cũng như các nghiên cứu phát hiện giấu tin trên ảnh.
Chương 3: Trình bày cơ sở lý thuyết của việc giấu tin trên ảnh, cấu trúc
của một file ảnh bitmap, cách biểu diễn ảnh trên miền không gian và miền tần
số. Bên cạnh đó trình bày các giải thuật giấu tin, các giải thuật mã hóa giải mã
sẽ được sử dụng trong quá trình giấu tin.
Chương 4: Trình bày các kỹ thuật giấu tin, so sánh đánh giá các kỹ thuật,
từ đó xác định phạm vi ứng dụng của từng kỹ thuật cụ thể, cải tiến các kỹ thuật
giấu tin để đáp ứng yêu cầu của bài toán một cách tốt hơn.
Chương 5: Trình bày các kết quả đạt được khi thử nghiệm giải thuật bằng

cách xây dựng ứng dụng cụ thể.
Chương 6: Đánh giá các giải thuật, phân tích độ khó trong việc phát hiện
giấu tin hoặc phá mã thông tin.
Kết luận và hướng phát triển đề tài.

7


CHƯƠNG 2. NHỮNG CƠNG TRÌNH LIÊN QUAN
Giấu tin nói chung hay giấu thơng tin bí mật nói riêng là một lĩnh vực khá
phổ biến và xuất hiện từ lâu, đã có nhiều cơng trình nghiên cứu, xây dựng và
cải tiến các thuật toán, các phương pháp giấu tin nhằm nâng cao hiệu quả giấu
tin.
Chẳng hạn như:
- Giấu tin vào LSB (least significant bit) của các hệ số biến đổi DCT, với
thơng tin được mã hóa bằng thuật tốn Blowfish trước khi giấu, trong bài
báo: “Image Steganography Using Discrete Cosine Transform (DCT) and
Blowfish Algorithm” [3].
- Nhúng thủy vân bằng cách điều chỉnh các hệ số trong băng tần giữa của
phép biến đổi DCT, trong bài báo: “Steganographic approach for hiding
image in DCT domain” [1] của các tác giả Blossom Kaur, Amandeep
Kaur, Jasdeep Singh
- Một số kỹ thuật phát hiện mù cho ảnh có giấu tin trên LSB: “độ lệch
chuẩn”, “12”, “tỉ lệ xám”, và phát hiện bằng phương pháp ước lượng thông
tin giấu trong sử dụng lý thuyết “trùng khớp”, trong luận án tiến sỹ
“Nghiên cứu một số kỹ thuật phát hiện ảnh giấu tin” [4].
Và cịn nhiều cơng trình khác nữa…
Thành tựu đạt được của các nghiên cứu này là đã cho ra đời nhiều phương
pháp giấu tin hiệu quả cũng như các giải thuật nâng cấp, cải tiến chất lượng
giấu tin. Tuy nhiên, đặc thù của steganography là dùng trong các lĩnh vực đặc

biệt, chẳng hạn như An ninh – Quốc phịng, hoặc các mơi trường u cầu tính
bí mật cao. Chính vì thế việc xây dựng một giải thuật giấu tin mới phục vụ cho
riêng mình là một yêu cầu cần thiết.
Luận văn này sẽ tập trung vào phân tích các mục đích và yêu cầu của việc
giấu tin, phân tích các ưu khuyết điểm của các phương pháp giấu tin, đánh giá
phạm vi áp dụng của từng phương pháp cũng như thực hiện các cải tiến mới để
cá nhân hóa giải thuật đồng thời nâng cao hiệu quả giấu tin.

8


CHƯƠNG 3. CƠ SỞ LÝ THUYẾT
3.1.

Giới thiệu ảnh bitmap (BMP)

Trong đồ họa máy vi tính, BMP, cịn được biết đến với tên tiếng Anh khác
là Windows bitmap, là một định dạng tập tin hình ảnh khá phổ biến. Các tập tin
đồ họa lưu dưới dạng BMP thường có đi là .BMP hoặc .DIB (Device
Independent Bitmap) [12].
Các thuộc tính tiêu biểu của một tập tin ảnh BMP (cũng như của các file
ảnh nói chung) là:
- Số bit trên mỗi điểm ảnh (bit per pixel), thường được ký hiệu bởi n. Một
ảnh BMP n-bit có 2n màu. Giá trị n càng lớn thì ảnh càng có nhiều màu,
và càng rõ nét hơn. Giá trị tiêu biểu của n là 1 (ảnh đen trắng), 4 (ảnh 16
màu), 8 (ảnh 256 màu), 16 (ảnh 65536 màu) và 24 (ảnh 16 triệu màu). Ảnh
BMP 24-bit có chất lượng hình ảnh trung thực nhất.
- Chiều cao của ảnh (height), cho bởi điểm ảnh (pixel).
- Chiều rộng của ảnh (width), cho bởi điểm ảnh.
Cấu trúc tập tin ảnh BMP bao gồm 4 phần:

- Bitmap Header (14 bytes): giúp nhận dạng tập tin bitmap.
- Bitmap Information (40 bytes): lưu một số thông tin chi tiết giúp hiển thị
ảnh.
- Color Palette (4*x bytes), x là số màu của ảnh: định nghĩa các màu sẽ được
sử dụng trong ảnh.
- Bitmap Data: lưu dữ liệu ảnh.
Đặc điểm nổi bật nhất của định dạng BMP là tập tin hình ảnh thường
khơng được nén bằng bất kỳ thuật toán nào. Khi lưu ảnh, các điểm ảnh được
ghi trực tiếp vào tập tin - một điểm ảnh sẽ được mô tả bởi một hay nhiều byte
tùy thuộc vào giá trị n của ảnh. Do đó, một hình ảnh lưu dưới dạng BMP thường
có kích cỡ rất lớn, gấp nhiều lần so với các ảnh được nén (chẳng hạn GIF, JPEG
hay PNG).
9


Định dạng BMP được hỗ trợ bởi hầu hết các phần mềm đồ họa chạy trên
Windows, và cả một số ứng dụng chạy trên MS-DOS. Ngay từ Windows 3.1,
Microsoft đã cho ra đời phần mềm PaintBrush, một phần mềm hỗ trợ vẽ hình
ảnh đơn giản và lưu hình ảnh được vẽ dưới dạng BMP 16 hay 256 màu. Tuy
nhiên, do kích thước tập tin ảnh BMP quá lớn, định dạng BMP khơng phù hợp
để trao đổi hình ảnh qua mạng Internet (do hạn chế về tốc độ truyền dữ liệu).
Do đó, các trang web thường sử dụng ảnh dạng GIF, JPEG hay PNG. Các định
dạng này hỗ trợ các thuật tốn nén hình ảnh, vì vậy có thể giảm bớt kích cỡ của
ảnh.
3.2.

Làm việc với ảnh bitmap bằng NNLT C#
a.

Biểu diễn ảnh bitmap trong lập trình:


Là một ma trận hai chiều các pixel, mỗi pixel mang một giá trị màu, được
biểu diễn thông qua ba kênh màu (red, green, blue), mỗi kênh màu mang các
giá trị từ 0-255 (tức là 1 byte), ảnh thông thường là ảnh 24 bits (hay 3 bytes
dùng cho 3 kênh màu). Chúng ta tưởng tượng như sau: pixel đầu tiên của ảnh
chiếm 3 bytes đầu (0, 1, 2); pixel thứ hai chiếm 3 bytes kế tiếp (3, 4, 5); cứ như
thế…
Đối với ảnh 8 bits, tức là mỗi pixel chỉ chiếm 8 bits (1 byte), thì 3 kênh
màu red, green, blue mang cùng một giá trị như nhau, khi đó ảnh là ảnh mức
xám (grayscale)
b.

Các hàm thao tác với ảnh bằng ngôn ngữ C#:

C# cung cấp Bitmap Class chứa đầy đủ các hàm thao tác với một file ảnh,
mỗi pixel trên file ảnh được đọc/ghi với một giá trị màu biểu diễn bằng đối
tượng của Color Class. Cụ thể như sau:
- Khởi tạo đối tượng Bitmap từ đường dẫn file:
Bitmap b = new Bitmap(@"C:\sample.bmp");

- Đọc thông tin màu của một pixel (x, y)
Color c = b.GetPixel(x, y);

10


- Ghi một giá trị màu c vào pixel (x, y)
b.SetPixel(x, y, c);

- Lưu file ảnh bitmap

b.Save(@"C:\sample.bmp");

3.3.

Phép biến đổi DCT

Biến đổi cosine rời rạc là một biến đổi toán học nhằm chuyển đổi miền
biểu diễn các tín hiệu từ miền không gian sang miền tần số và được ứng dụng
nhiều trong các phép xử lý tín hiệu như xử lý ảnh, xử lý video... Về bản chất,
biến đổi cosine rời rạc là phần thực của biến đổi Fourier rời rạc. Để hiểu rõ hơn
về biến đổi cosine rời rạc, trước tiên ta xem xét một vài điểm thiết yếu nhìn từ
góc độ ứng dụng của biến đổi Fourier [6].
Nếu một ảnh được coi như một hàm của biên độ (cường độ sáng) với
khoảng cách như là biến, thì theo lý thuyết Fourier hàm đó có thể được xây
dựng bởi một chuỗi các hàm sine và cosine tăng dần theo tần số. Khi hàm chỉ
gồm có các thành phần sine thì gọi là biến đổi sine, và nếu hàm chỉ gồm các
thành phần cosine thì nó được gọi là biến đổi cosine. Cả biến đổi Fourier, sine
và cosine đều có các ứng dụng riêng trong xử lý ảnh.
Lý do chọn phép biến đổi cosine rời rạc để biến đổi ảnh sang miền tần số
là vì biến đổi cosine rời rạc yêu cầu ít sự phức tạp tính tốn và tài ngun hơn.
Vì ảnh gốc có kích thước rất lớn cho nên trước khi đưa vào biến đổi DCT,
ảnh được phân chia thành các khối vng, mỗi khối này thường có kích thước
8x8 pixel và biểu diễn các mức xám của 64 điểm ảnh, các mức xám này là các
số nguyên dương có giá trị từ 0 đến 255. Việc phân khối này sẽ làm giảm được
một phần thời gian tính tốn các hệ số chung, mặt khác biến đổi cosin đối với
các khối nhỏ sẽ làm tăng độ chính xác khi tính tốn với dấu phẩy tĩnh, giảm
thiểu sai số do làm tròn sinh ra.
Mỗi khối 64 điểm ảnh sau biến đổi DCT thuận sẽ nhận được 64 hệ số thực
DCT. Mỗi hệ số này có chứa một trong 64 thành phần tần số không gian hai
chiều. Hệ số với tần số bằng không theo cả hai hướng được gọi là hệ số một

chiều DC, hệ số này chính là giá trị trung bình của 64 điểm ảnh trong khối. 63
11


hệ số còn lại gọi là các hệ số xoay chiều AC. Hệ số một chiều DC tập trung
phần lớn năng lượng của ảnh.
Hai hàm chính trong class hiện thực DCT được xây dựng như sau:
public void FastDCT()
{
double[,] temp = new double[Width, Height];
DCTCoefficients = new double[Width, Height];
DCTkernel = new double[Width, Height];
DCTkernel = GenerateDCTmatrix(Order);
temp = multiply(DCTkernel, Input);
DCTCoefficients = multiply(temp, Transpose(DCTkernel));
DCTPlotGenerate();
Quantization();
}
public void FastInverseDCT()
{
double[,] temp = new double[Width, Height];
IDTCoefficients = new double[Width, Height];
DCTkernel = new double[Width, Height];
DCTkernel = Transpose(GenerateDCTmatrix(Order));
temp = multiply(DCTkernel, DCTCoefficients);
IDTCoefficients = multiply(temp, Transpose(DCTkernel));
IDCTImage = Displayimage(IDTCoefficients);
return;
}


3.4.

Giải thuật mã hóa Triple DES

DES (viết tắt của Data Encryption Standard, hay Tiêu chuẩn Mã hóa Dữ
liệu) là một phương pháp mật mã hóa được FIPS (Tiêu chuẩn Xử lý Thông tin
Liên bang Hoa Kỳ) chọn làm chuẩn chính thức vào năm 1976. Sau đó chuẩn
này được sử dụng rộng rãi trên phạm vi thế giới. Ngay từ đầu, thuật tốn của
nó đã gây ra rất nhiều tranh cãi, do nó bao gồm các thành phần thiết kế mật, độ
dài khóa tương đối ngắn, và các nghi ngờ về cửa sau để Cơ quan An ninh quốc
gia Hoa Kỳ (NSA) có thể bẻ khóa. Do đó, DES đã được giới nghiên cứu xem
xét rất kỹ lưỡng, việc này đã thúc đẩy hiểu biết hiện đại về mật mã khối (block
cipher) và các phương pháp thám mã tương ứng [9].
Hiện nay DES được xem là không đủ an toàn cho nhiều ứng dụng. Nguyên
nhân chủ yếu là độ dài 56 bit của khóa là quá nhỏ. Khóa DES đã từng bị phá
trong vòng chưa đầy 24 giờ. Đã có rất nhiều kết quả phân tích cho thấy những
điểm yếu về mặt lý thuyết của mã hóa có thể dẫn đến phá khóa, tuy chúng
khơng khả thi trong thực tiễn. Thuật tốn được tin tưởng là an tồn trong thực
tiễn có dạng Triple DES (thực hiện DES ba lần), mặc dù trên lý thuyết phương
12


pháp này vẫn có thể bị phá. Gần đây DES đã được thay thế bằng AES
(Advanced Encryption Standard, hay Tiêu chuẩn Mã hóa Tiên tiến) [9].
Trong một số tài liệu, người ta phân biệt giữa DES (là một tiêu chuẩn) và
thuật toán DEA (Data Encryption Algorithm, hay Thuật toán Mã hóa Dữ liệu)
thuật tốn dùng trong chuẩn DES [9].
Trong ngơn ngữ lập trình C#, Microsoft đã cung cấp sẵn cho chúng ta class
TripleDESCryptoServiceProvider. Trong đó, Microsoft cung cấp đủ các hàm:
mã hóa, giải mã, cách thực hiện như sau:

- Code mã hóa
public override string Encrypt(string str, string key)
{
byte[] keyArray;
byte[] toEncryptArray = encoding.GetBytes(str);
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(encoding.GetBytes(key));
hashmd5.Clear();
}
else
{
keyArray = encoding.GetBytes(key);
}
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
toEncryptArray.Length);
tdes.Clear();
return ByteToBinaryString(resultArray);
}

13


- Code giải mã

public override string Descrypt(string str, string key)
{
byte[] keyArray;
byte[] toDecryptArray = BinaryToByteArray(str);
if (useHashing)
{
MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(encoding.GetBytes(key));
hashmd5.Clear();
}
else
{
keyArray = encoding.GetBytes(key);
}
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyArray;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.PKCS7;
try
{
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toDecryptArray, 0,
toDecryptArray.Length);
tdes.Clear();
return encoding.GetString(resultArray);
}
catch
{
return string.Empty;
}

}

3.5.

Giải thuật mã hóa RSA
a.

Lịch sử [8]:

Thuật tốn được Ron Rivest, Adi Shamir và Len Adleman mô tả lần đầu
tiên vào năm 1977 tại Học viện Công nghệ Massachusetts (MIT). Tên của thuật
toán lấy từ 3 chữ cái đầu của tên 3 tác giả.
Trước đó, vào năm 1973, Clifford Cocks, một nhà toán học người Anh
làm việc tại GCHQ, đã mơ tả một thuật tốn tương tự. Với khả năng tính tốn
tại thời điểm đó thì thuật tốn này không khả thi và chưa bao giờ được thực
nghiệm. Tuy nhiên, phát minh này chỉ được công bố vào năm 1997 vì được xếp
vào loại tuyệt mật.

14


Thuật toán RSA được MIT đăng ký bằng sáng chế tại Hoa Kỳ vào năm
1983 (Số đăng ký 4.405.829). Bằng sáng chế này hết hạn vào ngày 21 tháng 9
năm 2000. Tuy nhiên, do thuật tốn đã được cơng bố trước khi có đăng ký bảo
hộ nên sự bảo hộ hầu như khơng có giá trị bên ngồi Hoa Kỳ. Ngồi ra, nếu
như cơng trình của Clifford Cocks đã được cơng bố trước đó thì bằng sáng chế
RSA đã khơng thể được đăng ký.
b.

Mơ tả sơ lược [8]:


Thuật tốn RSA có hai khóa: khóa cơng khai (hay khóa cơng cộng) và
khóa bí mật (hay khóa cá nhân). Mỗi khóa là những số cố định sử dụng trong
q trình mã hóa và giải mã. Khóa cơng khai được cơng bố rộng rãi cho mọi
người và được dùng để mã hóa. Những thơng tin được mã hóa bằng khóa cơng
khai chỉ có thể được giải mã bằng khóa bí mật tương ứng. Nói cách khác, mọi
người đều có thể mã hóa nhưng chỉ có người biết khóa cá nhân (bí mật) mới có
thể giải mã được.
Ta có thể mơ phỏng trực quan một hệ mật mã khố cơng khai như sau:
Bình muốn gửi cho An một thơng tin mật mà Bình muốn duy nhất An có thể
đọc được. Để làm được điều này, An gửi cho Bình một chiếc hộp có khóa đã
mở sẵn và giữ lại chìa khóa. Bình nhận chiếc hộp, cho vào đó một tờ giấy viết
thư bình thường và khóa lại (như loại khố thơng thường chỉ cần sập chốt lại,
sau khi sập chốt khóa ngay cả Bình cũng không thể mở lại được-không đọc lại
hay sửa thông tin trong thư được nữa). Sau đó Bình gửi chiếc hộp lại cho An.
An mở hộp với chìa khóa của mình và đọc thơng tin trong thư. Trong ví dụ này,
chiếc hộp với khóa mở đóng vai trị khóa cơng khai, chiếc chìa khóa chính là
khóa bí mật.
c.

Tốc độ:

RSA có tốc độ thực hiện chậm hơn đáng kể so với DES và các thuật tốn
mã hóa đối xứng khác. Trên thực tế, Bình sử dụng một thuật tốn mã hóa đối
xứng nào đó để mã hóa văn bản cần gửi và chỉ sử dụng RSA để mã hóa khóa
để giải mã (thơng thường khóa ngắn hơn nhiều so với văn bản).

15



Phương thức này cũng tạo ra những vấn đề an ninh mới. Một ví dụ là cần
phải tạo ra khóa đối xứng thật sự ngẫu nhiên. Nếu không, kẻ tấn công (thường
ký hiệu là Hắc) sẽ bỏ qua RSA và tập trung vào việc đốn khóa đối xứng.
d.

Sử dụng RSA trong ngơn ngữ lập trình C#:

Trong ngơn ngữ lập trình C#, Microsoft đã cung cấp sẵn cho chúng ta class
RSACryptoServiceProvider. Trong đó, Microsoft cung cấp đủ các hàm: sinh
khóa, mã hóa, giải mã, cách thực hiện như sau:
- Code sinh khóa:
public static void GeneratePairKey(string path)
{
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
var privKey = RSA.ExportParameters(true);
var pubKey = RSA.ExportParameters(false);
string pubKeyString;
{
var sw = new StringWriter();
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
xs.Serialize(sw, pubKey);
pubKeyString = sw.ToString();
File.WriteAllText(path + "\\pub.txt", pubKeyString);
}

}

string privKeyString;
{

var sw = new StringWriter();
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
xs.Serialize(sw, privKey);
privKeyString = sw.ToString();
File.WriteAllText(path + "\\priv.txt", privKeyString);
}

}

16


- Code mã hóa
public override string Encrypt(string str, string publicKey)
{
var salt = StringExtension.RandomSpecialString(16);
byte[] saltToEncrypt = encoding.GetBytes(salt);
var sr = new StringReader(publicKey);
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
RSAParameters pubKey = (RSAParameters)xs.Deserialize(sr);
var encryptedData = RSAEncrypt(saltToEncrypt, pubKey, false);
var saltEcrypted = ByteToBinaryString(encryptedData);
string saltEcryptedLength =
ByteToBinaryString(BitConverter.GetBytes(saltEcrypted.Length));

}

var dataEncrypted = (new OneKeyEncryption()).Encrypt(str, salt);
return saltEcryptedLength + saltEcrypted + dataEncrypted;


private byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool
DoOAEPPadding)
{
try
{
byte[] encryptedData;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.ImportParameters(RSAKeyInfo);
encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}
return encryptedData;
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
}

17


- Code giải mã
public override string Descrypt(string str, string privateKey)
{
byte[] bytes = new byte[4];
for (int x = 0; x < 4; x++)
{
bytes[x] = Convert.ToByte(str.Substring(8 * x, 8), 2);

}
int saltEncryptedLength = BitConverter.ToInt32(bytes, 0);
string saltEncrypted = str.Substring(32, saltEncryptedLength);
int numOfBytes = saltEncrypted.Length / 8;
byte[] saltEncryptedByte = new byte[numOfBytes];
for (int x = 0; x < numOfBytes; x++)
{
saltEncryptedByte[x] = Convert.ToByte(saltEncrypted.Substring(8 * x, 8), 2);
}
var sr = new StringReader(privateKey);
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
RSAParameters privKey = (RSAParameters)xs.Deserialize(sr);
var saltByte = RSADecrypt(saltEncryptedByte, privKey, false);
var salt = encoding.GetString(saltByte);
var dataEncryptedString = str.Substring(32 + saltEncryptedLength);
return (new OneKeyEncryption()).Descrypt(dataEncryptedString, salt);
}
private byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool
DoOAEPPadding)
{
try
{
byte[] decryptedData;
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{
RSA.ImportParameters(RSAKeyInfo);
decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding);
}
return decryptedData;
}

catch (CryptographicException e)
{
Console.WriteLine(e.ToString());
return null;
}
}

18


×