Nghiên cứu kỹ thuật dấu tín dùng data hiding kết hợp với hệ mã aes

Công nghệ Data hiding và mã hóa, với công nghệ này chúng có thể truyền tin cho mọi người trên các phương tiện đại chúng mà không bị phát hiện. Cuộc cách mạng thông tin kỹ thuật số đã đem lại những thay đổi sâu sắc trong xã hội và trong cuộc sống của chúng ta. Những thuận lợi mà thông tin kỹ thuật số mang lại cũng sinh ra những thách thức và cơ hội mới cho quá trình đổi mới. Mạng internet toàn cầu đã biến thành một xã hội ảo nơi diễn ra quá trình trao đổi thông tin trong mọi lĩnh vực chính trị, quân sự, quốc phòng, kinh tế, thương mại Và chính trong môi trường mở và tiện nghi như thế xuất hiện những vấn nạn, tiêu cực đang rất cần đến các giải pháp hữu hiệu cho vấn đề an toàn thông tin như nạn xuyên tạc thông tin, truy nhập thông tin trái phép, v.v Đi tìm giải pháp cho những vấn đề này không chỉ giúp ta hiểu thêm về công nghệ phức tạp đang phát triển rất nhanh này mà còn đưa ra những cơ hội kinh tế mới cần khám phá. Trải qua một loạt giai đoạn phát triển , data hiding và mã hóa ngày này càng trở lên tinh vi hơn cùng với sự phát triển của computer. Với môi trường mạng mở, có rất nhiều loại thông tin, trong đó có các thông tin quí giá mà bạn không thể để người khác biết được. Hiện nay cuộc chiến với các cracker vẫn chưa ngã ngũ, và có lẽ sẽ chẳng bao giờ ngã ngũ . thì việc dùng các phương pháp mã hóa sẽ khiến cho những tên cracker sẽ để ý đến thông tin của bạn, và tất nhiên chúng sẽ tìm mọi cách để crack, vì vậy sẽ chẳng có gì là đảm bảo thông tin của bạn sẽ được an toàn. Với công nghệ data hiding bạn có thể dấu một bài thơ tình vào một bức ảnh như bác anaconda mà không làm thay đổi bức ảnh (đối với cảm nhận của con người), như vậy chúng ta đã đánh lạc hướng được những tên cracker, thêm vào đó việc thực hiện crack trên mutimedia sẽ khó khăn hơn nhiều so với crack với các văn bản text. Hiện này công nghệ data hiding đã và đang phát triển ở mức độ cao hơn, đó là vấn đề bảo vệ bản quyền , công nghệ sử dụng trong lĩnh vực này là water marking digital (thủy vân kĩ thuật số) .trong đề tài này chúng em sẽ trình bày về công nghệ Data Hiding sử dụng mã hóa AES và một ứng dụng sử dụng công nghệ này.

