視覚復号型秘密分散法

jitte2006-07-04

暗号っていうのはどうも難しい響きがあります.そこが良いって言う人もいますが,暗号文を手にして,分厚いコードブックや難しいプログラム…というイメージをおもちの方も多いかとお思います.しかし,そんな物が必要ない暗号だって勿論存在します.このページで御紹介する視覚復号型秘密分散法 (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にする