0

私はコンピュータ サイエンスを勉強し始めたばかりで、先生は私たちにこの小さくてトリッキーなプログラミングの課題を与えました。.bmp 画像http://postimg.org/image/vgtcka251/をデコードする必要があります。先生から手渡されたのですが、4 時間の調査と試行錯誤の末、デコードには至りませんでした。彼は私たちに彼のエンコーディング方法を教えてくれました:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class HideMsgInPicture {
    final static long HEADSIZE=120;

    public static void main(String[] args) throws IOException {
        encode();
        decode();
    }
    private static void encode() throws IOException {
        FileInputStream   in = null;
        FileInputStream  msg = null;
        FileOutputStream out = null;
        try {
            in  = new FileInputStream("car.bmp");
            msg = new FileInputStream("msg.txt");
            out = new FileOutputStream("carX.bmp");
            int c,mb;
            byte clearBit1 = (byte) 0xFE; //254; // 11111110

            for (int i=1;i<=HEADSIZE;i++) out.write(in.read()); //copy header

            while ((mb = msg.read()) != -1) {  // for all byte in message

                for (int bit=7; bit>=0; bit--) // 1 bit a time from messsage
                {  c = in.read() & clearBit1;  // get picturebyte,clear last bit
                   c = (c | ((mb >> bit) & 1));// put msg-bit in end of pic-byte
                   out.write(c);               // add pic-byte in new file
                }
            }

            for (int bit=7; bit>=0; bit--) // add 8 zeroes as stop-byte of msg
            {  c = in.read() & clearBit1;  // get picturebyte,clear last bit
               out.write(c);               // add pic-byte in new file
            }

            while ((c = in.read()) != -1) out.write(c);// copy rest of file
        }
        finally {
            if (in  != null)  in.close();
            if (msg != null) msg.close();
            if (out != null) out.close();
        }
    }
}

誰かが私を正しい方向に送ることができますか?

4

1 に答える 1

1

ステガノグラフィーについてどれくらい知っていますか? 最も単純なアルゴリズム (割り当てが実装しているもの) は、最下位ビット (LSB) です。つまり、メッセージをバイナリ (つまり、文字 'a' = 01100001) に変換し、個々のビットをピクセル値の右端のビットに書き込みます。たとえば、8 ピクセル (それぞれが 1 バイトで表される) を取り、最初のバイトで 0、2 番目の 1、3 番目の 1、4 番目の 0 などを非表示にします。メッセージを抽出するには、 LSB をピクセル単位で変換し、テキストに変換します。

先生が隠しアルゴリズムを教えてくれたので、基本的にはプロセスを逆にするアルゴリズムを書かなければなりません。それ以上調べる必要はありません。このコードが何をするのかを理解するだけで済みます。インライン コメントだけで十分です。

于 2013-04-19T23:27:28.047 に答える