暗号化の実験(文字列を画像化してみる)

 久しぶりに記事を書くので続けられるようにシリーズで書いてみようと思う。最近では検索エンジンの お陰もあってページにメールアドレスを書いたりしておくとスパマーさん達に拾われて大量のスパムが来たりするのでメールアドレスを画像で載せていたりします。これも読み手側にとっては読み取って入力しないといけないので長いアドレスの場合は面倒だったりします。そういった場合は「全角や半角を混ぜたり」「文字の入れ替えを指示したり」と皆さん試行錯誤しています。また、こういったCMSにはコメント機能がありますが掲示板スパムなどで自動投稿される恐れがあるのでCAPTCHAなどの機能を利用して、ユーザ側が視認した内容を書き込ませる様な仕組みを取っていますが、自動で読み取るソフトとのいたちごっこです。
 まぁこんな書き出しだと「それらに取って代わるものを提供しましょう!」って言っているようですが、そうではなく違った提供方法を考えてみようと思ってこれから数回にわたって実験をしてみようと思います。不定期な更新になると思いますがお楽しみに。

大体こんなステップで書こうと思っています。
  1. 文字列を暗号化・復号化してみる
  2. 暗号を画像化してみる、そして画像から暗号を読み取る
  3. 鍵をつけてみる
  4. 色んな画像に埋め込んでみる
お楽しみに!

1.文字列を暗号化・復号化してみる

 ここの分野はあんまり得意ではないので最初から手を抜いちゃいます。今回はPerlに「文字列を画像化」「画像を文字列に」って作業をさせようと思いまして、しかもボクの頭の中では画像化って言っても自動で絵を描くのは大変なのでGIFのカラーパレットに暗号を忍ばせようと考えました。つまり色は#000000〜#FFFFFFまでの16進数6桁ですから16進数(A〜F)の文字だけの暗号を作れば良いわけです。※多分そんなものは何処かに存在しているかもなのですが、分からないので作ってみます。
 では何が良いだろうと考えて頭の中で「そう言えば昔ニフティとかではBinhexなんてのでバイナリーを16進数の文字列に変換して送ったな〜」なんて思いながら、よく考えれば今もメールは「Base64(MIME::Base64)」で送っている訳ですよ。そこで16(2^4:2の4乗)で64(2^6:2の6乗)ですから6bit→4bitに変換してやれば良いんです。つまり64進数で2桁が16進数で3桁なんですよ。コレは最終的にRGBに変えようというボクにとって都合の良いことに3桁毎の塊(桁数が3の倍数)になるわけです。ラッキー!ここまでの流れをリストにすると
  • まず文字列をBase64で64進数(A-Za-z0-9+/)にエンコードする
    例)「コレはテストの文字列です。」→「44Kz44Os44Gv44OG44K544OI44Gu5paH5a2X5YiX44Gn44GZ44CC」
  • 次に64進数→16進数に変換する
    例)→f883a3f882ecf8826ff880e6f883a9f880e8f8826ee994a7d9ad67d98927f88267f88169f88022
  • 頭に64進数時の文字数を3桁の16進数で追加(復号化に必要)
    例)→034f883a3f882ecf8826ff880e6f883a9f880e8f8826ee994a7d9ad67d98927f88267f88169f88022

 変換方法に関しては単純に64進数を2桁毎に分割し、それぞれを2bit+4bitに切り分けて、1桁目の2bit+2桁目の2bitで16進数の1桁目、残りの1桁目の4bitが16進数の2桁目、残りの2桁目の4bitが16進数の3桁目というような変換の仕方です。ここは作り手によって変えても大丈夫でしょう。

例えば64進数(A-Za-z0-9+/)を2進数で表記した場合、A:000000、/:111111とすると
「Kz」を変換する場合、
 K:001010、z:110011
→K:00+1010、z:11+0011
→0x3:0011、0xa:1010、0x3:0011(0x~は16進数)
→0x3a3

 こんな感じです。上の例も同じようになっていますよね。良かった。復号化は逆の手順で行います。簡単なのでプログラムは想像して書いてみてください。


2.暗号を画像化してみる、そして画像から暗号を読み取る

 まぁ前節までは何だか文字だらけで全然面白みがないと思います。では前節でエンコードされた16進数を画像化しようと思います。ただしGIFではカラーパレットに256色しか使えないので1色6桁で換算すると大体全角1文字で1色の割合に変換できそうです。ただし、ここで技術的な障壁が。今回画像生成にImagerってPerlのモジュールを使ってみたのだが色の指定(RRGGBB)の1670万色を全て指定できないのです。多分設定の問題かと思いますが、コレは後で解消するとして暗合できる文字の長さが半減するけど色の指定(RGB)を変えて先に進めます。
 とりあえず手っ取り早く正方形に色を着けて並べるというモザイク模様が生成されるようにしてみました。最初のマスに正方形のサイズと折り返しの長さを書き込んであります。
589b05462f2e3be36dad29f0f32223df.gif 前節の文字列を変換するとこんな感じです。コレは8ピクセルの正方形で折り返し無しの状態です。では生成するためのフォームを下につけます。
※空欄は一行
 


 では復号化の方も作ってありますのでご確認下さい。上記で生成した画像をダウンロードしてからアップロードして下さい。
 


 こんな感じです。まだ制作段階なので荒削りですが、今後は鍵による復号の制御とか別画像への埋め込みなんてのを考えています。今の状態でも以下の条件で作成した画像をいじっても読み込みには支障がありません。ここら辺をメリットとして他への転用を考えたいです。
  • カラーパレットさえ変更しなければ色を追加しても大丈夫
  • 各マスの左上の部分を書き換えなければ、マスに文字を乗せようが加工しても大丈夫
  • 画像の左上をずらさなければ画像を拡大しても大丈夫(例えばパターンをくり返してチェック模様にも)
  • JPEG等へ移行すれば色数(文字数)も増やせそうですが再加工は無理かな?
  • (今後の鍵とも絡むが)変数をかますことによって、色調を変えることが可能

などなど他にも色々な使い道を考えて下さいませませ。では続きはまた今度!

カテゴリ

, ,

コメントする

(初めてコメントする場合、承認されるまではコメントが表示されない場合があります。)

2016年6月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

このブログ記事について

このページは、管理人が2007年12月17日 10:47に書いたブログ記事です。

ひとつ前のブログ記事は「怖い話」です。

次のブログ記事は「暗号化の実験(文字列を画像化してみる)2」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

お問い合わせ