視覚復号型秘密分散法
暗号っていうのはどうも難しい響きがあります.そこが良いって言う人もいますが,暗号文を手にして,分厚いコードブックや難しいプログラム…というイメージをおもちの方も多いかとお思います.しかし,そんな物が必要ない暗号だって勿論存在します.このページで御紹介する視覚復号型秘密分散法 (Visual Secret Sharing Schem, 以下,VSSSと略)はまさにそんな簡単な暗号システムです.
この先生の論文に、生成方法がまとめられているらしい。だけど読むのが大変そうなので、RMagickで作ってみた。
=begin vsss.rb - create image by visual shared secret scheme =end require 'rubygems' require 'rmagick' class VSSS def initialize(seed = 0) @seed = seed end
とりあえず、マスク画像の乱数を初期化。
def create_canvas(width, height) srand(@seed) @width, @height = width, height @mask = Magick::Image.new(@width, @height) gc = Magick::Draw.new gc.fill('black') 1.upto(@height) do |y| 1.upto(@width) do |x| gc.point(x, y) if rand > 0.5 end end gc.draw(@mask) @mask = @mask.transparent('black') end
create_canvas()でマスク画像を作る。ランダムに黒ドットをうって、あとからXor演算をするために透明化しておく。
def draw_text(text) @original = Magick::Image.new(@width, @height) gc = Magick::Draw.new gc.gravity = Magick::CenterGravity gc.pointsize = 36 gc.text_antialias(false) gc.text(0, 0, text) gc.draw(@original) @encoded = @original.negate.transparent('black') @encoded = @encoded.composite(@mask, 0, 0, Magick::XorCompositeOp) @decoded = @encoded.composite(@mask, 0, 0, Magick::InCompositeOp) end
@originalに隠したい文字を描画したイメージを作っておき、マスク画像とXorをとる。このとき、文字=黒になっているので反転して背景=黒にし、背景を透明化する。これによって文字=白のイメージとマスク画像のXorをとって@encodedに入れている。このあたりは画像処理に慣れた人には簡単なんだと思うけど、結構迷った。
また、確認のために、マスクと重ねたときの結果を@decodedに入れている(添付画像参照)
def write_original(file) @original.write(file) end def write_mask(file) @mask.write(file) end def write_encoded(file) @encoded.write(file) end def write_decoded(file) @decoded.write(file) end end
イメージを画像ファイルとして書き出すメソッド群がこんな感じ。
if __FILE__ == $0 v = VSSS.new v.create_canvas(100, 100) v.draw_text('Ruby') v.write_original('original.jpg') v.write_mask('mask.jpg') v.write_encoded('encoded.jpg') v.write_decoded('decoded.jpg') end
呼び出し部分はこんな感じ。
追記:TODO
- 日本語フォントの動作確認
- 自動リサイズ
- タイリング(1x2、2x2等)対応←1x1は汚いので
- CGIにする