Perlステガノグラフィ

読者の皆さん、こんにちは。



私は典型的な(ハブラーの)現代の「shkolota」の代表です。 私はコンピューターに近いトピックに興味があり、いくつかのプログラミング言語を知っています。これについて何か知っていると思います。 しかし、投稿はそれについてではありません。



ハブラーを通して見ると、私はしばしばステガノグラフィーのトピックに関する投稿に出くわしました。 初心者(非常に初心者、まあ、絶対に初心者)プログラマとして、このトピックは、一方では非自明性であり、他方では実装の相対的な容易さに興味がありました。 さらに、プログラミングの実践が近づいていました...

Porakininの頭脳、私は黒でlunapark構築することにしました...ステガノグラフィプログラムを書きます。 このプログラムについて、それを書くことの難しさとそれらを克服する方法は、私の最初のhabrapostです。





ノイズとは何ですか?


habra-userは「ステガノグラフィ」とは何かを説明する必要はないと思いますが、念のため、ステガノグラフィの基本的な方法を説明する投稿へのリンクを提供できるようにします。

メガスによるステガノグラフィー

現時点では、 この投稿でより詳細に説明されているLSBメソッドを使用しています。より正確には、BMP、PNG、およびWAV形式の一般化です。



第1章、問題の設定


自分が別の自転車を発明していることに気付いたら、まず、あなたのような他の「発明者」の自転車とどのように異なるかを理解しようとします。 私自身は、次の点を強調しました(ただし、それらのすべてが(今のところ)実装されているわけではありません)。



私は言語としてPerl 5を選択しましたが、選択の理由は純粋に主観的です-私は言語が好きです(たとえば、C ++を選択することで多くの落とし穴を回避できたことに気づきました)。



第2章、落とし穴


1.バイナリデータを操作する


最初の「石」はすぐに出会った。 使用されるLSB方法は、各バイトの最下位Nビットを変更することです。 ただし、Perlでは、ファイルをビットシーケンスとして処理する機能は提供されておらず、データは少なくとも1バイトずつ読み取られます。

この難易度が最も簡単であることが判明しました;数分以内に、str2binサブルーチンが作成され、バイトの文字列がビットの配列に変換されました。

sub str2bin ($) { my @bin; my $str = shift; for (my $i=0; $i < length($str); $i++) { @bin = (@bin, split ('', sprintf "%08b", ord(substr($str, $i, 1)))); } return @bin; }
      
      





2.スローモーションプログラム


次の数日間はうまくいきました。BMP形式のファイルを操作するためのモジュールが作成され、WAV形式で作業が始まりました。 ただし、テストプロセス中に、プログラムは長さが1,000文字以上のメッセージを不当に処理することに気付きました(最大4,500文字のメッセージの場合、録音時間は25秒、読み取り時間は60秒でした)。

長い喫煙マニュアル、 MNTの数百のアプリケーションを通じて、次のことがわかりました。Perlで配列を変更する操作は遅いです。 いいえ、それさえも: ミーディード。

つまり、単純な置き換え

 for (my $i=0; $i < length($str); $i++) { @bin = (@bin, split ('', sprintf "%08b", ord(substr($str, $i, 1)))); } return @bin; }
      
      







 for (my $i=0; $i <= $#t; $i++) { $bin .= substr(dec2bin(ord($t[$i])), 24, 8); } return split('', $bin);
      
      





読み取り時間と書き込み時間をそれぞれ25秒と60秒から0.135秒と0.230秒に短縮しました。つまり、加速は数百回達成されました



3. GUI、Perl、Cyril、Methodius


WAV用のモジュールを作成した後、GUIの作成に使用したTkxツールキットは、TextEditフィールドのキリル文字を適切に処理できないことがわかりました。

この問題は回避できませんでした。その結果、グラフィック部分をWin32 :: GUIに書き換えることに決めました。



4.なぜ死者を苦しめるのですか?


物事が進むにつれて、 メガスはしばしば気になりました:

しかし、この方法には多くの欠点があります。 まず、少数のコンテナにのみ適用されます。

より活気のある形式で作業する方法を思いつきたいという要望がありました。 それから、ウィキペディアの一度読んだ行は、PNG形式が可逆圧縮で機能するという私の頭に浮かびました。

シンプルで洗練されていないが、実用的なアイデアが思い浮かびました:

  1. PNG画像を撮る
  2. BMP形式で一時的に変換します
  3. BMPで一時的に既に実装されているステガノグラフィメソッドに適用する
  4. 一時的なBMPをPNGに戻す


メッセージの復号化-同様に、一時的なBMPを使用。



第3章、最終版(写真付き!)


それで、次の自転車は人生の旅を始めました。

最後に、このプログラムのgitリポジトリ( KaiNS )へのリンクを提供し、その作業の結果も示します。



元のPNG画像

で



10903回繰り返される行「Hello、Habr!」を含む画像コンテナ

アウト



ソースwavファイル (1.7 Mb)

Wavコンテナ、パスワード-Utter (1.7 Mb)



Git:

git://github.com/utter-step/KAiNS.git

(インストールされているPerlモジュールが必要:Win32 :: GUI、Imager)。



実行可能ファイル:

KaiNS.exe



この記事の最後まで耐えてくれたすべての人に感謝します。

コメントでこのトピックに関する意見を聞いてうれしく思います。また、実装できる他のステガノグラフィの方法について誰かが話してくれたら嬉しいです。

よろしくお願いします!



UPD:コメントは、str2binの配列でさらに効率的に機能するコード 、およびPerlでバイナリデータを操作するための根本的に正確なソリューションを提案しました。 このタスクのコンテキストでは、1つ目を適用し、2つ目を理解します。



All Articles