Ubuntu Weekly Recipe

第602回 2020年になったのでテキストに半角スペースで暗号文を埋め込もう

この記事を読むのに必要な時間:およそ 3.5 分

データを圧縮して埋め込む

さて,stegsnowのエンコード方式は3bitのデータを8bitのデータ(タブ文字と半角スペース)に変換します。つまりデータとしては3倍近くになるわけです。これでは効率が悪いので,埋め込むデータを圧縮したいところですね。

stegsnowは-Cオプションを付けることで,ハフマン符号でデータを圧縮・展開できます。

$ stegsnow -C -m "けれども本当の幸いは一体なんだろう" body.txt output.txt
Compressed by 4521260802379791872.00%
Message exceeded available space by approximately 240.00%.
An extra 26 lines were added.

圧縮率がおかしいことになっていますね。さらに圧縮前に比べると追加される空行も増えています。実はstegsnowは英文に最適化された静的なハフマンテーブルを利用して圧縮します。このため,英文以外だとあまり効率よく圧縮はできないようです。stegsnowのマニュアルでも,テキストデータでない場合やデータサイズが大きくなる場合は,組み込みの圧縮オプションを使用せず,あらかじめgzipなどで圧縮したデータを-fオプションで渡す方法を推奨しています。

ちなみに英文を埋め込んだ場合だとどうなるのでしょう。

未圧縮の場合:
$ stegsnow -m "Night on the Galactic Railroad" body.txt output.txt
Message used approximately 84.21% of available space.

圧縮した場合:
$ stegsnow -C -m "Night on the Galactic Railroad" body.txt output.txt
Compressed by 40.00%
Message used approximately 48.00% of available space.

圧縮が効いた結果,データ容量の84.21%を使っていたものが48.00%まで下がっています。

圧縮データが含まれたテキストファイルをデコードする場合も-Cオプションを付けてください。そうしないと「圧縮されていない」と判断し,デコードするため,意図しない結果となります。

$ stegsnow -C output.txt
Night on the Galactic Railroad

データを暗号化して埋め込む

stegsnowはICE暗号化アルゴリズムを利用したデータの暗号化にも対応しています。-pオプションを付けると任意のパスワードを指定可能で,そのパスワードを知っている人だけがデコードできるようになるのです。

$ stegsnow -l 120 -m "けれども本当の幸いは一体なんだろう" -p "パスワード" body.txt output.txt
Message used approximately 63.75% of available space.

まずはパスワード無しでデコードしてみましょう。

$ stegsnow output.txt
.~6AZnJY7
         y"ҪxZC4O&1k^6

うまくデコードできず意味不明の文字列になってしまいましたね。

次はパスワードを付けてデコードします。

$ stegsnow -p "パスワード" output.txt
けれども本当の幸いは一体なんだろう

今度は無事にデコードできました。

決して強度のある暗号化アルゴリズムではないので,あくまでカジュアルに暗号化できます,程度に考えておきましょう。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。