doc75 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2832 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Nghiên cứu kỹ thuật dấu tín dùng data hiding kết hợp với hệ mã aes, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
iết hơn phương pháp dịch chuyển dòng, vì khoảng cách giữa hai từ kế nhau trong một dòng thường bị dịch chuyển để hỗ trợ cho sự sắp chữ trong văn bản.Tuy nhiên, phương pháp dịch chuyển từ có thể bị phát hiện và bị đánh bại bằng hai phương pháp sau: Nếu một người biết được thuật toán sử dụng trong định dạng sắp xếp chữ văn bản, khoảng cách thật sự giữa hai từ có thể được đo và so sánh với khoảng cách trong văn bản gốc. Sự khác biệt trong khoảng cách sẽ chứa dữ liệunhúng. Bằng cách chia lại khoảng cách giữa các từ được dịch chuyển, hay dịch chuyển ngẫu nhiên các từ trong văn bản, một người khác có thể làm mất đi từ mã. 2.3.1.1.3 Nhúng dữ liệu đặc trưng Đây là phương pháp thứ ba của Brassil. Giống như hai phương pháp trên, phương pháp này cũng hỗ trợ cả trên ảnh nhị phân của văn bản hay trên tập tin định dạng văn bản. Đặc trưng của văn bản có thể bị thay đổi hay không bị thay đổi phụ thuộc vào từ mã. Việc nhúng các bit vào văn bản có thể bằng cách kéo dài hay cắt ngắn các nét trên cùng của các kí tự như b, d, h,... Trước khi mã hóa, các dòng trên của các kí tự được kéo dài hay cắt ngắn, sau đó sẽ bị thay đổi một lần nữa để mã hóa dữ liệu đặc biệt. Điều này tránh được sự rút trích dữ liệu công khai, vì chiều cao các kí tự trong văn bản gốc không được biết. Và dĩ nhiên, quá trình giải mã cần phải có các ảnh gốc. Phương pháp mã hóa đặc trưng có thể thực hiện trên một lượng dữ liệu nhúng lớn, vì một văn bản có nhiều đặc trưng. Phương pháp này có thể bị đánh bại bằng cách điều chỉnh lại chiều dài các kí tự theo một giá trị cố định 2.3.1.2 Các kỹ thuật của Bender Các văn bản ở dạng số rất khó chứa dữ liệu ẩn (trong khi văn bản trên giấy thì dễ hơn). Các văn bản ở dạng số ít có các thao tác biến đổi như trên ảnh, nhưng nếu văn bản xuất hiện một từ hay một câu lạ thì dễ dàng bị người đọc phát hiện. Bender đưa ra ba phương pháp chính sử dụng cho ẩn dữ liệu trên vănbản: Phương pháp khoảng trắng mở sử dụng các khoảng trắng không được sử dụng trong các trang in Phương pháp cú pháp sử dụng các dấu câu Phương pháp ngữ nghĩa thao tác dựa trên nghĩa của các từ 2.3.1.2.1 Phương pháp khoảng trắng mở Bender đưa ra hai lý do của việc sử dụng khoảng trắng để mã hóa. Thứ nhất, khi thay đổi số lượng các khoảng trắng thì nghĩa của câu ít bị ảnh hưởng. Thứ hai, người đọc tình cờ sẽ không chú ý đến sự thay đổi của các khoảng trắng. Trong phương pháp này lại có ba phương pháp nhỏ: phương pháp khai thác khoảng trắng giữa các câu, giữa các từ và giữa các dòng trong các văn bản được sắp chữ. Phương pháp khai thác khoảng trắng giữa các câu:mã hóa một chuỗi nhị phân vào văn bản bằng cách đặt một hay hai khoảng trắng sau mỗi kí tự kết thúc, ví dụ như một câu trong văn xuôi, một dấu chấm phẩy (;) trong ngôn ngữ C,... Một khoảng trắng mã hóa 0, hai khoảng trắng mã hóa 1. Phương pháp này không hiệu quả, nó cần phải có một văn bản lớn để mã hóa một lượng bit nhỏ (một bit trên một câu tương ứng với tỉ lệ dữ liệu là 1bit/160 byte với giả thuyết một câu trung bình có 80 kí tự). Phương pháp này cũng phụ thuộc vào cấu trúc của văn bản. Hầu hết các trình xử lý văn bản đều xử lý khoảng trắng sau mỗi câu. Phương pháp khai thác khoảng trắng sau mỗi dòng: dữ liệu mã hóa cho phép xác định số khoảng trắng sau mỗi dòng. Hai khoảng trắng mã hóa một bit, bốn khoảng trắng mã hóa hai bit, tám khoảng trắng mã hóa ba bit,... Phương pháp này có thể thực hiện trên mọi loại văn bản, vì nó không bị người đọc phát hiện do những khoảng trắng thêm vào nằm ngoài phạm vi của văn bản. Nó còn mã hóa được số lượng bit nhiều hơn phương pháp trên. Trong phương pháp khai thác khoảng trắng sau mỗi câu, văn bản sau khi đã nhúng dữ liệu, qua các chương trình như thư điện tử có khả năng bị cắt mất khoảng trắng. Vấn đề duy nhất của phương pháp khai thác khoảng trắng sau mỗi dòng là không thể lấy lại dữ liệu nhúng được sau khi văn bản chứa đã qua các thao tác sao chép trên giấy. Phương pháp khai thác các khoảng trắng ngay sau các từ: một khoảng trắng mã hóa bit 0, hai khoảng trắng mã hóa bit 1. Phương pháp này cho kết quả vài bit trên một dòng. Để xác định khoảng trắng nào là của dữ liệu nhúng, khoảng trắng nào là của văn bản, Bender sử dụng phương pháp mã hóa giống như phương pháp của Manchester. Manchester sử dụng một nhóm bit để đại diện cho một bit. “01” được giải mã thành 1, “10” là 0, “00” và “11” là rỗng. Ví dụ: chuỗi được mã hóa là “1000101101” thì được giải mã thành “001”, trong khi chuỗi “110011” là rỗng. Phương pháp khoảng trắng hiệu quả trong các văn bản định dạng ASCII.Một số dữ liệu có khả năng bị mất khi văn bản được in ra. 2.3.1.2.2 Phương pháp cú pháp Hai phương pháp cú pháp và ngữ nghĩa có thể kết hợp song song. Trong nhiều tình huống sau khi mã hoá, văn bản có số lượng dấu câu nhiều hay có dấu câu sai, nhưng lại không ảnh hưởng lớn đến ngữ nghĩa trong văn bản. Ví dụ cụm từ “bread, butter, and milk” và “bread, butter and milk” cả hai đều dùng dấu phẩy đúng. Bất cứ khi nào trong câu sử dụng dạng thứ nhất thì mã hóa 1, dạng thứ hai thì mã hóa 0. Trong một số ví dụ còn sử dụng các từ viết tắt, viết gọn. Phương pháp này chỉ mã hóa được vài bit trên 1Kb văn bản. Phương pháp cú pháp còn bao gồm cả cách thay đổi trong cách thức diễn đạt và cấu trúc văn bản mà không làm thay đổi ngữ nghĩa. Phương pháp này rõ ràng có hiệu quả hơn phương pháp khoảng trắng, nhưng khả năng khai thác của nó bị giới hạn. 2.3.1.2.3 Phương pháp ngữ nghĩa Phương pháp này cũng tương tự như phương pháp cú pháp. Phương pháp ngữ nghĩa dùng giá trị chính hay phụ đồng nghĩa. Ví dụ từ “big” có thể thay bằng“large” (Hình 8). Khi giải mã, từ có ý nghĩa chính sẽ đại diện cho giá trị 1, từ có ý nghĩa phụ sẽ đại diện cho giá trị 0.Tuy nhiên phương pháp này có thể làm thay đổi ngữ nghĩa của câu, mặc dù từ thay thế cùng nghĩa, nhưng sắc thái của câu đã bị thay đổi (các từ được dùng thích hợp trong từng ngữ cảnh). 2.3.2 Các kỹ thuật ẩn dữ liệu trên ảnh tĩnh: Ảnh tĩnh là một đối tượng rất thích hợp cho ẩn dữ liệu, nhất là trong Steganography vì các yếu tố sau đây: Một ảnh chứa rất nhiều dữ liệu, giả sử một ảnh có kích thước 600 × 400 được mỗi pixel được biểu diễn bởi 3 byte RGB thì có dung lượng là 720000 byte. Một ảnh có chứa dữ liệu nhúng sẽ ít gây chú ý hơn là một văn bản. Sự khác biệt giữa ảnh gốc và ảnh sau khi nhúng rất khó nhận ra được bằng mắt thường. Thông tin có thể được ẩn trong ảnh tĩnh bằng nhiều cách. Thông điệp được mã hóa từng bit vào ảnh. Các kỹ thuật mã hóa phức tạp hơn là kỹ thuật ẩn thông điệp vào những vùng nhiễu của ảnh, như vậy sẽ ít gây sự chú ý hơn. Thông điệp cũng có thể được rải ngẫu nhiên trên ảnh chứa. 2.3.2.1 Các hướng tiếp cận của các kỹ thuật ẩn dữ liệu trên ảnh tĩnh: Chèn vào bit thấp nhất LSB (Least Significant Bit). Các kỹ thuật lọc và mặt nạ. Các thuật toán và các phép biến đổi 2.3.2.1.1 Hướng tiếp cận chèn vào bit LSB: Phương pháp chèn bit vào LSB là phương pháp được biết nhiều nhất trong kỹ thuật ẩn dữ liệu. Đây là một hướng tiếp cận thông dụng, đơn giản để nhúng thông tin vào ảnh. Nhưng phương pháp này có nhược điểm là dễ bị tấn công bởi các thao tác trên ảnh. Một sự chuyển đổi từ dạng GIF hay BMP sang dạng nén mất dữ liệu (ví dụ như JPEG) có thể hủy hết thông tin ẩn trong ảnh. Khi sử dụng kỹ thuật LSB cho ảnh 24 bit màu, mỗi pixel có 3 bit được dùng để mã hóa dữ liệu (vì mỗi pixel được biểu diễn bằng 3 byte). Sự thay đổi trên pixel khó bị mắt người nhận ra. Ví dụ, kí tự A có thể được ẩn trong 3 pixel. Giả sử 3 pixel của ảnh gốc có giá trị nhị phân như sau: ( 00100111 11101001 11001000 ) ( 00100111 11001000 11101001 ) ( 11001000 00100111 11101001 ) Giá trị nhị phân của kí tự A là (10000011). Sau đây là kết quả sau khi nhúng giá trị nhị phân của A vào 3 pixel trên, bắt đầu từ byte đầu tiên bên trái trên cùng: ( 00100111 11101000 11001000 ) ( 00100110 11001000 11101000 ) ( 11001000 00100111 11101001 ) Chỉ có các bit LSB in đậm bị thay đổi. Các kỹ thuật chèn vào bit LSB cải tiến là dữ liệu có thể được ẩn trong bit thấp nhất và bit thấp thứ hai trong byte mà mắt người vẫn không thể nhận ra sự thay đổi. Sử dụng kỹ thuật LSB trong ảnh 8 bit màu phải cẩn thận hơn đối với ảnh 24 bit màu vì sự thay đổi màu sắc rõ hơn. 2.3.2.1.2 Phương pháp ngụy trang và lọc: Kỹ thuật ngụy trang và lọc ẩn thông tin bằng cách đánh dấu một ảnh bằng một ký hiệu mờ. Các kỹ thuật nhúng dấu hiệu thích hợp với ảnh hơn, các kỹ thuật đó có thể được áp dụng trên ảnh tĩnh mà không sợ ảnh hưởng của định dạng ảnh nén mất dữ liệu. Bằng cách che phủ, hoặc ngụy trang một tín hiệu mờ, hệ thống thị giác của người HVS không thể nhận biết được sự thay đổi trên ảnh. Về mặt kỹ thuật, nhúng dấu hiệu không phải là một dạng của Steganography. Trong khi Steganography dấu dữ liệu trong ảnh, nhúng dấu hiệu mở rộng thông tin của ảnh và trở thành một thuộc tính của ảnh chứa, cung cấp các chi tiết về bản quyền, giấy phép, quyền sỡ hữu. Các kỹ thuật ngụy trang thích hợp hơn cho các ảnh nén dạng JPEG hơn là các kỹ thuật LSB vì chúng có thể miễn dịch trước các thao tác nén hay xén ảnh. 2.3.2.1.3 Các thuật toán và phép biến đổi: Hiện nay trên Internet, ảnh JPEG đã trở nên phong phú vì là chuẩn nén tốt, chất lượng cao và tỉ lệ nén cao. Nguyên lý cơ bản trong chuẩn nén JPEG là phép biến đổi cosin rời rạc DCT (Discrete Cosine Transform). DCT là phép biến đổi nén mất dữ liệu, vì giá trị cosin không thể tính toán chính xác được và các lỗi trong tính toán có thể xuất hiện. Sự khác biệt giữa dữ liệu của ảnh gốc và dữ liệu của ảnh sau khi nén phụ thuộc vào các giá trị và các phương pháp sử dụng trong tính toán DCT. Các ảnh cũng có thể tiến hành bằng các phép biến đổi Fast Fourier và biến đổi Wavelet. Hệ HVS có độ nhạy rất thấp với các thay đổi nhỏ trên độ chói. Các hệ thống hiện đại sử dụng truyền thông phổ rộng để truyền một tín hiệu dãy tần số thấp trên một băng thông lớn hơn, vì thế mật độ của tín hiệu trên kênh truyền chỉ giống như nhiễu. Hai kỹ thuật phổ rộng khác nhau được gọi là dãy trực tiếp và nhảy tần số. Kỹ thuật dãy trực tiếp dấu thông tin bằng cách thay đổi pha của tín hiệu dữ liệu với một chuỗi số giả ngẫu nhiên mà cả người gửi và người nhận đều biết. Kỹ thuật nhảy tần số phân chia băng thông có sẵn thành nhiều kênh truyền và nhảy giữa các kênh truyền đó (cũng được chèn bằng một dãy số giả ngẫu nhiên). 2.3.2.2 Các kỹ thuật ẩn dữ liệu trên ảnh tĩnh: Các kỹ thuật ẩn dữ liệu trên ảnh tĩnh được chia thành hai loại theo kích thước dữ liệu nhúng: Ẩn dữ liệu với tỉ lệ bit thấp, lượng dữ liệu được nhúng trong ảnh rất ít, có kỹ thuật chỉ nhúng một bit vào ảnh vì thế tính bền vững của dữ liệu nhúng cao. Ẩn dữ liệu với tỉ lệ bit cao, lượng dữ liệu được nhúng cao hơn nhiều và do đó tính bền vững cũng thấp hơn. 2.3.2.2.1 Ẩn dữ liệu với tỉ lệ bit thấp: Hai kỹ thuật điển hình là Patchwork và mã hóa kết cấu khối. Patchwork nhúng một bit đơn vào ảnh với một giá trị tin cậy cao dựa trên phân phối Gaussian. Mã hóa kết cấu khối dựa trên các vùng đồng nhất trên ảnh. 2.3.2.2.1.1 Patchwork- cách tiếp cận thống kê: Patchwork là một hướng tiếp cận theo phương pháp thống kê, dựa trên các dãy số giả ngẫu nhiên[15]. Patchwork nhúng vào ảnh chứa một số thống kê đặc thù, chứa một hàm phân phối Gaussian sao cho mắt người không thể nhận ra. Hình 3.1 mô tả một phương pháp Patchwork dùng một vòng lặp đơn. Hai mảnh A, B được chọn ngẫu nhiên, mảnh A có màu sáng trong khi mảnh B có màu tối. Một số liệu thống kê duy nhất sẽ cho biết dấu hiệu có xuất hiện hay không. Patchwork có đặc điểm là không phụ thuộc vào nội dung của ảnh chứa và kỹ thuật này có khả năng tránh được các biến đổi phi hình học. Để minh họa, ảnh chứa trong ví dụ này có mức sáng 256, hệ thống lượng tử tuyến tính sẽ bắt đầu từ 0 và tất cả các mẫu không phụ thuộc vào các mẫu khác, hay nói chính xác hơn là các mẫu độc lập với nhau. Hình 4. Vòng lặp đơn trong thuật giải Patchwork Nguyên lý thuật giải: Sử dụng lý thuyết thống kê, hàm phân phối Gaussian để mã hóa. Chọn một khóa để tạo một dãy số ngẫu nhiên. Dựa vào các số trên dãy số ngẫu nhiên, chọn ra mỗi lần hai mảnh trên ảnh chứa, một mảnh có giá trị sáng (A-ai) và một mảnh có giá trị tối hơn (B-bi). Trừ vào ai một lượng δ và cộng vào bi một lượng δ . Đối với mức sáng 256 thì δ có giá trị từ 1 đến 5. Lặp lại quá trình n lần (thông thường n ≈10000). Sử dụng hàm phân phối Gaussian để tính S với độ tin cậy tốt. Nếu S dương thì giá trị mã hóa là 1, nếu S âm thì mã hóa 0. Sau đây là bảng số liệu mô tả mối quan hệ giữa n và độ tin cậy, với δ = 2 : STT Độ tin cậy n 0 50.00% 0 1 84.13% 679 2 97.87% 2713 3 99.87% 6104 Bảng 1 Mối quan hệ giữa n và độ tin cậy Vì n hoặc δ tăng, nên đồ thị hàm phân bố của S ′n dịch chuyển qua phải. Sau đây là một số cải tiến của phương pháp Patchwork: Các mảnh bao gồm nhiều pixel tốt hơn các mảnh chỉ có một pixel. Kết hợp với mã affine hay các thông tin heuristic dựa trên đặc điểm nhận biết sẽ làm phương pháp này mạnh hơn. Mã hóa Patchwork nhạy với các phép biến đổi affine, nếu các điểm trên ảnh chứa bị dịch chuyển bới các phép tịnh tiến hay biến đổi tỉ lệ thì dữ liệu nhúng sẽ bị mất. Patchwork có khả năng chống lại các thao tác xén ảnh, nếu các mảnh không nằm trong phạm vi bị xén thì dữ liệu nhúng vẫn giữ nguyên. Hình dáng của mảnh: Hình 3.2 mô tả ba loại hình dáng mảnh và sự phân bố tương ứng với mảnh đó. Hình 3.2 a) mảnh nhỏ, cạnh sắc, kết quả là phần lớn năng lượng của mảnh tập trung ở phần tần số cao của mảnh: dễ bị mất dữ liệu khi qua thao tác nén mất dữ liệu. Hình 3.2 b) thì năng lượng tập trung ở phần tần số thấp. Hình 3.2.c) phân phối năng lượng đều ở phần tần số cao và tần số thấp. HÌnh 5 Hình dáng các mảnh Lựa chọn hình dáng mảnh tối ưu nhất phụ thuộc vào từng loại ảnh và các thao tác trên ảnh. Nếu ảnh chứa có định dạng là JPEG thì mảnh có dạng như hình 3.2b) là tối ưu nhất vì năng lượng phân bố tại phần tần số thấp. Nếu trên ảnh chứa có thao tác tăng độ tương phản thì mảnh như hình 3.2a) là tốt nhất. Nếu trong trường hợp không biết các thao tác trên ảnh thì chọn mảnh như hình 3.2c) là tốt nhất. Sự sắp xếp các mảnh cũng ảnh hưởng đến hiệu quả của phương pháp. Hình 3.3 mô tả ba phương pháp sắp xếp mảnh. Hình 11a) là sắp xếp theo dạng lưới thẳng, phương pháp này ít được sử dụng khi n lớn vì HSV rất nhạy với dạng này. Hình 3.3b) là sắp xếp theo dạng lục giác đều. Hình 3.3c) là sắp xếp theo ngẫu nhiên. Hình 6. Sự sắp xếp các mảnh Phương pháp Patchwork có vài giới hạn: thứ nhất là tỉ lệ dữ liệu mã hóa thấp, chỉ phù hợp cho các ứng dụng mã hóa với tỉ lệ dữ liệu thấp, thứ hai là các pixel trong ảnh chứa phải được ghi nhớ và không được di chuyển. 2.3.2.2.1.2 Mã hóa kết cấu khối (texture block coding)-Cách tiếp cận trực quan: Phương pháp này ẩn dữ liệu trong những mẫu kết cấu ảnh ngẫu nhiên và liên tiếp. Kỹ thuật này được thực hiện bằng cách sao chép một vùng ảnh từ một mẫu kết cấu ngẫu nhiên trên ảnh đến một vùng khác có kết cấu tương tự. Hình 7. Một ví dụ về phương pháp mã hóa kết cấu khối Quá trình giải mã: Tự động đặt hai ảnh tương quan chồng lên nhau (ảnh gốc và ảnh sau khi nhúng dữ liệu). Việc này sẽ làm hiện ra các đỉnh mà ở đó có các vùng chồng chéo lên nhau. Dịch chuyển ảnh. Sau đó trừ giá trị ảnh gốc với ảnh sao chép của nó. Gán giá trị 0 cho mép bìa ảnh nếu cần thiết. Điều chỉnh kết quả và giới hạn nó để nó chỉ gồm những giá trị gần 0. Ảnh chứa dữ liệu sẽ thấy được các giá trị đó. Nếu ảnh chứa dữ liệu ẩn bị thao tác bằng các phép biến đổi thì cả hai vùng sẽ bị thay đổi như nhau vì chúng là hai vùng đồng nhất có kết cấu giống nhau. Nếu chọn lựa vùng có kích thước hợp lý, phần bên trong của khối thay đổi như nhau qua hầu hết các phép biến đổi phi hình học. Mã hóa kết cấu khối không phải là không có bất lợi. Hiện nay, kỹ thuật này cần có các thao tác của con người để chọn lựa vùng nguồn và vùng đích có kích thước thích hợp và ước lượng ảnh hưởng trực quan của các biến đổi trên ảnh. Thật ra có thể tự động hóa quá trình này bằng cách sử dụng một máy tính nhận dạng kết cấu các vùng sao chép và dán lên ảnh. Tuy nhiên, kỹ thuật này không có tác dụng với ảnh thiếu vùng có kích thước kết cấu vừa phải và kết cấu liên tiếp. 2.3.2.2 .2 Mã hóa với dữ liệu bit cao – Mã hóa affine: Mã hóa dữ liệu với tỉ lệ bit cao có thể có rất ít tác động lên ảnh chứa, nhưng nó không có khuynh hướng tránh được các biến đổi trên ảnh chứa. Hình thức thông thường nhất là thay thế bit thấp nhất của độ chói bằng dữ liệu nhúng. Không có một kỹ thuật đã biết nào tránh được tất cả các phép biến đổi hay tổ hợp các phép biến đổi. Đối với tổ hợp các phép biến đổi, thường người ta sử dụng thêm một kỹ thuật khác để hỗ trợ. Kỹ thuật hỗ trợ này rất quan trọng đối với các phép biến đổi affine, và nó giữ lại sự đồng bộ cho luồng dữ liệu mã hóa. Sau đây là hai phương pháp của Yu –Yuan Chen , Hsiang – Kuang Pan và Yu – Chee Tseng ở khoa Khoa học máy tính trường Đại học Trung tâm quốc gia Đài Loan. Hai phương pháp này nhúng dữ liệu bằng cách thay thế các bit trong dữ liệu ảnh, chúng không tránh được các phép biến đổi affine, nhưng số lượng dữ liệu được nhúng lớn và khả năng một người thứ ba giải mã được là rất khó, tuy nhiên cả hai phương pháp đều sử dụng ảnh nhị phân làm đối tượng nhúng. 2.3.2.2 .2.1 Phương pháp nhúng dữ liệu vào các khối, mỗi khối chứa tối đa một bit dữ liệu: Phương pháp này nhúng dữ liệu bằng cách chia ảnh ra thành các khối kích thước bằng nhau, mỗi khối được nhúng tối đa một bit dữ liệu. Dữ liệu của mỗi khối là các bit LSB của từng pixel trong ảnh. Ký hiệu: Với B1 và B2 là hai ma trận cùng kích thước: B: ma trận 0,1 . B1Ù B2: AND từng phần tử tại vị trí i,j của B1 với từng phần tử i,j tương ứng của B2. [B]i,j : phần tử của B tại vị trí hàng i, cột j. SUM ( B ): tổng tất cả các thành phần trong B. F: ma trận điểm ảnh, là ma trận sẽ chứa dữ liệu được nhúng. Có kích thước là bội số các khối m × n . K: ma trận 0,1 có kích thước m × n, còn gọi là ma trận khóa. Thuật giải: Nguyên lý: thay đổi giá trị trong các Fi thành Fi ¢ sao cho: SUM ( Fi ¢Ù K ) mod 2 = b Với b là bit cần nhúng. Bước 1: Chia F thành nhiều khối, mỗi khối có kích thước m´ n. Bước 2: Với mỗi khối Fi nhận được, xét điều kiện: 0 < SUM ( Fi Ù K ) < SUM|(K) - Nếu TRUE: nhảy đến bước 3 để nhúng 1 bit vào Fi. - Nếu FALSE: trong khối Fi sẽ không có dữ liệu được nhúng. Bước 3: Giả sử bit cần được nhúng là b. (a) If ( SUM ( Fi Ù K ) mode 2 =b ) then Giữ nguyên Fi. (b) Else if SUM ( Fi Ù K ) = SUM ( K ) - 1 then Chọn ngẫu nhiên một bit [Fi]j,k =0 với [K]j,k =1 và đổi [Fi]j,k =1. c) Else if SUM ( Fi Ù K ) =1 - then Chọn ngẫu nhiên một bit [Fi]j,k =1 với [K]j,k =1 và đổi [Fi]j,k = 0. (d) Else Chọn ngẫu nhiên một bit [Fi]j,k với [K]j,k =1 và lấy phần bù của [Fi]j,k. End if. Cơ sở toán học: Sau khi thực hiện các bước ta được các i F¢, là các khối Fi sau khi bị thay đổi. Với điều kiện:0<SUM(FiÙK)<SUM(K)thì b mới được nhúng vào Fi Þ 0 < SUM ( Fi ¢Ù K ) < SUM ( K ) (3.3) Gọi , [ Fi ] j ,k ¢ là phần bù của , [ Fi ] j ,k , thì ([ Fi ] j ,k ¢Ù K j ,k ) là phần bù của ([ Fi ] j , k Ù K j ,k ) với Kj,k =1 Và SUM ( Fi ¢Ù K ) = SUM ( F Ù K ) ± 1 .Dấu + xảy ra trong trường hợp [ Fi ] j ,k =0, dấu – xảy ra trong trường hợp , [ Fi ] j ,k = 1 Biểu thức liên quan: 0 < SUM ( Fi ¢Ù K ) < SUM ( K ) Þ SUM ( Fi ¢Ù K ) º b mod 2 hay: SUM ( Fi ¢Ù K ) mod 2 = b Đặt c = SUM ( Fi Ù K ) . Ta có 4 trường hợp tương quan giữa c và b xảy ra: TH1: c=0, b=0; TH2: c=1,b=1; TH3: c=1,b=0; TH4: c=0,b=1. Xét TH1 và TH2, b =c nên c = SUM ( Fi Ù K ) mod 2 = b Þ Fi ¢= Fi ứng với trường hợp (a). Xét TH3,TH4: c=!b nên cần biến đổi [ Fi ] j ,k : . [ Fi ] j , k \ SUM ( Fi ¢Ù K ) = SUM ( Fi Ù K ) ± 1 Þ [ Fi ] j , k ¢ phải là phần bù của [ Fi ] j ,k . Xét 3 giá trị của SUM ( Fi Ù K ) : SUM ( Fi Ù K ) = 1 :thì SUM ( Fi ¢ K ) = SUM ( Fi Ù K ) + 1 ,Ù, phải tăng SUM ( Fi Ù K ) thêm một giá trị để thỏa điều kiện (3.2). Nên ta chọn ngẫu nhiên một i [Fi ] j,k = 0 với K j ,k = 1 và thay đổi [ Fi ] j ,k = 1 . SUM ( Fi Ù K ) = SUM ( K ) - 1 : SUM ( Fi ¢ K ) = SUM ( Fi Ù K ) - 1 , phải giảm SUM ( Fi Ù K ) đi một giá trị để thỏa điều kiện (3.2). Nên chọn ngẫu nhiên một [ Fi ] j ,k = 1 với K j ,k = 1 và thay đổi [ Fi ] j , k = 0 . Với các giá trị còn lại của SUM ( Fi Ù K ) nếu tăng hay giảm SUM ( Fi Ù K ) một giá trị thì vẫn thỏa điều kiện (3.2). Chọn ngẫu nhiên một [ Fi ] j ,k với K j ,k = 1và , [ Fi ] j ,k ¢ là phần bù của [ Fi ] j ,k . Ví dụ: Hình 3.5. F: ma trận 6 × 6. K: ma trận 3 × 3. Chia F thành F1, F2, F3, F4 mỗi Fi có kích thước 3 × 3. Xét 1 SUM ( F1 Ù K ) = SUM ( K ) = 5 : không có bit nào được nhúng vào F1 ,F1¢ ºF1 . Xét SUM ( F2 Ù K ) = 3 thỏa (3.1), b1 = 0 thỏa (b), lấy ngẫu nhiên [F2]2,3= 0 với K2,3 =1 và đổi [ F2 ]2,3 = 1 = [ F2 ]2,3¢. Xét SUM ( F3 Ù K ) = 3 thỏa (3.1), b2=1 thỏa (a) nên giữ nguyên F3. Xét SUM ( F4 Ù K ) = 4 thỏa (3.1), và SUM ( F4 Ù K ) = SUM ( K ) - 1 thỏa (c), lấy ngẫu nhiên [F2]2,3 = 1 với K2,3 =1 và đổi 2 2,3 2 2,3 [F] =0=[F] ¢. Hình 8. Nhúng 3 bit vào ảnh 6 x 6 Đánh giá thuật giải: Do sử dụng toán tử logic AND nên: SUM ( Fi Ù K ) không bao giờ vượt quá SUM (K). So sánh giữa F và F ¢ tại những vị trí hàng i, cột j tương ứng, nếu hai giá trị khác nhau thì tại đó Ki,j =1 và ngược lại Ki,j =0. Như vậy, khi so sánh tất cả các hần tử của F và F¢ thì ta có thể suy ra toàn bộ ma trận K, K không còn là bí mật nữa. Nếu K có nhiều giá trị 1 thì sự khác nhau giữa F và F¢ gia tăng, gây nên sự nghi ngờ có chứa dữ liệu. Nhưng nếu K có nhiều giá trị 0 thì thuật giải cũng không hoàn toàn khả thi. Nếu F có tất cả các giá trị hoàn toàn là 1 thì khả năng nghi nghờ chứa dữ liệu gia tăng và suy luận ra K dễ dàng. Nhưng nếu F có nhiều giá trị 0 thì tỉ lệ ẩn dữ liệu không cao. Tóm lại, việc chọn K và F phù hợp là điều quan trọng. Phương pháp mã hoá dữ liệu này không an toàn cao, số lượng dữ liệu được chứa không nhiều. 2.3.2.2 .2.2 Phương pháp nhúng dữ liệu vào các khối, mỗi khối chứa tối đa hai bit dữ liệu: Phương pháp này là phương pháp cải tiến phương pháp trên. Nó bảo đảm tỉ lệ ẩn của dữ liệu cao hơn, do dùng một ma trận trọng lượng W. Phương pháp này cũng dựa trên phép toán mod và toán tử logic Å . Ở mỗi khối m´ n, sẽ có r bit được nhúng với 2r- 1£ mn , nhưng chỉ làm thay đổi tối đa 2 bit trên ma trận chứa. Ký hiệu: F: ma trận điểm ảnh, sẽ chứa dữ liệu được nhúng, giả sử là F được chia thành k khối Fi có kích thước m´ n. Sau các bước thực hiện, F sẽ bị thay đổi thành ma trận F¢. K: ma trận khóa. Nó là một ma trận m´ n, được chọn ngẫu nhiên phù hợp theo từng trường hợp. Các giá trị trong K là 0 hoặc 1. W: ma trận trọng lượng m´ n, với [W]i,j ∈ {1.. 2r –1}. Cách sắp xếp các giá trị được chọn ngẫu nhiên. r: số lượng bit được nhúng vào một khối m´ n, r thỏa2r- 1£ mn . B: các thông tin được nhúng, B gồm kr bit, k là số lượng khối của F. A1, A2 là hai ma trận m´ n, toán tử A1 ⊗ A2 là toán tử mà " i,j i=1...m, j=1..n thì 1 , 2 , [ A1 ]i , j ´ [ A2 ]i , j .. Ma trận trọng lượng: Ma trận trọng lượng W m´ n thỏa các điều kiện sau: 2r- 1£ mn . (3.4) Các phần tử [W]i,j Î {1.. 2r –1}. (3.5) " k Î {1… 2r –1}, k phải xuất hiện ít nhất một lần trong W. (3.6). Ma trận W được chọn ngẫu nhiên thỏa điều kiện và theo từng trường hợp. Với m hàng n cột, W có thể có các lựa chọn sau: Có 2r –1 giá trị, vì thế để chọn giá trị cho mn phần tử có: 2r 1Cmn- Ta có thể sắp xếp ngẫu nhiên các giá trị: (2r –1)! cách. Với mn - 2r –1 giá trị còn lại có thể sắp xếp ngẫu nhiên: (2r−1)mn−(2r−1) Vậy: số lần chọn lựa W : C2mn 1 *(2r - 1)!*(2r - 1) mn- 2 – 1 Ví dụ:m = n = 8 và r = 5. Ta có C64 31!*3133 cách chọn W. Vì thế tỉ lệ bảo mật thông tin rất cao nếu W không được công bố. Vì phương pháp này dùng toán tử mod: b1b2 ...br = SUM (( Fi Å K ) Ä W ) mod 2 . và 0 £ SUM (( Fi Å K ) Ä W ) < 2r - 1 nên W phải thỏa điều kiện 3 điều kiện trên. Nếu 2r –1> mn thì $ k Î { r - 1}\ k ¹ [W ]i , j " i Î { m}, j Î { n} 1...21...1... ⇒ (3.6) sai. Thuật giải: Fi sẽ được chuyển thành i F¢ bằng cách lấy phần bù của một giá trị nào đó trong Fi để thỏa công thức sau: SUM (( Fi ¢Å K ) Ä W ) º b1b2 ...br (mod 2r ) Û SUM (( Fi ¢Å K ) Ä W ) mod 2r = b1b2 ...br Bước 1: Chia F thành các khối Fi kích thước m × n. Tính Fi ⊕ K. Bước 2: Tính SUM (( Fi Å K ) Ä W ) . . Bước 3: Với w={1…2r-1}. Từ ma trận kết quả Fi ⊕ K, tính: S w = { j , k ) \ ([W ] j ,k = w Ù[ Fi Å K ] j ,k = 0) Ú ([W ] j ,k = 2r - w Ù[ Fi Å K ] j ,k = 1)} (3.8) Theo (3.8), Sw là tập hợp các bộ (j,k) sao cho nếu lấy phần bù của [Fi]j,k thì SUM (( Fi Å K ) Ä W ) sẽ tăng thêm w . Có hai trường hợp: [W ] j ,k = w Ù[ Fi Å K ] j ,k = 0 : Ta thấy nếu lấy phần bù [ Fi ] j ,k Þ [ Fi Å K ] j ,k = 1 Þ SUM ( Fi Å K ) Ä W tăng thêm w. [W ] j ,k = 2r - w Ù[ Fi Å K ] j ,k = 1 : Nếu lấy phần bù của , [ Fi ] j ,k Þ SUM (( Fi Å K ) Ä W ) giảm đi 2r-w, Û tăng wkhi lấy SUM (( Fi Å K ) Ä W ) mod 2 . Bước 4: Ta có công thức: d º (b1b2 ...br ) - SUM (( Fi Å K ) Ä W )(mod 2r ) (3.9) Đây là biểu thức chênh lệch giữa tổng và giá trị được nhúng, để giải mã theo công thức (3.8) ta phải tăng tổng thêm một giá trị d. Đặt S w = S w¢ với w º w¢mod 2r . Khi d=0 không cần thay đổi Fi. Nếu d ≠ 0, thực hiện các bước sau: Chọn ngẫu nhiên một h Î {0,1…,2r-1} với điều kiện Shd ¹ Æ và S-(h-1)d ≠Æ. Chọn ngẫu nhiên một bộ (j,k) Î Shd và lấy phần bù của [Fi]j,k. Chọn ngẫu nhiên một bộ (j,k) Î S-(h-1)d và lấy phần bù của [Fi]j,k. Để tăng tổng thêm một lượng d, ta dùng hai tập khác rỗng Shd và S-(h-1)d. Tổng sẽ tăng thêm hd + (- (h-1)d) = d. Tuy nhiên ta phải gán giá trị cho các tập S0, S2.r, S2.2r, S3.2r… luôn rỗng. Cơ sở toán học: Bổ đề 1: Với w=1…2r-1 và w ¹ ≠ 2r-1 thì mệnh đề sau đây đúng: ( S w = Æ) Þ ( S 2r - w ¹ Æ) Chứng minh: Giả sử Sw = Æ Theo điều kiện của W, phải có tối thiểu một [W]j,k = w. Nếu [Fi]j ,k ∧ [K]j ,k = 0 thì lấy phần bù của [Fi]j,k sẽ làm tăng tổng thêm w , như vậy Sw ≠ ∅ . Như vậy [ Fi ] j ,k Ù[ K ] j ,k = 1 , thì khi lấy phần bù [Fi]j,k sẽ làm giảm tổng đi w, hay tăng tổng lên 2r-w (mod 2r), như vậy tập S 2 - w ¹ Æ , với w ¹ 2r-1 vì w=2r-w lúc đó S2 - w ¹ Æ . Bổ đề 2: S 2r- 1 ¹ Æ Chứng minh: Theo điều kiện của W, phải có tối thiểu một [W]j,k = 2r-1. Vì 2r- 1 º - 2r- 1 mod 2r . Nếu [W ] j ,k = w Ù[ Fi Å K ] j ,k = 0 thì khi lấy phần bù của [Fi]j,k thì tổng tăng thêm 2r-1. Nếu , [W ] j ,k = w Ù[ Fi Å K ] j ,k = 1 thì khi lấy phần bù của [Fi]j,k thì tổng giảm đi 2r-2r-1 hay tương đương tổng tăng thêm 2r-1. Như vậy cả trong 2 trường hợp S 2 ¹ Æ Bổ đề 3: Bước 4 luôn cho kết quả, và có tối đa 2 bit của Fi bị thay đổi để nhúng r bit dữ liệu Chứng minh: Ta sẽ kiểm tra lần lượt các giá trị của h: Đầu tiên h=1, nếu Sd ¹ Æ thì h=1là giải pháp được chọn, nếu trái lại thì S- d ¹ Æ theo bổ đề 1 h=2, nếu S2d ¹ Æ thì h=2 được chọn, ngược lại 2d S- ¹ Æ theo bổ đề 1. Tiếp tục kiểm tra, nếu tất cả Si đều là rỗng thì S2 ¹ Æ theo bổ đề 2. Và với 2r-1, $ h sao cho 2r-1 là bội số của d. Như vậy luôn tìm được một h cho vấn dề. Ví dụ: Hình 3.6 và hình 3.7 Giả sử F là ma trận 8´ 8 . F được chia thành 4 khối 4´ 4 từ F1…F4. K ma trận khóa 4´ 4. Bước 4 luôn cho kết quả, và có tối đa 2 bit của Fi bị thay đổi để nhúng r bit dữ liệu. W ma trận trọng lượng 4´ 4. B = 001010000001. r = 3. Các ma trận được mô tả như hình dưới đây. Thực hiện các bước: F1: SUM (( F1 Å K ) Ä W ) º 0(mod 8) . Và dữ liệu nhúng là 001, ta phải tăng tổng thêm 1. Vì [ F1 Å K ]2,4 = 0 và [W]2,4 = 1 ta có thể lấy phần bù của [F1]2,4. F2: SUM (( F2 Å K ) Ä W ) º 2 , dữ liệu nhúng là 010, không cần phải thay đổi F2. F3: SUM (( F3 Å K ) Ä W ) º 2 , dữ liệu nhúng là 000, ta phải tăng tổng thêm 6 bằng cách lấy phần bù của [F3]4,4. F4: SUM (( F4 Å K ) Ä W ) º 4 , dữ liệu nhúng là 001, ta phải tăng tổng thêm 5 bằng cách lấy phần bù của [F4]2,2 và [F4]3,2. Vì không có một bộ chỉ số nào trong F4 để lấy phần bù và tăng 5, nên ta chọn h=2. S10 = S2b = {(2,2)} và S-5= S3= {(1,3),(2,1),(3,2),(3,4)}. Hình 9 Ảnh F, ma trận khóa K vàma trận trọng lượngW. Hình 10 Ảnh F sau khi thực hiện toán tử XOR và ảnh chứa bị thay đổi dữ liệu 2.3.2.2 .2.3 Phân tích khả năng che dấu và kết quả thực nghiệm: Chi phí và khả năng bị phát hiện: Giả sử là chi tiết thuật toán, ma trận F, giá trị r, kích thước khối m × n và ma trận F¢đã bị phát hiện, thì cũng khó có khả năng xảy ra trường hợp dữ liệu bị rút trích vì có 2mn cách chọn K và C2mn 1 *(2r - 1)!*(2r - 1) mn- 2 - 1 cách chọn W. Giả sử cả một phần B đã bị giải mã, và có phương pháp để làm giảm khả năng chọn lựa W. Nếu người trung gian đã tìm được khối Fi đã bị thay đổi thành i F′ khi nhúng các bit Bi, và khối Fj đã bị thay đổi thành j F ′ khi nhúng các bit Bj thì khả năng tiếp tục phát hiện các bit khác cao. Nếu Fi = Fj, thì sự khác nhaucủa i F′ và j F ′ sẽ phản ánh mối quan hệ của trọng số tại vị trí i F′ khác Fi và j F ′ khác Fj. Giả sử Fi = i F′ và chỉ có một vị trí (a,b) trên Fj bị thay đổi, thì [W]a,b phải là Bj-Bi hay Bi-Bj mod 2r . Các giá trị của W sẽ có thể bị phát hiện, và khả năng chọn lựa W sẽ giảm xuống 2mn. Nếu W đã bị phát hiện, thì khả năng tìm ra K rất dễ xảy ra. Nếu Fi = Fi′ = Fjvà Fj′ chỉ khác Fj tại một vị trí (a,b), thì [K]a,b có thể tìm được. Nếu Bj-Bi = [K]a,b ≠2r-1, thì [Fj ⊗ K]a,b=0, nghĩa là [K]a,b = [Fj]a,b. Ngược lại, Bj-Bi = -[K]a,b ≠2r-1, thì [Fj Å K]a,b = 1 , nghĩa là [K]a,b là phần bù của [Fj]a,b. Để phát hiện dữ liệu, người trung gian phải tốn chi phí cao, vì m × n lớn, K và W được bảo mật. So sánh giữa hai phương pháp: • Ma trận F có các khối cùng kích thước: hình ảnh sau khi đã có dữ liệu được nhúng bằng phương pháp 2 lộn xộn hơn bằng phương pháp 1. Nhưng phương pháp 2 có thể chứa dữ liệu nhiều gấp 4 đến 10 lần hơn phương pháp 1. • Chất lượng hình ảnh như nhau: để hai ảnh sau khi đã nhúng dữ liệu có chất lượng bằng nhau, ta thay đổi kích thước các khối. Phương pháp 1có số bit trung bình bị thay đổi là 0.5, kích thước là 16×16, trong phưong pháp 2ta lấy kích thước của khối lớn gấp 4 lần phương pháp 1 để số bit trung bình bị thay đổi cũng bằng 0.5, kích thước 32´ 32 . Trong phương pháp 1, số bit dữ liệu tối đa được nhúng là 1, số dữ liệu được nhúng trong phương pháp 2 là êlog(322 + 1)ú= 10 bit trong mỗi khối 32×32. Phương pháp 2 có tỉ số ẩn dữ liệu tối thiểu là 10 /4 cao hơn phương pháp 1. • Số lượng dữ liệu được nhúng bằng nhau: để số lượng dữ liệu bằng nhau, kích thước các khối của hai phương pháp phải chênh lệch. Và vì phưong pháp 1 cần chọn ma trận điểm ảnh thích hợp nên số lượng ma trận thích hợp ít hơn trong phương pháp 2. 2.4 Thuật toán mã hóa AES 2.4.1 Quá trình mã hóa 2.4.1.1 Tham số, ký hiệu, thuật ngữ và hàm AddRoundKey: Phép biến đổi sử dụng trong mã hóa và giải mã, thực hiện việc cộng mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của mã khóa của chu kỳ bằng với kích thước của trạng thái. SubBytes: Phép biến đổi sử dụng trong mã hóa, thực hành việc thay thế phi tuyến từng byte trong trạng thái hiện hành thông qua bảng thay thế (S-box). InvSubBytes: Phép biến đổi sử dụng trong giải mã. Đây là phép biến đổi ngược của phép biến đổi SubBytes. MixColumns: Phép biến đổi sử dụng trong mã hóa, thực hiện thao tác trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột được xử lý độc lập. InvMixColumns: Phép biến đổi sử dụng trong giải mã. Đây là phép biến đổi ngược của phép biến đổi MixColumns. ShiftRows: Phép biến đổi sử dụng trong mã hóa, thực hiện việc dịch chuyển xoay vòng từng dòng của trạng thái hiện hành với di số tương ứng khác nhau InvShiftRows: Phép biến đổi sử dụng trong giải mã. Đây là phép biến đổi ngược của phép biến đổi ShiftRows. 2.4.1.2 Các bước thực hiện Quy trình mã hóa Rijndael sử dụng bốn phép biến đổi chính: 1. AddRoundKey: cộng () mã khóa của chu kỳ vào trạng thái hiện hành. Độ dài của mã khóa của chu kỳ bằng với kích thước của trạng thái. 2. SubBytes: thay thế phi tuyến mỗi byte trong trạng thái hiện hành thông qua bảng thay thế (S-box). 3. MixColumns: trộn thông tin của từng cột trong trạng thái hiện hành. Mỗi cột được xử lý độc lập. 4. ShiftRows: dịch chuyển xoay vòng từng dòng của trạng thái hiện hành với di số khác nhau. Mỗi phép biến đổi thao tác trên trạng thái hiện hành S. Kết quả S’ của mỗi phép biến đổi sẽ trở thành đầu vào của phép biến đổi kế tiếp trong quy trình mã hóa. Trước tiên, toàn bộ dữ liệu đầu vào được chép vào mảng trạng thái hiện hành. Sau khi thực hiện thao tác cộng mã khóa đầu tiên, mảng trạng thái sẽ được trải qua Nr = 10, 12 hay 14 chu kỳ biến đổi (tùy thuộc vào độ dài của mã khóa chính cũng như độ dài của khối được xử lý). Nr 1 chu kỳ đầu tiên là các chu kỳ biến đổi bình thường và hoàn toàn tương tự nhau, riêng chu kỳ biến đổi cuối cùng có sự khác biệt so với. Nr 1 chu kỳ trước đó. Cuối cùng, nội dung của mảng trạng thái sẽ được chép lại vào mảng chứa dữ liệu đầu ra. Quy trình mã hóa Rijndael được tóm tắt lại như sau: 1. Thực hiện thao tác AddRoundKey đầu tiên trước khi thực hiện các chu kỳ mã hóa. 2.Nr – 1 chu kỳ mã hóa bình thường: mỗi chu kỳ bao gồm bốn bước biến đổi liên tiếp nhau: SubBytes, ShiftRows, MixColumns, và AddRoundKey. 3.Thực hiện chu kỳ mã hóa cuối cùng: trong chu kỳ này thao tác MixColumns được bỏ qua. Trong thuật toán dưới đây, mảng w[] chứa bảng mã khóa mở rộng; mảng in[] và out[] lần lượt chứa dữ liệu vào và kết quả ra của thuật toán mã hóa. 2.4.1.3 Kiến trúc của thuật toán Rijndael Thuật toán Rijndael được xây dựng theo kiến trúc SPN sử dụng 16 s-box (kích thước 8 × 8) để thay thế. Trong toàn bộ quy trình mã hóa, thuật toán sử dụng chung bảng thay thế s-box cố định. Phép biến đổi tuyến tính bao gồm 2 bước: hoán vị byte và áp dụng song song bốn khối biến đổi tuyến tính (32 bit) có khả năng khuếch tán cao. Hình 3.2 thể hiện một chu kỳ mã hóa của phương pháp Rijndael. Trên thực tế, trong mỗi chu kỳ mã hóa, khóa của chu kỳ được cộng (XOR) sau thao tác biến đổi tuyến tính. Do chúng ta có thực hiện thao tác cộng khóa trước khi thực hiện chu kỳ đầu tiên nên có thể xem thuật toán Rijndael thỏa cấu trúc SPN [29]. Hình 11 Mô tả Một chu kỳ mã hóa của phương pháp Rijndael (với Nb=4) 2.4.1.4 Phép biến đổi SubBytes Thao tác biến đổi SubBytes là phép thay thế các byte phi tuyến và tác động một cách độc lập lên từng byte trong trạng thái hiện hành. Bảng thay thế (S-box) có tính khả nghịch và quá trình thay thế 1 byte x dựa vào S-box bao gồm hai bước: 1. Xác định phần tử nghịch đảo x-1 GF(28). Quy ước {00}-1 = {00}. 2. Áp dụng phép biến đổi affine (trên GF(2)) đối với x-1 (giả sử x-1 có biểu diễn nhị phân là {x7 x6 x5 x4 x3 x2 x1 x0 }): hay yi = xi x(i+4)mod 8 x(i+5)mod 8 x(i+6)mod 8 x(i+7)mod 8 Ci với ci là bit thứ i của {63}, 0 i 7. Bảng 2 Thể hiện bảng thay thế S-box được sử dụng trong phép biến đổi SubBytes ở dạng thập lục phân. Ví dụ: nếu giá trị {xy} cần thay thế là {53} thì giá trị thay thế S-box ({xy}) được xác định bằng cách lấy giá trị tại dòng 5 cột 3 của Bảng D.1. Như vậy, S-box ({xy}) = {ed}. Phép biến đổi SubBytes được thể hiện dưới dạng mã giả: 2.4.1.5 Phép biến đổi ShiftRows Trong thao tác biến đổi ShiftRows Bảng 3: Thể hiện bảng thay thế S-box được sử dụng trong phép biến đổi ShiftRows ở dạng thập lục phân mỗi dòng của trạng thái hiện hành được dịch chuyển xoay vòng đi một số vị trí. Byte Sr ,c tại dòng r cột c sẽ dịch chuyển đến cột (c - shift(r, Nb)) mod Nb hay: S’r,c= Sr,(c + shift(r, Nb)) mod Nb với 0<r<8 và 0c<Nb Giá trị di số shift(r, Nb) phụ thuộc vào chỉ số dòng r và kích thước Nb của khối dữ liệu. Bảng 4. Giá trị di số shift(r, Nb) shift(r, Nb) R 1 2 3 Nb 4 1 2 3 6 1 2 3 8 1 3 4 Phép biến đổi ShiftRows được thể hiện dưới dạng mã giả: 2.4.1.6 Phép biến đổi MixColumns Trong thao tác biến đổi MixColumns, mỗi cột của trạng thái hiện hành được biểu diễn dưới dạng đa thức s(x) có các hệ số trên GF(28). Thực hiện phép nhân S’(x) = a(x) s(x) Với a(x) = {03}x3 + {01}x2 + {01}x + {02} Thao tác này được thể hiện ở dạng ma trận như sau: Bảng 5. Thao tác MixColumns tác động lên mỗi cột của trạng thái Trong đoạn mã chương trình dưới đây, hàm FFmul(x, y) thực hiện phép nhân (trên trường GF(28)) hai phần tử x và y với nhau 2.4.1.7 Thao tác AddRoundKey Phương pháp Rijndael bao gồm nhiều chu kỳ mã hóa liên tiếp nhau, mỗi chu kỳ có một mã khóa riêng (Round Key) có cùng kích thước với khối dữ liệu đang được xử lý và được phát sinh từ mã khóa chính (Cipher Key) cho trước ban đầu. Mã khóa của chu kỳ cũng được biểu diễn bằng một ma trận gồm 4 dòng và Nb cột. Mỗi cột của trạng thái hiện hành được XOR với cột tương ứng của mã khóa của chu kỳ đang xét: [s'0,c , s'1,c , s'2,c , s'3,c ] = [s0,c , s1,c , s2,c , s3,c ] ⊕ [wround ∗Nb+c ] , với 0 ≤ c < Nb. Thao tác biến đổi ngược của AddRoundKey cũng chính là thao tác AddRoundKey. Trong đoạn chương trình dưới đây, hàm xbyte(r, w) thực hiện việc lấy byte thứ r trong từ w. Bảng 6. Thao tác AddRoundKey tác động lên mỗi cột của trạng thái Các hằng số của mỗi chu kỳ hoàn toàn độc lập với giá trị Nk và được xác định bằng Rcon[i] = (RC[i], {00}, {00}, {00}) với RC[i] ∈ GF(28) và thỏa: RC[1]=1 ({01}) RC[i] =x ({02})*(RC[i-1]) = x(i–1) 2.4.1.8 Ví dụ về quà trình mã hóa: Cho bảng S-BOX có định dang mã hexa như sau: Bảng 7. Bảng S-BOX có định dang mã hexa cho quá trình mã hóa Cho tín hiệu đầu vào và mã khóa Cipher Key là 16 Byte có Nb = 4 và Nk = 6 Tín hiệu đầu vào được sếp vào bảng như sau Thực hiện thao tác AddRoundKey Vòng mã khóa thứ nhất chỉ thực hiện phép biến đổi thao tác AddRoundKey tín hiệu đầu vào cộng với mã khóa, theo công thức như sau. [s'0,c , s'1,c , s'2,c , s'3,c ] = [s0,c , s1,c , s2,c , s3,c ] ⊕ [wround ∗Nb+c ] Ví dụ mã khóa cho ở trên là Ví dụ : 32 2b = 19 Thực hiện thao tác SubByte Thao tác biến đổi SubBytes là phép thay thế các byte phi tuyến và tác động một cách độc lập lên từng byte trong trạng thái hiện hành. Qua phép biến đổi SubByte Ví dụ: Từ tín hiệu 19 dựa và hôp S-BOX dòng 1 cột 9 là tín hiệu d4 Thực hiện thao tác ShiftRows. Mỗi dòng của trạng thái hiện hành được dịch chuyển xoay vòng đi một số vị trí. Ứng với ví dụ này thì dựa vào bảng giá trị ShiftRows thì ứng với dòng một thì không dịch, dòng 2 thi dich đi 1, dòng 3 thì dịch đi 2, dòng 4 thì dịch đi 3. Ta được như sau. Qua phép biến đổi ShiftRows Thực hiện thao tác MixColumns Trong thao tác biến đổi MixColumns, mỗi cột của trạng thái hiện hành được biểu diễn dưới dạng đa thức s(x) có các hệ số trên GF(28). Thực hiện phép nhân S’(x) = a(x) s(x) Với a(x) = {03}x3 + {01}x2 + {01}x + {02} Qua phép biến đổi MixColums. = Hay: = ({02}—) Å({03}—) Å ({01}—) Å ({01}—) = ({01}—) Å({02}—) Å ({03}—) Å ({01}—) = ({01}—) Å({01}—) Å ({02}—) Å ({03}—) = ({03}—) Å({01}—) Å ({01}—) Å ({02}—) Thử tính toán ở cột đầu tiên: = ({02}—d4) Å({03}—bf) Å ({01}—5d) Å ({01}—30) = ? Áp dụng phép tính nhân xtime(): {02}—d4 = ? Ta có: d4 (H) = 11010100(B) Dịch trái: 10101000 XOR với giá trị 1b(H): 10110011(B) Vậy {02}}—d4 = b3(H) = 10110011(B) Với cách tính tương tự ta được: {03}—bf = da(H) = 11011010(B) {01}—5d = 5d(H) = 101.1101(B) {01}—30 = 30(H) = 11.0000(B) XOR 4 kết quả này ta được: = 04(H) Tương tự: = ({01}—) Å({02}—) Å ({03}—) Å ({01}—) = 66 = ({01}—) Å({01}—) Å ({02}—) Å ({03}—) = 81 = ({03}—) Å({01}—) Å ({01}—) Å ({02}—) = e5 Chúng ta thực hiện tương tự như trên 9 vòng biến đổi riêng vòng cuối vòng số 10 thì chúng ta không thực hiện thao tác MixColumns. Đây là kết quả tổng hợp. 2.4.2. Quá trình tạo khóa 2.4.2.1 Chiều dài yêu cầu của khóa Thuật toán AES sẽ hỗ trợ ít nhất một trong ba chiều dài khóa sau đây: 128, 192 và 256 bit (tương ứng Nk = 4, 6, 8). Việc triển khai có thể sử dụng tùy chọn hai hoặc ba loại chiều dài khóa, cái mà có thể thúc đẩy khả năng tương tác của việc triển khai thuật toán. 2.4.2.2 Sự hạn chế của khóa Không có các khóa yếu hoặc bán yếu được xác định cho thuật toán AES, và không có sự hạn chế nào về sự lựa chọn khóa. 2.4.2.3 Các tham số của khóa: chiều dài khóa, kích thước block và số vòng Tiêu chuẩn này xác định một cách rõ ràng các giá trị cho phép đối với chiều dài khóa (Nk từ), kích thước khối (Nb) và số vòng (Nr) – xem hình minh họa. Tuy nhiên, việc xác nhận một lần nữa của tiêu chuẩn này trong tương lai có thể bao gồm các thay đổi hoặc sự bổ sung giá trị cho phép đối với những tham số. Do đó, thực hiện có thể chọn để thiết kế việc triển khai AES với sự linh hoạt trong tương lai. Bảng 8 Minh họa các thông số của khóa 2.4.2.4 Gợi ý việc thực hiện dựa trên các nền tảng khác nhau Sự biến đổi việc thực hiện là có thể, trong nhiều trường hợp, việc cung cấp hiệu suất hay các lợi thế khác. Với cùng một khóa ngõ vào (dạng thô hoặc bản mã), bất kỳ thực hiện nào sao cho ngõ ra là như nhau (bản mã hoặc thô) chẳng hạn như thuật toán trong tiêu chuẩn này là việc thực hiện có thể chấp nhận được của AES. 2.4.2.5 Mảng của các byte a) Mảng của các byte Cho các từ khóa a0a1a2….a15 (giả sử sử dụng khóa 128 bit, với ai là một từ khóa có 8 bit được định dạng dưới dạng số hexa) Các byte và bit được chia ra từ chuỗi 128 bit ngõ vào input0 input1 input2 ….. input126 input127 với a0 = {input0, input1, …..,input7}; a1 = {input8, input9, …..,input15}; . . . a15 = {input120, input121, …..,input127}. Các bit trong mỗi byte được sắp xếp và đánh số như sau: Bảng 9 Minh họa việc sắp xếp các bit trong mỗi byte b) Trạng thái Thuật toán AES thực hiện dựa trên một mảng hai chiều của các byte gọi là trạng thái (State). State bao gồm bốn hàng của các byte, mỗi hàng chứa Nb byte, với Nb là chiều dài block (Nb = số bit trong khóa mã hóa/32 hay Nb là số hàng trong mảng State). Các phần tử trong mảng State được ký hiệu là s, mỗi byte có hai chỉ số là số hàng r (0 <= r < 4) và số cột c (0 <= c < Nb), khi đó mỗi symbol trong mảng State được ký hiệu như sau: sr,c hoặc s[r,c]. Ví dụ: Đối với chiều dài khóa là 128 thì 0<=r<4, 0<=c<4. Bảng 10 Minh họa mảng của các trạng thái Khi đó: s[r,c] = in[r + 4c] với 0<=r<4, 0<=c<4 out[r + 4c] = s[r,c] với 0<=r<4, 0<=c<4 Bốn byte trong mỗi cột của mảng State có dạnh từ 32bit, do đó hàng thứ r cho biết chỉ số của các byte trong mỗi từ. Như vậy mảng state có thể được xem như là mảng một chiều của các từ 32bit (ma trận cột) w0, w1, w2, w3, do đó số cột c cho biết chỉ số của mảng này. Từ hình ở trên, ta có thể thấy được: w0 = s0,0 s1,0 s2,0 s3,0 w1 = s0,1 s1,1 s2,1 s3,1 w2 = s0,2 s1,2 s2,2 s3,2 w3 = s0,3 s1,3 s2,3 s3,3 Trong đó: + Nk: Chiều dài khóa (là số cột của mảng State ) + Nb: Kích thước của block + Nr: Số vòng (Khóa 128 bit Nr =10, khóa 192 bit Nr = 12, khóa 256 bit Nr = 14) c) Mở rộng khóa: Thuật toán AES dùng khóa mã hóa K và thực hiện việc mở rộng khóa K để tạo ra một tổ hợp khóa. Việc mở rộng khóa sẽ tạo ra tổng cộng Nb(Nr + 1) từ khóa. Thuật toán dùng Nb từ khóa khởi tạo đầu tiên, và mỗi vòng Nr cũng yêu cầu Nb từ khóa. Kết quả là cơ chế tạo khóa tạo ra một mảng tuyến tính các từ khóa 4 byte, và được kí hiệu là [wi], với i trong khoảng 0 <= i < Nb(Nr + 1). Một số bước trong quá trình tạo khóa như sau: + RotWord(): Lấy một từ khóa dạng [a0, a1, a2, a3] ngõ vào, thực hiện dịch vòng từ khóa này để tạo ra từ khóa [a1, a2, a3, a0]. + SubWord(): Là hàm thực hiện lấy từ khóa 4 byte ngõ vào, sau đó so với bảng S-box (bảng 6)để tạo ra một từ khóa 4 byte mới + Rcon[i]: chứa các giá trị được cho dưới dạng [xi-1, {00}, {00}, {00}], với x được kí hiệu dưới dạng {02}. Thuật toán mở rộng khóa như sau: Ví dụ minh họa thuật toán mở rộng khóa (giả sử chiều dài khóa là 128bit): Giả sử khóa K là: 2b7e151628aed2a6abf7158809cf4f3c Nk=4, khi đó ta có 4 từ khóa khởi tạo như sau: w0 = 2b7e1516 w1 = 28aed2a6 w2 = abf71588 w3 = 09cf4f3c Như vậy quá trình mở rộng khóa đã tạo ra được tập hợp gồm 44 khóa như trên (các từ khóa nằm trong cột cuối cùng của bảng trên). Tập hợp khóa này sẽ tham gia vào quá trình mã hóa và giải mã dùng kỹ thuật AES. Giải mã ASE 2.4.3.1 Giải mã: Bao gồm các bước: InvShiftRows InvSubBytes InvMixColumns AddRoundkey InvShiftrows Bước này là nghịch đảo của ShiftRows. Các byte trong 3 dòng cuối của bảng State được dịch vòng. Tại dòng đầu tiên, r = 0, không dịch. 3 dòng ở giữa được dịch vòng Nb – shift(r,Nb) byte, giá trị dịch shift(r,Nb) phụ thuộc vào số dòng. Cụ thể, biến đổi InvShiftRows thực hiện như sau: = 0< r < 4 và 0 ≤ c < Nb Bảng 11: Thể hiện bảng thay thế S-box được sử dụng trong phép biến đổi InvShiftrows ở dạng thập lục phân. InvSubBytes Bước này là đảo ngược của biến đổi SubBytes, trong đó bảng S-box đảo được áp ụng cho từng byte trong bảng State. Bảng S-box bảng 6 này thu được bằng cách đảo ngược biến đổi afin bằng cách lấy đảo ngược phép nhân trong trường GF(28). InvMixColumns Bước này là đảo ngược của biến đổi MixColumns. Hoạt động trên cột theo cột, xem mỗi cột là một cụm bốn đa thức. Các cột được xem là một đa thức trên trường GF(28) và được nhân modulo (x4 + 1) với một đa thức cố định a-1(x), cho bởi a-1(x) = {0b}x3 + {0d}x2 + {09}x + {0e} Được viết lại dưới dạng nhân ma trận s’(x) = a-1(x)Us(x) = 0 ≤ c < Nb Kết quả của phép nhân này, bốn byte trong cột được thay thế bởi: = ({0e}—) Å({0b}—) Å ({0d}—) Å ({09}—) = ({09}—) Å({0e}—) Å ({0b}—) Å ({0d}—) = ({0d}—) Å({09}—) Å ({0e}—) Å ({0b}—) = ({0b}—) Å({0d}—) Å ({09}—) Å ({0e}—) Đảo ngược biến đổi AddRoundKey Bước này đơn giản chỉ là phép tính XOR kết quả thu được tại bước 3 với khóa được tạo ra. Ví dụ mã hóa AES Sử dụng khóa có chiều dài 128 bits, Nb = 4, Nk = 4. Bit vào = 32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34 Khóa = 2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c Để rõ hơn, ta xét phép tính lần thứ nhất: Sau khi Addroundkeys ở bước trước, tại bước này bảng State sẽ là: Bước 1 – SubBytes Từng giá trị được biến đổi thành giá trị trong bảng S-box, kết quả sau khi kết thúc bước này sẽ là: Bước 2 - ShiftRows Bước 3 – MixColumn Riêng ở bước này, phép toán được tính tương đối phức tạp. Để tính các giá trị s’, ta nhân các giá trị s với một đa thức cố định a(x). a(x) = {03}x2 + {02}x2 + {01}x + {01} Viết dưới dạng ma trận như sau: = Hay: = ({02}—) Å({03}—) Å ({01}—) Å ({01}—) = ({01}—) Å({02}—) Å ({03}—) Å ({01}—) = ({01}—) Å({01}—) Å ({02}—) Å ({03}—) = ({03}—) Å({01}—) Å ({01}—) Å ({02}—) Thử tính toán ở cột đầu tiên: = ({02}—d4) Å({03}—bf) Å ({01}—5d) Å ({01}—30) = ? Áp dụng phép tính nhân xtime(): {02}—d4 = ? Ta có: d4 (H) = 11010100(B) Dịch trái: 10101000 XOR với giá trị 1b(H): 10110011(B) Vậy {02}}—d4 = b3(H) = 10110011(B) Với cách tính tương tự ta được: {03}—bf = da(H) = 11011010(B) {01}—5d = 5d(H) = 101.1101(B) {01}—30 = 30(H) = 11.0000(B) XOR 4 kết quả này ta được: = 04(H) Tương tự: = ({01}—) Å({02}—) Å ({03}—) Å ({01}—) = 66 = ({01}—) Å({01}—) Å ({02}—) Å ({03}—) = 81 = ({03}—) Å({01}—) Å ({01}—) Å ({02}—) = e5 Lần lượt tính toán các cột còn lại ta được kết quả như sau: Bước 4 – AddRoundKeys Bước này chỉ đơn giản là XOR kết quả tại bước 3 với khóa đã tạo ra được: Với chiều dài khóa là 128 bits, ta sẽ tạo ra được 10 khóa, vì vậy quá trình thực hiện mã hóa sẽ phải trải qua 10 giai đoạn tất cả. Chương III.ỨNG DỤNG DATA HIDING KẾP HỢP VỚI Mà HÓA 3.1 Mã hóa Thuật toán mã hóa gồm hai giai đoạn: mã hóa và ẩn dữ liệu. Gọi Yi = Ek(Xi) là khối dữ liệu sau khi được mã hóa, với Xi là dữ liệu gốc ban đầu, Ek() là hàm mã hóa với khóa K. Khi đó Ywi = DHk(Yi) là khối dữ liệu sau khi được mã hóa và ẩn dữ liệu được truyền trên mạng. Trong đó DHk() là hàm ẩn dữ liệu với khóa K. Sơ đồ khối của quá trình này như sau: Hình 12 Sơ đồ mã hóa 3.2 Giải mã Quá trình giải mã cũng trải qua hai giai đoạn là rút trích dữ liệu ẩn, sau khi rút trích dữ liệu ẩn, ta có được thông tin của dữ liệu ẩn này. Sau đó, dữ liệu ban đầu (dữ liệu được truyền trên mạng) sẽ tiếp tục được giải mã và xóa dữ liệu ẩn. Khi đó, dữ liệu gốc ban đầu được khôi phục. Zi = DH-1k(Ywi) với Zi là thông tin ẩn và Xi = E-1(Ywi) Sơ đồ khối của quá trình giải mã như sau: Hình 13 Sơ đồ giải mã 3.3 Ví dụ minh họa Hình 14 thể hiện sự thay đổi ảnh của quá trình ẩn dử liệu dung mà hóa AES Ta nhận thấy: ở hình a) là ảnh gốc ban đầu, sau khi được mã hóa AES hình a) sẽ trở thành như hình b), sau đó hình b) được chèn dữ liệu ẩn ta có hình c). Như vậy khi so sánh giữa hình b) và c) bằng mắt thường ta không thể phân biệt hay nhận biết được đã có dữ liệu được ẩn vào hình, nhưng khi dùng công cụ để rút trích dữ liệu ẩn, ta có được như hình d). Các chấm trắng ở hình d) chính là sự khác biệt giữa hình b) và hình c) hay đó chính là thông tin mà ta đã ẩn vào hình b). Hình 15 thể hiện sự thay đổi ảnh a: quá trình rút trích dử liệu và giải mã.b Ảnh sau khi giải mã và xóa dữ liệu ẩn trên ảnh Hình a) là ảnh sau khi được rút trích dữ liệu ẩn và giải mã (lúc này ta biết được thông tin dữ liệu ẩn), hình b) là ảnh sau khi giải mã và xóa dữ liệu ẩn trên ảnh. Khi đó ta có được ảnh gốc ban đầu. KẾT LUẬN 1. Đánh giá: Sau một khoảng thời gian nỗ lực nghiên cứu cùng với sự hướng dẫn tận tình của cá thầy cô giáo trong khoa chúng em đã bản hoàn thành được các yêu cầu cầu đề tài. Đó là giấu được thông tin vào trong một file ảnh tỉnhvà giấu thông tin trong văn bản có ẩn chứa thông tin trong đó. Sử dụng kỹ thuật mã hóa AES trong ẩn thông tin Các thông tin được giấu là một đoạn thông điệp, một tệp văn bản và một file ảnh cũng có thể được giấu trong một file ảnh. 2. Phát triển và hạn chế của đề tài: Chương trình đã làm được những công viẹc trên và hướng của chúng em mong muốn đó là tất cả nhúng ý tưởng mà ban đầu chúng em đặt ra và có kế hoạch thực hiện nhưng chưa làm được chúng em sẽ phát triển trong đề tài tiểu luận, như giấu thông tin trong một file audio hay một file video. Hy vọng chúng em sẽ được các thầy, cô chỉ bảo để phát triển tốt đề tài trong lần tới. Chúng em xin chân thành cảm ơn! TÀI LIỆU THAM KHẢO [1] . A Reversible Data Hiding Method for Encrypted Images_ung dung W. Puech, M. Chaumont and O. StraussLIRMM Laboratory, UMR CNRS 5506, University of Montpellier II161, rue Ada, 34392 MONTPELLIER CEDEX 05, FRANCE [2]. ADVANCED ENCRYPTION STANDARD (AES) November 26, 2001 [3]. Techniques for Data Hiding-p by W. BenderD. Gruhl N. Morimoto A. Lu

Các file đính kèm theo tài liệu này:

  • docCong nghe giau tin hieu.doc