イラストに秘密の情報を埋め込み作者の証明などをする
タイトルの通りのことをやります。
序論
絵描きの方々の中には「この絵はわしが描いた」ということを証明できるようにしたいと思っている人たちがいる。SNSを通じた画像データの再投稿やそれを転載して別の人が自作発言をするということを防ぎたいという趣旨である。
Webの世界で利用される画像データとそれを配信するHTTPという仕組みはデータを自由にコピー・改変できる技術が根本になっているのでこれを技術的に達成するのは非常に難しい。
広く利用されているものとして、人間が目で見て分かるような透かし(透過率が高めの単色のロゴやテキストなどを合成する)を入れたり作者のサインを入れたりするという手法がある。
この手法の欠点は、
- サインや透かしという本来は無い方が望ましい(場合もある)ノイズを入れなければならない
- サインや透かしが入っているという事自体が容易に確認出来るために、不正な利用を企てる人間にそれを取り除こうとする意思を発生させてしまう
- サインや透かしそのものが作品の作者を特定できる証拠になり得ない
というあたりである。一方で利点は、
- この方法の利点は画像のリサイズ、色調補正、トリミングに対して一定程度の耐性がある
いうことである。
今回はステガノグラフィという技術を紹介するが、この手法の利点・欠点は上記のほとんど真逆の特性となる。
ステガノグラフィとはなんぞや
Steganography とは、とある情報の中に別の情報を隠匿する技術のことである。対応する日本語は無いようだ。
今回紹介するsteghideはJPEG画像やWAVファイルの中に任意のデータを第三者からはわからないように埋め込むことができる。
Linuxだとパッケージマネージャから入れることが出来る。Windows版もここにあるようだ。
じゃあやってみよう。
まず、埋め込むデータを用意する。今回は「この絵はわしが描いた」と書かれたsecret.txtを用意した。
$ cat secret.txt
この絵はわしが描いた
このデータを以下の画像に埋め込む。
埋め込むには以下のようにする。
$ steghide embed -cf original.jpg -ef secret.txt
するとパスフレーズの入力を求められる。ここで入力したパスフレーズを知っている人だけがこのデータを取り出すことが出来る。クラッキングツールも公開されているので、できるだけ長いパスフレーズを入力したほうが良いだろう。今回はパスフレーズなしにした。
データを埋め込んだ後の画像がこちら。目で見ても何が違っているのか全くわからない。
データはどこに埋め込まれたのだろうか?Exif情報として格納されたのだろうか。
$ exiftool embedded.jpg
ExifTool Version Number : 12.65
File Name : embedded.jpg
Directory : .
File Size : 1684 kB
File Modification Date/Time : 2023:12:23 07:39:40+09:00
File Access Date/Time : 2023:12:23 07:43:50+09:00
File Inode Change Date/Time : 2023:12:23 07:42:24+09:00
File Permissions : -rw-rw-r--
File Type : JPEG
File Type Extension : jpg
MIME Type : image/jpeg
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 1210
Image Height : 1720
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:4:4 (1 1)
Image Size : 1210x1720
Megapixels : 2.1
特にExifには何も入っていないようだ。じゃあ、JPEGファイルのケツに単にデータが付与されているのではないだろうか?(昔、インターネット上ではこのような方式で違法なデータを配布している人がたくさんいた)
$ binwalk embedded.jpg
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
特に何のデータもない。じゃあ、ツールで埋め込んだファイルを取り出してみよう。
$ steghide extract -sf embedded.jpg -xf extracted.txt
Enter passphrase:
wrote extracted data to "extracted.txt".
$ cat extracted.txt
この絵はわしが描いた
埋め込んだ「この絵はわしが描いた」というデータが復元された。このテキストは一体画像ファイルのどこに隠されていたのだろうか?それは、この画像そのものである。詳しいアルゴリズムの解説は私にも出来ないが、特定の規則に基づきそれぞれの画素の色情報を少しだけ変更して埋め込んでいるはずだ。JPEGであるので厳密には「画素」に埋め込んでいるわけではないと思うが。簡単に言えば、「人間にはわからない程度の色の違いを生み出し、そこに情報をもたせている」という感じになるだろうか。
何が嬉しいの?
たとえば、以下の方法を使うことであなたがこの画像の作者であることを証明できる。
- あなたが公開するイラストそれぞれに対して別のパスフレーズを設定し、作者情報(例えば自サイトのURLなど)をsteghideで埋め込む
- あなたが公開したイラストを勝手に転載して「私の絵です」と発言する人が出てくる
- あなたはその絵が自分の絵であることを証明するために、秘密のパスフレーズで作者情報が復元できることを公にする
- 第三者があなたにしか知り得ない情報によってあなたの作者情報が復元できることであなたが作者であることを検証できる
これは目で見える透かしやサインを入れることに比べると、
- 秘匿した情報があるとだれにもわからないまま画像を公開できる
- 作者しか知り得ないパスフレーズをもって作者の検証が厳密にできる
という点で優れている。
また、以下のような応用も可能である。
- 作者は画像のデジタルデータを販売する
- 販売した画像にはそれぞれ別のパスフレーズで販売した相手の名前を設定しておく
- 悪意を持った人が買った画像を別の人に再販したり、誰でもダウンロードできるような状態でインターネット上にアップロードする
- あなたはその被害に気づいたとき、画像に設定した相手の名前を復元すれば、だれが犯人なのか特定することが出来る
以上に関しては悪意を持った人側が「結託攻撃」というまた別の対抗手段を有するのだけどまあそれは話がそれていくのでここでは書かない…。
本当にこれが嬉しいか?
嬉しくない。これが本当にイラスト関係の無断転載などを根本的に解決するならみんな利用している。
ステガノグラフィの最大の弱点は画像の回転・リサイズ・クロップ・色調補正などに対する耐性がほぼ皆無なことだ。試してみよう。
$ mogrify -resize 1210x embedded-resized.jpg
$ steghide extract -sf embedded-resized.jpg -xf extracted-resized.txt
Enter passphrase:
steghide: could not extract any data with that passphrase!
元々の画像が横幅1200pxだったところ、1210pxにリサイズした。その状態だと復元できない。
また、SNSによってはアップロードされた画像を再サンプルするなど何らかの改変を加えるところがある。例えばMisskeyは画像データをすべてWebPに変換してしまう。これをJPEG形式に戻してもやはり復元できない。
Twitterも何らかの変換を行っているようで、アップロードした画像は元々のファイルと比べるとファイルサイズが変わっていた。ただ、こちらは正常に変換することができた。Twitterはアップロードした画像サイズによっては再サンプル処理が走るようなので、場合によってはこちらも変換することが不可能だろう。
となると、確実に作者情報が残るのは目で見てわかるサインや透かしということになる。目で見て分かるサインや透かしは、そのサインや透かしを持って誰が作者なのか明らかにすることが厳密には不可能である(サインを描いた所で、そのサインが果たして誰によって書かれたものなのか検証する術がない)。
ただ、それを言ったらステガノグラフィも第三者が別の情報を埋め込んだ上で「わしが作ったのだ」と表明することが可能なので本当に厳格に作者が判別できる手法だとは言い難い。ステガノグラフィで情報を埋め込むのは一般的なものではないという点で攻撃に耐性がある、程度しか言えないかも知れない。
ステガノグラフィ、電子指紋といった技術でリサイズ、回転、色調補正などに対して耐性がある手法も研究レベルでは提案されているが、現実社会で実用的な技術として実装できているのは私は見たことがない。
じゃあどうすればいいの?
今の仕組みでは技術的にすごく難しいので、本当に盗用を防ぎたいならインターネット上にイラスト画像を公開しない、というくらいしか対策が無い。
それはかなり極端な方法なので、現実的には「自分にしか描けない特徴的な絵を描き続ける」ということが現実的で強力な対抗策になるだろうと個人的には思う。自分にしか無い絵柄、誰が見ても「ああ、この人の絵だ」と判別可能なオリジナルの絵柄を確立して新しい絵を公開し続けることによって、誰しもが「絵柄」という唯一の情報で絵と特定の作者を紐付けることが可能であるし、絵柄は種々の改変に対してもかなりロバストだ。
なんか「あなたにしか描けないオリジナリティのある絵を」と書くと絵描きの人にとってはちくちく言葉になるのかもしれんが、しかし繰り返しになるが現実的にはそれが最も強力な対抗策だと個人的には考えている。