示例#1
0
        public void CreateStegoFile(string inPath1, string message, string password, string inPath2)
        {
            // Mo file dau vao
            FileStream inStream = new FileStream(inPath1, FileMode.Open, FileAccess.Read);

            // kiem tra xem co phai anh bitmap 24 bits khong
            char b = (char)inStream.ReadByte();
            char m = (char)inStream.ReadByte();

            if (!(b == 'B' && m == 'M'))
            {
                throw new Exception("Khong phai la anh bitmap");
            }
            // kiem tra xem co phai la anh 24 bit hay k
            inStream.Seek(28, 0);                       // dua con tro ve vi tri byte thu 28
            byte[] temp = new byte[2];
            inStream.Read(temp, 0, 2);                  // so bit/1pixel duoc luu bang 2 byte
            Int16 nBit = BitConverter.ToInt16(temp, 0); // chuyen mang byte temp[] ve so nguyen 16 bit

            if (nBit != 24)
            {
                throw new Exception("Day khong phai la anh 24 bit");
            }
            // Doc 54 byte phan header roi dua vao trong outStream
            int offset = 54;

            inStream.Seek(0, 0);
            byte[] header = new byte[offset];
            inStream.Read(header, 0, offset);

            //viet 54 byte nay vao trong file stego ( file dau ra)
            FileStream outStream = new FileStream(inPath2, FileMode.Create, FileAccess.Write);

            outStream.Write(header, 0, offset);

            // ma hoa thong diep va mat khau thanh 1 thong diep duy nhat
            UnicodeEncoding unicode = new UnicodeEncoding();

            byte[] newMessageByte = AddMessLengthToAhead(unicode.GetBytes(message));    // them 4 byte do dai cua message vao dau cua thong diep
                                                                                        // thuc hien tron
            newMessageByte = CryptoHelper.Encrypt(newMessageByte, password);

            // thuc hien giau thong diep nay vao trong anh
            inStream.Seek(offset, 0);                              // dua con tro ve noi bat dau cua Data o vi tri thu 54 (offset=54)
            LSBHelper.Encode(inStream, newMessageByte, outStream); //thay tung bit cua thong diep vao LSB cua inStream va ghi ra outStream

            inStream.Close();                                      // dong file anh dau vao
            outStream.Close();
        }
        private void BTNGIAIMA_Click(object sender, EventArgs e)
        {
            string password = TXTMATKHAU.Text;

            // kiem tra xem dau vao co hop le khong? neu khong tao ra cac exception
            if (inPath2 == "")
            {
                MessageBox.Show("Bạn chưa chọn ảnh để giả mã");
            }

            else if (password == "")
            {
                MessageBox.Show("Bạn chưa nhập mật khẩu");
            }
            else
            {
                try
                {
                    // kiem tra xem file dau vao co phai la file Bitmap 24 bit khong?
                    FileStream inStream = new FileStream(inPath2, FileMode.Open, FileAccess.Read);
                    inStream.Seek(0, 0);    // dua con tro ve dau file
                    char b = (char)inStream.ReadByte();
                    char m = (char)inStream.ReadByte();
                    if (!(b == 'B' && m == 'M'))
                    {
                        throw new Exception("Day khong phai la file Bitmap");
                    }
                    // kiem tra xem co phai anh bitmap 24 bit khong
                    int offset = 28;
                    inStream.Seek(offset, 0);
                    byte[] temp = new byte[2];    // doc vao 2 byte
                    inStream.Read(temp, 0, 2);    // vi tri 28 va 29
                                                  // chuyen temp[] ve so nguyen 16 bit
                    Int16 numOfBit = BitConverter.ToInt16(temp, 0);
                    if (numOfBit != 24)
                    {
                        throw new Exception("Khong phai anh 24 bit");
                    }
                    // bat dau tham nhap vao phan data
                    offset = 54;
                    inStream.Seek(offset, 0);
                    byte[] bLen = new byte[4];                  // 4 byte luu tru do dai thong diep
                    bLen = LSBHelper.Decode(inStream, 4);       // cho nay khong the dung method FileStream.Read duoc,do 4 byte nay thuc chat la 32 byte trong inStream
                                                                //decrypt 4 byte nay de duoc 4 byte thuc su ban dau (do ca 4 byte nay cung duoc ma hoa boi khoa Key[128])
                    bLen = CryptoHelper.Decrypt(bLen, password);
                    int length = BitConverter.ToInt32(bLen, 0); // chuyen tu mang byte thanh so nguyen

                    // thuc hien doc ra mang thong diep an (van bi Encrypt)
                    inStream.Seek(offset + 4 * 8, 0);       // 32 byte dau tien de luu do dai cua thong diep
                    byte[] buffer = new byte[length];       // su dung mang nay de luu tru tam
                    try
                    {
                        buffer = LSBHelper.Decode(inStream, length);
                    }
                    catch { throw new Exception("Anh nay khong chua thong tin  hoac ban da nhap sai mat khau"); } // trong qua trinh trich xuat ra thong diep giau ,neu gap 1 ngoai le nao do,coi nhu trich xuat khong thanh cong ( thong thuong ngoai le phat sinh se la khong du bo nho)
                    byte[] realHidenMessage = new byte[4 + buffer.Length];
                    realHidenMessage = ConcatTwoByteArray(bLen, buffer);                                          // them 4 byte vao dau de tien cho viec Decrypt
                    realHidenMessage = CryptoHelper.Decrypt(realHidenMessage, password);                          // bay gio ta da duoc mang thong diep thuc su
                    byte[] hidenMessage = new byte[length];                                                       // bay gio ta chi quan tam den phan thong diep
                    for (int i = 0; i < length; i++)
                    {
                        hidenMessage[i] = realHidenMessage[i + 4];
                    }
                    // chuyen ve dang string
                    UnicodeEncoding unicode = new UnicodeEncoding();
                    string          result  = unicode.GetString(hidenMessage);
                    TXTTHONGTIN.Text = result; // hien thi ket qua ra textbox

                    inStream.Close();          // dong file dau vao
                }
                catch
                {
                    MessageBox.Show("Giải Mã Thất Bại");
                }
            }
        }