2011-06-30 16 views
2

私はコンピュータプログラミングクラスのためのステガノグラフィプログラムを開発しています。それはランダムなアスキー記号を与えるように見えます。出力はBINARYであると考えられます。エンコードメッセージメソッドは私の先生によって私たちに与えられました。デコード部分をプログラムするだけです。奇妙な結果を与えるステガノグラフィプログラム

import java.awt.*; 
class HideMessage { 
    public void encodeMessage(Picture stegoObject, int[] binaryArray) { 
     Pixel pixelTarget = new Pixel(stegoObject, 0, 0); 
     Pixel[] pixelArray = stegoObject.getPixels(); 
     Color pixelColor = null; 
     int redValue = 0; 

     for (int x = 0; x < binaryArray.length; x++) { 
      redValue = binaryArray[x]; 
      pixelTarget = pixelArray[x]; 
      pixelTarget.setRed(redValue); 
     } 
     pixelTarget = pixelArray[binaryArray.length]; 
     pixelTarget.setRed(255); 
     System.out.println("FinishedPic"); 
     stegoObject.write("SecretMessage.bmp"); 
     stegoObject.explore(); 

    } 
    public void decodeMessage(Picture decodepic) { 

     int redValue = 0; 
     Pixel targetPixel = null; 
     Color pixelColor = null; 
     int sum = 0; 

     for (int x = 0; redValue < 2; x++) { 
       //inside nested loop to traverse the image from left to right 
       for (int count = 1; count < 9; count++) { 

        targetPixel = 
         decodepic.getPixel(count + (8 * x), 0); 
        //gets the x,y coordinate of the target pixel 
        pixelColor = targetPixel.getColor(); 
        //gets the color of the target pixel 

        redValue = pixelColor.getRed(); 

        if (redValue == 1) { 
         if (count == 1) { 
          sum = sum + 128; 
         } 
         if (count == 2) { 
          sum = sum + 64; 
         } 
         if (count == 3) { 
          sum = sum + 32; 
         } 
         if (count == 4) { 
          sum = sum + 16; 
         } 
         if (count == 5) { 
          sum = sum + 8; 
         } 
         if (count == 6) { 
          sum = sum + 4; 
         } 
         if (count == 7) { 
          sum = sum + 2; 
         } 
         if (count == 8) { 
          sum = sum + 1; 
         } 
        } 

        System.out.println(sum); 

       } 
       System.out.println((char)sum); 
       sum = 0; 
      } //end of the inner for loop 
    } 
} 

public class HideMessageTester { 
    public static void main(String[] args) { 
     int[] bitArray = 
      { 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 
      0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 
      1, 1, 1, 1, 0, 0, 1 }; 
     //int[] bitArray = 
     { 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 
       0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 
       1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 
       0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 
       0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 
       0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 
       0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 
       0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 
       0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 
       0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 
       1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 
       0, 1, 0, 0, 0, 0, 1}; 

     Picture stegoObject = new Picture("Earth.bmp"); 

     HideMessage stego = new HideMessage(); 

     stego.encodeMessage(stegoObject, bitArray); 
     Picture decodeObject = new Picture("SecretMessage.bmp"); 
     System.out.println("Now Decoding"); 
     stego.decodeMessage(decodeObject); 
    } 
} 

答えて

2

まず、アドバイスのいくつかの一般的な作品:私は非常にSecretMessage.bmpを見て驚きました

Picture stegoObject = new Picture("Earth.bmp"); 
HideMessage stego = new HideMessage(); 
stego.encodeMessage(stegoObject, bitArray); 
Picture decodeObject = new Picture("SecretMessage.bmp"); 
System.out.println("Now Decoding"); 
stego.decodeMessage(decodeObject); 

を;:私は関数がその責任を混ぜ合わされているので、あなたのプログラムが非常に複雑だと思います作成したオブジェクトをデコードしようとしていたことはまったく明らかではありませんでした。確かに、encodeMessage()方法を読めば、どこから来たのかを判断するのは簡単だったが、私はこのフローは簡単だっただろうと思う。つまり

