Photoshopで視覚復号型暗号

main title

Photoshopを使って、視覚復号型暗号画像を作ります。 まずは、どんなふうに復号されるのか、サンプルもしくはデモで試してみてください。

サンプルvss_sample.psd:PSD 298KB)

サンプルをダウンロードして開いたら、非表示になっているレイヤーを表示してみてください。 それぞれのレイヤーの画像はノイズの様な画像ですが、両方を表示すると復号された画像が表示されると思います。

視覚復号型暗号は、視覚復号型秘密分散法とも呼ばれています。 秘密画像を複数の画像(シェア画像)に分散し、それらを重ね合わせることで、秘密画像を復号することができます。 排他的論理和の暗号化とは違って、完全には秘密画像は復号されませんが、人間の視覚で補うことで秘密画像の情報を得ることができます。 最大の特長は、コンピュータを使わなくても復号できるというところでしょう。 シェア画像を印刷して、それらを重ね合わせるだけで秘密画像を復号できます。

普通はあまり使わないような機能も使いますが、書いてある通りにやればできると思います。

  1. Photoshopで秘密画像を作る
  2. Photoshopでチェッカパターンを作る
  3. Photoshopでランダムパターンを作る
  4. Photoshopでランダムチェッカパターンを作る
  5. Photoshopでシェア画像を作る
  6. Photoshopで復号する
  7. Photoshopを使わないで復号する

Photoshopで秘密画像を作る

secret image title

まず、1つの点が2×2画素で表現された白黒の秘密画像を作ります。 1つの点を2×2画素で表現することで冗長性が生まれ、秘密画像の分散と秘匿性を実現します。 また、カラー画像で視覚復号型暗号を作成することもできますが、白黒で印刷して復号することも考慮して、秘密画像は白黒画像とします。

1.

元になるカラー画像(pico150.jpg)を開き(ファイル>開く…)ます。

サンプルの画像のサイズは、幅150ピクセル、高さ150ピクセルです。 最終的に生成されるシェア画像は、幅・高さともに、2倍の幅300ピクセル、高さ300ピクセルになります。

2.

カラーモードを変更して、インデックスカラーにする(イメージ>モード>インデックスカラー…)ことで2階調化します。

このときのオプションは、パレットを「RGB カラーを均等に割り付ける」、表示色を2としました。

視覚復号型暗号では、秘密画像は完全には復号されないため、単純な2階調化(イメージ>色調補正>2階調化)やスタンプ(フィルター>スケッチ>スタンプ…)などを利用して秘密画像を作成した方が、良い復号結果が得られるかもしれません。

index color

3.

カラーモードをグレースケールに戻し(イメージ>モード>グレースケール)ます。

シェア画像を作成する際にレイヤー機能を使用するので、インデックスカラーからグレースケールに戻します。

4.

画像解像度を幅・高さともに2倍にして(イメージ>画像解像度…)、秘密画像のできあがりです。

ピクセル数を幅・高さともに200%にします。 サンプルの画像では、幅300ピクセル、高さ300ピクセルになります。 また、画像の再サンプルのオプションは「ニアレストネイバー法」にします。

イメージ>画像解像度

vss_secret-image.psd (PSD 164KB)
secret image

Photoshopでチェッカパターンを作る

checkered-pattern title

ランダムチェッカパターンを作成するための準備として、まずチェッカパターンを作成します。

1.

新規ドキュメントを作成(ファイル>新規…)します。

カンバスサイズは、幅・高さともに作成したいピクセル数の3倍にします。 ここでは、幅300ピクセル、高さ300ピクセルのチェッカパターンを作成したいので、幅900ピクセル、高さ900ピクセルにします。 また、カンバスカラーは、「白」を選択します。

new

2.

フィルターのハーフトーンパターン(フィルター>スケッチ>ハーフトーンパターン…)を使ってチェッカパターンを作ります。

ハーフトーンパターンでは、描画色と背景色を用いてパターンを生成するため、描画色を黒に、背景色を白にしておきます。

パターンタイプは、「点」を選択します。 また、サイズは1に設定します。 コントラストは、28〜49の間に設定すれば良いようです。 ここでは、コントラスト40とします。
ハーフトーンパターン

3.

幅と高さを1/3にして(イメージ>画像解像度…)、チェッカパターンのできあがりです。

サンプルの画像では、幅300ピクセル、高さ300ピクセルになります。 また、画像の再サンプルのオプションは「ニアレストネイバー法」にします。

イメージ>画像解像度

