(Luận văn thạc sĩ) nghiên cứu phối hợp các phương pháp nén thông tin, mã hóa thông tin, giấu thông tin để đảm bảo an toàn thông tin trong môi trường đa phương tiện
Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 93 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
93
Dung lượng
1,67 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ LÊ MẠNH THẮNG NGHIÊN CỨU PHỐI HỢP CÁC PHƢƠNG PHÁP NÉN THƠNG TIN, MÃ HỐ THƠNG TIN, GIẤU THƠNG TIN ĐỂ XÂY DỰNG ỨNG DỤNG GIẤU TIN TRONG MÔI TRƢỜNG ĐA PHƢƠNG TIỆN LUẬN VĂN THẠC SĨ Hà Nội - 2009 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ LÊ MẠNH THẮNG NGHIÊN CỨU PHỐI HỢP CÁC PHƢƠNG PHÁP NÉN THƠNG TIN, MÃ HỐ THƠNG TIN, GIẤU THÔNG TIN ĐỂ XÂY DỰNG ỨNG DỤNG GIẤU TIN TRONG MƠI TRƢỜNG ĐA PHƢƠNG TIỆN Ngành: Cơng nghệ Thông tin Chuyên ngành: Công nghệ phần mềm Mã số: 60 48 10 LUẬN VĂN THẠC SĨ NGƯỜI HƯỚNG DẪN KHOA HỌC TS Hồ Văn Hƣơng Hà Nội - 2009 LỜI CAM ĐOAN Tôi xin cam đoan kết đạt đƣợc luận văn sản phẩm riêng cá nhân, không chép lại ngƣời khác Trong toàn nội dung luận văn, điều đƣợc trình bày cá nhân đƣợc tổng hợp từ nhiều nguồn tài liệu Tất tài liệu tham khảo có xuất xứ rõ ràng đƣợc trích dẫn hợp pháp Tơi xin hồn tồn chịu trách nhiệm chịu hình thức kỷ luật theo quy định cho lời cam đoan Hà Nội, ngày tháng 11 năm 2009 Lê Mạnh Thắng LỜI CẢM ƠN Lời đầu tiên, xin bày tỏ lòng biết ơn sâu sắc đến TS Hồ Văn Hƣơng – Ban yếu Chính phủ, ngƣời tận tình hƣớng dẫn, bảo giúp đỡ suốt q trình nghiên cứu hồn thành luận văn Tôi xin chân thành cảm ơn thầy cô giáo trƣờng Đại học Công nghệ - ĐHQG Hà Nội giảng dạy cung cấp cho kiến thức bổ ích thời gian học cao học, giúp tơi có tảng tri thức để phục vụ nghiên cứu khoa học sau Tôi xin cảm ơn Lãnh đạo đồng nghiệp đơn vị tạo điều kiện giúp đỡ suốt trình nghiên cứu hồn thành luận văn Tơi xin bày tỏ lịng cảm ơn đến gia đình bạn bè, ngƣời quan tâm, động viên khuyến khích tơi Hà Nội, ngày tháng 11 năm 2009 Học viên Lê Mạnh Thắng MỤC LỤC LỜI CAM ĐOAN LỜI CẢM ƠN MỤC LỤC DANH MỤC CÁC KÝ HIỆU VIẾT TẮT DANH MỤC CÁC HÌNH VẼ MỞ ĐẦU 10 CHƢƠNG 12 TỔNG QUAN VỀ NÉN, MÃ HOÁ VÀ GIẤU TIN MẬT 12 1.1 Tổng quan nén thông tin 12 1.1.1 Nhận thức chung 12 1.1.1.1 Một số khái niệm 12 1.1.1.2 Các thông số quan trọng nén 12 1.1.2 Nguyên tắc nén liệu 13 1.1.3 Phân loại phƣơng pháp nén 15 1.1.3.1 Theo nguyên lý nén 15 1.1.3.2 Theo cách thức thực nén 16 1.1.3.3 Phân loại dựa vào triết lý mã hoá 16 1.1.3.4 Cách phân loại Anil.K.Jain 16 1.1.4 Các kỹ thuật nén thông tin 16 1.1.4.1 Nén không mát thông tin 16 1.1.4.2 Nén có mát thông tin 17 1.1.5 Ứng dụng nén thông tin 17 1.2 Mã hố thơng tin 18 1.2.1 Sơ lƣợc lịch sử mật mã học 18 1.2.2 Các khái niệm 19 1.2.2.1 Khái niệm mật mã 19 1.2.2.2 Khái niệm mã hố thơng tin 19 1.2.3 Phân loại hệ mật mã 20 1.2.3.1 Hệ mã hố khố bí mật 20 1.2.3.2 Hệ mã hố khố cơng khai 21 1.2.3.3 Kết hợp hệ mã hố khố bí mật hệ mã hố khố cơng khai 23 1.3 Sơ lƣợc giấu tin mật 24 1.3.1 Các khái niệm 24 1.3.1.1 Khái niệm giấu tin mật 24 1.3.1.2 Các thành phần hệ giấu tin mật 25 1.3.2 Tính chất giấu tin mật 26 1.3.3 Ứng dụng giấu tin mật 27 1.3.3.1 Liên lạc bí mật 27 1.3.3.2 Bảo vệ quyền 27 1.3.4 Kỹ thuật công hệ giấu tin mật 28 1.4 Kết chƣơng 29 CHƢƠNG 30 MÔI TRƢỜNG ĐA PHƢƠNG TIỆN VÀ KHẢ NĂNG GIẤU TIN 30 2.1 Âm số 30 2.1.1 Tính chất tín hiệu âm 30 2.1.2 Biểu diễn âm số 30 2.1.3 Nén âm 33 2.1.3.1 Lƣợng tử hóa phi tuyến 33 2.1.3.2 Mã hóa dự báo (Predictive Coding) 33 2.1.3.3 Kỹ thuật nén sử dụng tính chất lọc (masking): Âm MPEG 34 2.1.4 Giấu tin mật âm số 35 2.2 Ảnh số 37 2.2.1 Biểu diễn ảnh số 37 2.2.2 Các tham số ảnh số 38 2.2.3 Nén ảnh 38 2.2.4 Giấu tin mật ảnh số 41 2.2.4.1 Giấu tin mật ảnh đen trắng 41 2.2.4.2 Giấu tin ảnh màu 42 2.3 Video số 45 2.3.1 Biểu diễn video số 45 2.3.2 Nén video 45 2.3.2.1 Lấy mẫu màu 45 2.3.2.2 Ƣớc lƣợng bù chuyển động 46 2.3.2.3 MPEG 46 2.3.2.4 Các chuẩn khác 50 2.3.3 Giấu tin video số 50 2.4 Kết chƣơng 50 CHƢƠNG 52 PHỐI HỢP CÁC PHƢƠNG PHÁP NÉN, MÃ HOÁ VÀ GIẤU TIN ĐỂ XÂY DỰNG ỨNG DỤNG LIÊN LẠC BÍ MẬT 52 3.1 Vì phải kết hợp nén thơng tin, mã hố thơng tin giấu tin mật 52 3.2 Tình hình nghiên cứu, ứng dụng giấu tin mật 53 3.2.1 Một số kỹ thuật phần mềm giấu tin mật thị trƣờng 53 3.2.2 Giấu tin mật nhu cầu liên lạc bí mật cơng tác An ninh Quốc phịng Việt Nam 55 3.3 Giải pháp đề xuất 56 3.3.1 Mục tiêu, yêu cầu 56 3.3.2 Giải pháp 57 3.4 Xây dựng cài đặt ứng dụng 59 3.4.1 Yêu cầu xây dựng 59 3.4.2 Lựa chọn giải pháp kỹ thuật cho ứng dụng 60 3.4.2.1 Lựa chọn môi trƣờng phƣơng tiện truyền 60 3.4.2.2 Xây dựng sở liệu vật mang 60 3.4.2.3 Lựa chọn kỹ thuật nén 60 3.4.2.4 Lựa chọn phƣơng pháp mã hoá 60 3.4.2.5 Lựa chọn giải thuật giấu tin 61 3.4.2.6 Lựa chọn môi trƣờng xây dựng 61 3.4.3 Thiết kế cài đặt phần mềm 63 3.4.4 Kết xây dựng 70 3.4.5 Giới hạn cải thiện tƣơng lai: 71 3.5 Kết chƣơng 72 KẾT LUẬN 73 TÀI LIỆU THAM KHẢO 74 PHỤ LỤC 76 DANH MỤC CÁC KÝ HIỆU VIẾT TẮT VIẾT TẮT TỪ GỐC NGHĨA TIẾNG VIỆT 3-DES Triple Data Encrytion Standard Áp dụng giải thuật DES lần cho khối liệu ADC Analog to Digital Converter Chuyển đổi từ tín hiệu tƣơng tự sang tín hiệu số AES Advanced Encryption Standard Hệ mật mã tiên tiến DAC Digital to Analog Converter Bộ chuyển đổi từ tín hiệu số sang tín hiệu tƣơng tự DCT Discrete Cosine Transform Biến đổi Côsi rời rạc DES Data Encryption Standard Hệ mật mã chuẩn DPCM Differential pulse code modulation Điều xung mã vi phân ECC Elliptic curve cryptography Hệ mã hóa đƣờng Elliptic HAS Human Auditory System Hệ thơng thính giác ngƣời HVS Human Vision System Hệ thống thị giác ngƣời JPEG Joint Photographic Experts Group Ảnh nén có mát thơng tin LZ77, LZ78 Abraham Lempel, Jacob Ziv Các thuật tốn nén khơng mát thông tin Abraham Lempel, Jacob Ziv đề xuất năm 1977 1978 LZW Lempel – Zip, Welch Một phƣơng pháp nén đƣợc phát minh Lempel - Zip Welch MNP5 Microcom Network Protocol Kỹ thuật nén sử dụng cho modem PCM Pulse-code modulation Điều biên mã xung QAM Quadrature Amplitude Modulation Điều chế biên độ trực giao RLC Run Length Coding Mã hóa loạt dài RLE Run Length Encoding Mã hóa loạt dài RSA Ron Rivest, Adi Shamir, Len Adleman Thuật tốn mã hóa khóa cơng khai tác giả Ron Rivest, Adi Shamir, Adleman đề xuất Len DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ Hình vẽ Hình Hình Hình Hình Hình Hình Hình Hình Hình Hình 10 Hình 11 Hình 12 Hình 13 Hình 14 Hình 15 Hình 16 Hình 17 Hình 18 Hình 19 Hình 20 Hình 21 Hình 22 Hình 23 Hình 24 Hình 25 Hình 26 Chú thích Q trình nén giải nén thơng tin Q trình mã hóa giải mã Mơ hình hế thống mã hố khố bí mật Mơ hình hệ thống mã hố với khố cơng khai Quy trình trao đổi khố bí mật sử dụng hệ mã hố khố cơng khai Phân cấp lĩnh vực nghiên cứu ngành mật mã học Các nhánh giấu tin Sơ đồ chung hệ giấu tin mật Cân nhắc chất lƣợng, dung lƣợng tính bền vững Sóng âm Biểu diễn âm số Các bƣớc lƣợng tử hoá Lƣợng tử hoá phi tuyến Mã hoá dự báo Lƣợc đồ giấu tin phía ngƣời gửi Lƣợc đồ tách tin phía ngƣời nhận Sơ đồ phân cấp lớp giải thuật mã hoá khố bí mật NET Framework Sơ đồ phân cấp lớp giải thuật mã hố khố cơng khai NET Framework Sơ đồ tính tốn hiệu nhúng vật mang Sơ đồ giấu tin mật theo giải thuật F5 Giao diện phần mềm Tạo ngẫu nhiên cặp khóa cơng khai/bí mật Sơ đồ khối q trình giấu tin theo giải thuật F5 Vật mang tốt đƣợc lựa chọn Tách tin mật từ vật mang tin Bảng kết thực nghiệm 10 MỞ ĐẦU Cuộc cách mạng thông tin kỹ thuật số đem lại thay đổi sâu sắc cho xã hội sống ngƣời Bên cạnh thuận lợi mà thông tin kỹ thuật số mang lại nảy sinh thách thức hội cho trình đổi Sự đời phần mềm có tính mạnh, thiết bị nhƣ máy ảnh kỹ thuật số, máy quét chất lƣợng cao, máy in, máy ghi âm kỹ thuật số…đã giúp ngƣời dùng sáng tạo, xử lý thƣởng thức liệu đa phƣơng tiện Mạng Internet toàn cầu trở thành xã hội ảo, nơi diễn trình trao đổi thơng tin lĩnh vực trị, qn sự, quốc phịng, kinh tế, thƣơng mại…Và mơi trƣờng mở tiện nghi nhƣ xuất vấn nạn, tiêu cực cần đến giải pháp hữu hiệu cho vấn đề an tồn thơng tin nhƣ nạn ăn cắp quyền, nạn xuyên tạc thông tin, truy nhập thông tin trái phép Nhiều phƣơng pháp bảo vệ thông tin đƣợc đƣa phƣơng pháp dùng mật mã học giải pháp đƣợc ứng dụng rộng rãi Các hệ mật mã đƣợc phát triển nhanh chóng đƣợc ứng dụng phổ biến tận ngày Sử dụng hệ này, thông tin ban đầu đƣợc mã hố thành ký hiệu vơ nghĩa, sau đƣợc lấy lại thơng qua việc giải mã nhờ khố hệ mã Đã có nhiều hệ mã phức tạp đƣợc sử dụng, bao gồm hệ mã hóa khóa đối xứng nhƣ DES, 3-DES, AES, hệ mã hóa khóa cơng khai nhƣ RSA Phƣơng pháp mật mã hoá đƣợc chứng minh hiệu có nhiều ứng dụng thực tiễn Một phƣơng pháp khác đƣợc nghiên cứu ứng dụng mạnh mẽ nhiều nƣớc giới phƣơng pháp giấu tin mật Trong phƣơng pháp mã hoá nhằm bảo vệ nội dung thơng tin phƣơng pháp giấu tin mật lại che giấu có mặt thông tin cách giấu thông tin vào thông tin khác Đây phƣơng pháp phức tạp, đƣợc xem nhƣ cơng nghệ chìa khố cho vấn đề bảo vệ quyền, nhận thực thông tin kiểm sốt truy cập…ứng dụng an tồn bảo mật thông tin Nhiều kỹ thuật giấu tin mật đƣợc nghiên cứu ứng dụng nhiều định dạng đa phƣơng tiện khác nhƣ âm số, ảnh số video số Có thể nói, phƣơng pháp mã hóa phƣơng pháp giấu tin mật có ƣu, nhƣợc điểm định Trên thực tế, ngƣời ta áp dụng hai phƣơng pháp để giúp cho việc đảm bảo an tồn thơng tin trao đổi Để tăng dung lƣợng thông tin đƣợc trao đổi, ngƣời ta thƣờng kết hợp thêm kỹ thuật nén thông tin Trong phạm vi luận văn này, tập trung nghiên cứu số nội dung kỹ thuật nén thông tin, mã hố thơng tin, giấu tin mật liệu đa phƣơng tiện, sở nghiên cứu phối hợp phƣơng pháp để xây dựng ứng dụng giúp cho việc đảm bảo an tồn trao đổi thơng tin mạng máy tính, đáp ứng nhu cầu liên lạc bí mật ngày tăng nay, đặc biệt cho lĩnh vực quân sự, an ninh quốc phòng Ngồi ra, nhằm tăng tính thực tế cho ứng dụng, đƣa ý tƣởng sử dụng sở liệu vật mang nhằm chọn vật mang ―phù hợp nhất‖ cho việc chứa thông tin mật cần giấu 79 } return null; } catch (Exception ex) { System.Windows.Forms.MessageBox.Show("ERROR: \n" + ex.Message); return null; } } Trong đó: khoá key vecto ban đầu đƣợc lấy ngẫu nhiên Đoạn xử lý khóa AES nhƣ sau: // Doan xu ly khoa AES byte[] key = new byte[16]; byte[] iv = new byte[16]; //Sinh khoa va vecto ban dau ngau nhien //RNGCryptoServiceProvider is an implementation of a random number generator RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); rng.GetBytes(key); rng.GetBytes(iv); Nội dung thông điệp đƣợc mã hoá theo AES với khoá key vecto ban đầu iv private byte[] EncryptData(byte[] dataToEncrypt, byte[] rijnKey, byte[] rijnIV) { RijndaelManaged rijn = new RijndaelManaged(); //Get an encryptor ICryptoTransform encryptor = rijn.CreateEncryptor(rijnKey, rijnIV); //Encrypt the data MemoryStream msEncrypt = new MemoryStream(); CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); //Write all data to the crypto stream and flush it csEncrypt.Write(dataToEncrypt, 0, dataToEncrypt.Length); csEncrypt.FlushFinalBlock(); //Get encrypted array of bytes return msEncrypt.ToArray(); } Mã hoá key iv AES giải thuật RSA với khóa cơng khai crptKey // ma hoa key va iv cua AES bang giai thuat RSA try { System.IO.StreamReader streamReader = new System.IO.StreamReader(crptKey, true); System.String xmlString = streamReader.ReadToEnd(); streamReader.Close(); System.Int32 index1 = xmlString.IndexOf(""); System.Int32 index2 = xmlString.IndexOf(""); System.Int32 keySize = System.Convert.ToInt32(xmlString.Substring(index1+ 9,(index2)(index1+9)).Trim()); System.Security.Cryptography.RSACryptoServiceProvider RSAProvider = new System.Security.Cryptography.RSACryptoServiceProvider(keySize); System.Security.Cryptography.RSAParameters parameters = new System.Security.Cryptography.RSAParameters(); index1 = xmlString.IndexOf(""); index2 = xmlString.IndexOf(""); 80 System.String modulus = xmlString.Substring(index1 + 9, (index2) (index1 + 9)).Trim(); parameters.Modulus = System.Convert.FromBase64String(modulus); index1 = xmlString.IndexOf(""); index2 = xmlString.IndexOf(""); System.String exponent = xmlString.Substring(index1 + 10, (index2) (index1 + 10)).Trim(); parameters.Exponent = System.Convert.FromBase64String(exponent); RSAProvider.ImportParameters(parameters); // them phan kich thuoc khoa, khoa key va iv da ma bang RSA vao dau mang EncryptedBuf byte[] MBuf; Int16 keysize, tmpkeysize; keysize = (Int16)RSAProvider.Encrypt(key, true).Length; tmpkeysize = keysize; MBuf = new byte[EncryptedBuf.Length + + * keysize]; MBuf[1] = (byte)tmpkeysize;// lay byte thap tmpkeysize >>= 8; MBuf[0] = (byte)tmpkeysize;// lay byte cao Array.Copy(RSAProvider.Encrypt(key, true), 0, MBuf, 2, keysize); //lay key Array.Copy(RSAProvider.Encrypt(iv, true), 0, MBuf, keysize + 2, keysize);// lay iv Array.Copy(EncryptedBuf, 0, MBuf, * keysize + 2, EncryptedBuf.Length);// Tao xong thong diep theo cau truc: byte chi dai khoa, key, iv, thong diep da ma return MBuf; } catch (System.Security.Cryptography.CryptographicException CEx) { System.Windows.Forms.MessageBox.Show("ERROR: \nOne of the following has occured.\nThe cryptographic service provider cannot be acquired.\nThe length of the text being encrypted is greater than the maximum allowed length.\nThe OAEP padding is not supported on this computer.\n" + "Exact error: " + CEx.Message); } catch (System.Exception Ex) { System.Windows.Forms.MessageBox.Show("ERROR: \n" + Ex.Message); } } 4) Giấu tin theo giải thuật F5 public virtual void WriteCompressedData(System.IO.BufferedStream outStream) { int offset, i, j, r, c, a, b, temp = 0; int comp, xpos, ypos, xblockoffset, yblockoffset; float[][] inputArray; float[][] dctArray1 = new float[8][]; for (int i2 = 0; i2 < 8; i2++) { dctArray1[i2] = new float[8]; } double[][] dctArray2 = new double[8][]; for (int i3 = 0; i3 < 8; i3++) { dctArray2[i3] = new double[8]; } int[] dctArray3 = new int[8 * 8]; /* * Phương thức điều khiển việc nén ảnh * Bắt đầu từ góc trên, bên trái ảnh, nén khối 8x8 liệu toàn ảnh nén */ 81 int[] lastDCvalue = new int[JpegObj.NumberOfComponents]; int[] zeroArray = new int[64]; // initialized to hold all zeros int Width = 0, Height = 0; int nothing = 0, not; int MinBlockWidth, MinBlockHeight; // Cấu hình ban đầu MinBlockWidth MinBlockHeight thực để đảm bảo chúng bắt đầu với giá trị lớn giá trị thực chúng MinBlockWidth = ((imageWidth % != 0)?(int) (System.Math.Floor((double) imageWidth / 8.0) + 1) * 8:imageWidth); MinBlockHeight = ((imageHeight % != 0)?(int) (System.Math.Floor((double) imageHeight / 8.0) + 1) * 8:imageHeight); for (comp = 0; comp < JpegObj.NumberOfComponents; comp++) { MinBlockWidth = System.Math.Min(MinBlockWidth, JpegObj.BlockWidth[comp]); MinBlockHeight = System.Math.Min(MinBlockHeight, JpegObj.BlockHeight[comp]); } xpos = 0; // westfeld // Trước tiến hành lặp, khởi tạo hệ số coeff cho stg int shuffledIndex = 0; int coeffCount = 0; for (r = 0; r < MinBlockHeight; r++) { for (c = 0; c < MinBlockWidth; c++) { for (comp = 0; comp < JpegObj.NumberOfComponents; comp++) { for (i = 0; i < JpegObj.VsampFactor[comp]; i++) { for (j = 0; j < JpegObj.HsampFactor[comp]; j++) { coeffCount += 64; } } } } } int[] coeff = new int[coeffCount]; System.Console.Out.WriteLine("Bắt đầu lượng hoá DCT/quantisation"); System.Console.Out.WriteLine(imageWidth + " x " + imageHeight); for (r = 0; r < MinBlockHeight; r++) { for (c = 0; c < MinBlockWidth; c++) { xpos = c * 8; ypos = r * 8; for (comp = 0; comp < JpegObj.NumberOfComponents; comp++) { Width = JpegObj.BlockWidth[comp]; Height = JpegObj.BlockHeight[comp]; inputArray = (float[][]) JpegObj.Components[comp]; 82 for (i = 0; i < JpegObj.VsampFactor[comp]; i++) { for (j = 0; j < JpegObj.HsampFactor[comp]; j++) { xblockoffset = j * 8; yblockoffset = i * 8; for (a = 0; a < 8; a++) { for (b = 0; b < 8; b++) { // westfeld dirty line fixed, Jun 2000 int ia = ypos * JpegObj.VsampFactor[comp] + yblockoffset + a; int ib = xpos * JpegObj.HsampFactor[comp] + xblockoffset + b; if (imageHeight / * JpegObj.VsampFactor[comp] = 1; availableBitsToEmbed ; kBitsToEmbed |= nextBitToEmbed = coeffCount) { // dung lượng ước lượng nhỏ System.Console.Out.WriteLine("Dung lượng lãng phí."); goto embeddingLoop_brk; } shuffledIndex = permutation.getShuffled(j); if (shuffledIndex % 64 == 0) continue; // bỏ qua hệ số DC if (coeff[shuffledIndex] == 0) continue; // bỏ qua giá trị 87 codeWord[i++] = shuffledIndex; } endOfN = j; hash = 0; for (i = 0; i < n; i++) { if (coeff[codeWord[i]] > 0) extractedBit = coeff[codeWord[i]] & 1; else extractedBit = (coeff[codeWord[i]] & 1); if (extractedBit == 1) hash ^= i + 1; } i = hash ^ kBitsToEmbed; if (i == 0) break; // nhúng mà khơng có thay đổi i ; if (coeff[codeWord[i]] > 0) coeff[codeWord[i]] ; else coeff[codeWord[i]]++; _changed++; if (coeff[codeWord[i]] == 0) _thrown++; } while (coeff[codeWord[i]] == 0); startOfN = endOfN; } while (!isLastByte); embeddingLoop_brk: ; } else { // Mã mặc định // Vịng lặp nhúng Nó hoạt động dịng hốn vị hệ số for (i = 0; i < coeffCount; i++) { shuffledIndex = permutation.getShuffled(i); if (shuffledIndex % 64 == 0) continue; // bỏ qua hệ số DC if (coeff[shuffledIndex] == 0) continue; // bỏ qua hệ số _examined++; if (coeff[shuffledIndex] > 0) { if ((coeff[shuffledIndex] & 1) != nextBitToEmbed) { coeff[shuffledIndex] ; // giảm giá trị tuyệt đối _changed++; } } else { if ((coeff[shuffledIndex] & 1) == nextBitToEmbed) { 88 coeff[shuffledIndex]++; // giảm giá trị tuyệt đối _changed++; } } if (coeff[shuffledIndex] != 0) { // Hệ số khác // Chúng ta nhúng thành công "nextBitToEmbed" // Chúng ta đọc bit để nhúng if (availableBitsToEmbed == 0) { // Nếu byte văn nhúng rỗng, nhận try { long available3; available3 = embeddedData.Length - embeddedData.Position; if ((int) available3 == 0) break; byteToEmbed = embeddedData.ReadByte(); byteToEmbed ^= random.NextByte; } catch (System.Exception e) { SupportClass.WriteStackTrace(e, Console.Error); break; } availableBitsToEmbed = 8; } nextBitToEmbed = byteToEmbed & 1; byteToEmbed >>= 1; availableBitsToEmbed ; _embedded++; } else _thrown++; } } if (_examined > 0) System.Console.Out.WriteLine(_examined + " hệ số kiểm tra"); System.Console.Out.WriteLine(_changed + " hệ số thay đổi(hiệu quả: " + (_embedded / _changed) + "." + (((_embedded * 10) / _changed) % 10) + " bits thay đổi)"); System.Console.Out.WriteLine(_thrown + " hệ số bỏ qua (tức nhận giá trị 0)"); System.Console.Out.WriteLine(_embedded + " bits (" + _embedded / + " bytes) nhúng"); } System.Console.Out.WriteLine("bat dau ma Huffman"); // Thuc hien ma hoa Huffman shuffledIndex = 0; for (r = 0; r < MinBlockHeight; r++) { for (c = 0; c < MinBlockWidth; c++) { 89 for (comp = 0; comp < JpegObj.NumberOfComponents; comp++) { for (i = 0; i < JpegObj.VsampFactor[comp]; i++) { for (j = 0; j < JpegObj.HsampFactor[comp]; j++) { Array.Copy(coeff, shuffledIndex, dctArray3, 0, 64); Huf.HuffmanBlockEncoder(outStream, dctArray3, lastDCvalue[comp], JpegObj.DCtableNumber[comp], JpegObj.ACtableNumber[comp]); lastDCvalue[comp] = dctArray3[0]; shuffledIndex += 64; } } } } } Huf.flushBuffer(outStream); System.Console.Out.WriteLine("\Ket thuc !"); } 5) Tách thông tin giấu public Extract(String filesrc,String embfilename,string pass) { embFileName = "output.txt"; embFileName = embfilename; password = "abc123"; password = pass; f = new System.IO.FileInfo(filesrc); try { carrier = new sbyte[(int)SupportClass.FileLength(f)]; System.IO.FileStream fis = new System.IO.FileStream(f.FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read); fos = new System.IO.FileStream(new System.IO.FileInfo(embFileName).FullName, System.IO.FileMode.Create); SupportClass.ReadInput(fis, carrier, 0, carrier.Length); HuffmanDecode hd = new HuffmanDecode(carrier); System.Console.Out.WriteLine("Bat dau ma Huffman"); coeff = hd.decode(); System.Console.Out.WriteLine("Bat dau hoan vi"); System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); F5Random random = new F5Random(encoding.GetBytes(password)); Permutation permutation = new Permutation(coeff.Length, random); int extractedByte = 0; int availableExtractedBits = 0; int extractedFileLength = 0; int nBytesExtracted = 0; int shuffledIndex = 0; int extractedBit; int i2; // tric xuat chieu dai thong tin 90 for (i2 = 0; availableExtractedBits < 32; i2++) { shuffledIndex = permutation.getShuffled(i2); if (shuffledIndex % 64 == 0) continue; // bo qua cac he so DC shuffledIndex = shuffledIndex - (shuffledIndex % 64) + deZigZag[shuffledIndex % 64]; if (coeff[shuffledIndex] == 0) continue; // bo qua cac gia tri zero if (coeff[shuffledIndex] > 0) extractedBit = coeff[shuffledIndex] & 1; else extractedBit = - (coeff[shuffledIndex] & 1); extractedFileLength |= extractedBit > i2) & 1) 0) extractedBit = coeff[shuffledIndex] & 1; else extractedBit = - (coeff[shuffledIndex] & 1); extractedByte |= extractedBit