/* encode */ 
Picture pic_to_steg = new Picture("foo.bmp"); 
HideMessage stego = new HideMessage(); 
Picture secret = stego.encodeMessage(pic_to_steg, bitArray); 
secret.write("SecretMessage.bmp"); 

/* decode */ 
Picture pic_with_message = new Picture("SecretMessage.bmp"); 
int[] hidden = stego.decodeMessage(pic_with_message); 

/* output `hidden` and compare against `bitArray` */ 

:全くのメインフローまでのファイルIOを残しますプログラム。おそらくあなたのルーチンは将来、ネットワークサーバーから呼び出され、ピクチャはディスクに保存されません。ルーチンがPictureで動作し、戻り値がPictureおよびint[]の場合、この変更ははるかに容易になります。

encodeMessage()メソッドを単独でテストできますか?おそらく、入力ファイルと出力ファイルの違いについて見てみましょう。このセクションでは、面倒になります。

public void encodeMessage(Picture stegoObject, int[] binaryArray) { 
    Pixel pixelTarget = new Pixel(stegoObject, 0, 0); 
    Pixel[] pixelArray = stegoObject.getPixels(); 
    Color pixelColor = null; 
    int redValue = 0; 

    for (int x = 0; x < binaryArray.length; x++) { 
     redValue = binaryArray[x]; 
     pixelTarget = pixelArray[x]; 
     pixelTarget.setRed(redValue); 
    } 
    pixelTarget = pixelArray[binaryArray.length]; 
    pixelTarget.setRed(255); 

が本当に単純な代入を介して更新することができ、画像に参照pixelArrayですか?復号化はいくつかの奇妙なループを持っている

pixel p = image.getPixel(x, y); 
p.setred(binaryArray[i]); 
image.setPixel(x, y, p); 

:私は本当にデザインがよりこの擬似コードのように見えることを期待したい

for (int x = 0; redValue < 2; x++) { 
      //inside nested loop to traverse the image from left to right 
      for (int count = 1; count < 9; count++) { 

このループは、あなたがそれを設計し正確に動作するかもしれませんが、時にと非常に間違っていると感じます。x=0で始まり、毎回xを増やしますが、ループ終了規則としてredValue < 2を使用します。

私はあまりなく、このように書かループご覧になります(それは同じではありません

int x = 0; 
while (redValue < 2) { 
    /* stuff */ 
    x++; 
} 

を、xは危険なことができますループ、外にまだ有効であるしかし、私はこれはかなりあると思います。

forループの終了句がセットアップまたは増分句に関連しない場合があります。私の経験では、非常にです。

この場合でも、間違いのように感じます。条件redValue < 2はループ不変であるが、内部ループは、encodeMessage()メソッドで強制されない仮定である8の倍数であるピクセルでのみ発生すると仮定する。

redValueから整数値を計算しようとすると、デコードルーチンが不必要に複雑になります。内側のループを取り除いて、encodeMessage()ルーチンに渡された配列とまったく同じ配列を返すことをお勧めします。これは、(8)で割り切れないビット配列の書き込みを1000倍も簡単に処理できるようになります。

次に、を書きます。メソッドを使用して、ビット配列の出力を合計、ASCII文字、EBCDIC文字、RSAキーパラメータ、またはエンコードされているものに変換します。一度にあまりにも多くをやろうとしないでください。ビットの配列をデコードするための別個のメソッドを書くことは、(a)より簡単に(b)デバッグしやすく(c)容易にテストすることができます。

これらのヒントが役立つことを願っています。

+0

これを説明していないのですが、ASCIIからバイナリに変換すると申し訳ありませんが、8ビットコードが必要です。そのため、8ビットブロックでスキャンします。 –

+0

@Alan確かに、それはそれがそのように行われた理由だと思っていました。しかし、もしあなたが責任を分け合っていれば、より柔軟で、書くのが簡単で、テストが簡単です。 :) – sarnold