描画色を黒に、背景色を白にした場合、画像の左上の画素が黒ではじまるチェッカパターンになっていると思います。

vss_checkered-pattern.psd (PSD 614KB)
checkered-pattern

Photoshopでランダムパターンを作る

random pattern title

1.

新規ファイルを作成(ファイル>新規…)します。

カンバスサイズは、幅・高さともにチェッカパターンの半分にします。 サンプルの画像では、幅150ピクセル、高さ150ピクセルとなります。 また、カンバスカラーは「白」にしておきます。

new

2.

レベル補正(イメージ>色調補正>レベル補正…)を行ってカンバスカラーを灰色(画素値 127)にします。

入力レベルはそのままで、出力レベルを0〜127に設定します。
level

3.

ノイズを加える(フィルター>ノイズ>ノイズを加える…)ことで、多階調のランダムパターンを作成します。

このとき加えるノイズの量を50%に設定します。
フィルター>ノイズ>ノイズを加える…

4.

多階調のランダムパターンを2階調化(イメージ>色調補正>2階調化…)して、白黒のランダムパターンを作成します。

しきい値は、128にします。

以上の処理は新規ファイルを作成するときに、カラーモードをグレースケールにして作成することで、Photoshopで暗号化カラーのランダムパターンのときと全く同じ手順でできます。

イメージ>色調補正>2階調化…

5.

画像解像度を幅・高さともに2倍にして(イメージ>画像解像度…)、ランダムパターンのできあがりです。

ピクセル数を幅・高さともに200%にします。 サンプルの画像では、幅300ピクセル、高さ300ピクセルになります。 また、画像の再サンプルのオプションは「ニアレストネイバー法」にします。

resolution

vss_random-pattern.psd (PSD 422KB)
ランダムパターン

Photoshopでランダムチェッカパターンを作る

random-checkered-pattern title

シェア画像を作成するために、下の2種類のパターンをランダムに並べたランダムチェッカパターンを作成します。
random-checker_subpixel.png

1.

チェッカパターンとランダムパターンを開き(ファイル>開く…)ます。

2.

チェッカパターンに新しいレイヤーを作成して、ランダムパターンを重ねます。 コピー&ペーストで良いと思います。

layer encryption

3.

レイヤーの描画モードを「差の絶対値」にします。

layer encryption

4.

画像を統合(レイヤー>画像を統合)して、ランダムチェッカパターンのできあがりです。

vss_random-checkered-pattern.psd(PSD 668KB)
randompattern and pico

Photoshopでシェア画像を作る

share image title

秘密画像とランダムチェッカパターンを使用して、2枚のシェア画像を作ります。

1.

まず、1枚目のシェア画像を作るため、秘密画像とランダムチェッカパターンを開き(ファイル>開く…)ます。

2.

秘密画像の階調を反転(イメージ>色調補正>階調の反転)します。

reversal secret image

3.

階調を反転した秘密画像に新しいレイヤーを作成して、ランダムチェッカパターンを重ねます。 コピー&ペーストで良いと思います。

layer encryption

4.

レイヤーの描画モードを「差の絶対値」にします。

layer encryption

5.

画像を統合(レイヤー>画像を統合)して、1枚目のシェア画像のできあがりです。

vss_share-image1.psd (PSD 307KB)
share-image 1

6.

2枚目のシェア画像は、1枚目のシェア画像を作成するときに使用したランダムチェッカパターンをそのまま使用します。 ここでは、ファイルをコピーして、名前を変更しました。

vss_share-image2.psd (PSD 668KB)
share-image 2

Photoshopで復号する

decryption title

1.

2枚のシェア画像を開き(ファイル>開く…)ます。

2.

新しいレイヤーを作成して、2枚のシェア画像を重ねます。 コピー&ペーストで良いと思います。

layer_decryption.png

3.

レイヤーの描画モードを「乗算」にすると、秘密画像が復号されます。

layer_decryption.png
vss_decrypted-image.psd (PSD 397KB)
pico decrypted

Photoshopを使わないで復号する

視覚復号型暗号は物理的な復号を特長としています。 たとえば、シェア画像を透明フィルムなどに印刷して、重ね合わせることで視覚的に秘密画像を復号することができます。

◆JavaScript

シェア画像2の白い部分を透明にした画像を、JavaScriptで重ねて復号します。
decryption with JavaScript 1

2枚のシェア画像がぴったり重なると、秘密画像が復号されます。
decryption with JavaScript 2

デモ