Spore Creature Creator の透かし付きサムネイル

Spore Creature Creator のサムネイルに電子透かしが使われているのではないかと,ちょっと話題になっている。

Spore creature creator and steganography - Ned Batchelder

Creature Creator で作成したクリーチャーは "Sporepedia" 上にサムネイル付きで紹介される。他のユーザーは,このサムネイルを Creature Creator にドラック&ドロップするだけで,そのクリーチャーをロードすることができる。ということは,サムネイルの中に必要なデータが埋め込まれているのではないか……というわけ。

例えば,テストのために作成してみた下のようなクリーチャーがある。

http://ll-102.ea.com/spore/static/thumb/500/004/102/500004102304.png

このサムネイルをビット毎に分解すると次のようになる(左上が最下位ビット)。

使用したスクリプトはこんな感じ(Python と PIL を使用)。

def extract_bits(filename):
    for i in range(8):
        mask = 1 << i
        img = PIL.Image.open(open(filename, 'rb'))
        for y in range(img.size[1]):
            for x in range(img.size[0]):
                (r, g, b, a) = img.getpixel((x, y))
                l = (r & mask) / mask * 16 + \
                    (g & mask) / mask * 32 + \
                    (b & mask) / mask * 64 + \
                    (a & mask) / mask * 128
                img.putpixel((x, y), (l, l, l, 255))
        img.save(open('bit%d_%s' % (i, filename), 'wb'))

この結果から推測する限りでは, RGBA 各チャンネルの LSB に必要なデータが埋め込まれていると考えられる。他のビットにもノイズっぽいものが見えるけれど,これは恐らく埋め込みによって発生するノイズを誤差拡散しているのではないかと思う。

各チャンネルの LSB にデータが埋め込まれているとして,サムネイルのサイズは 128x128 だから,データの容量は 128x128x4 bit = 8 KB という計算になる。 Spore は生成的な手法でデータを作成するから,データを保持するのに少ない容量で済むのだろうけども,それでも 8 KB で足りるものかどうかは分からない。単に GUID を持っているだけでは? という説もあるのだけれど,ネットワークから切断した状態でも正常にロードできることを確認したという報告もある。

真相はどうなんだろう? まあ,たぶんそのうち Chris Hecker あたりが明かしてくれるんじゃないかな。