Texture 暗号化

13 views
Skip to first unread message

Hajime Hoshi

unread,
Jul 23, 2008, 1:54:54 AM7/23/08
to Star Ruby
星です。

下のスレをみて思いついたのですが、 Texture を暗号化できたらどうでしょうか。
http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/110-112

ogg ファイルは、ストリーム再生する関係上、暗号化困難のようです
(SDL_mixer にメモリ上のデータから再生する API がない)。
ご意見のほどよろしくお願いします。

--
Hajime Hoshi <hajim...@gmail.com>

hajimehoshi

unread,
Jul 23, 2008, 2:06:36 AM7/23/08
to Star Ruby
星です。

> 下のスレをみて思いついたのですが、 Texture を暗号化できたらどうでしょうか。http://pc11.2ch.net/test/read.cgi/gamedev/1207069887/110-112

Texture 暗号化じゃなくて、「Texture に使用する画像ファイルの暗号化
(および、暗号化された画像ファイルのロード機能)」でした。
失礼しました。

ISA

unread,
Jul 23, 2008, 4:25:50 AM7/23/08
to Star Ruby
バイナリに隠蔽することで多少はわかりづらくはなるとしても、
やはり暗号化できるのは安心ですね。

Texture#saveの引数に暗号化オプションを渡すなどで作成できて、
Texture.loadでpngとの違いを意識せずに使える、となれば理想的ですね。

Texture#crypted?みたいなプロパティは必要なのかなぁ。

Hajime Hoshi

unread,
Jul 23, 2008, 5:38:09 AM7/23/08
to star...@googlegroups.com
星です。

> Texture#saveの引数に暗号化オプションを渡すなどで作成できて、
> Texture.loadでpngとの違いを意識せずに使える、となれば理想的ですね。

思ったのですが、暗号 / 復号モジュールをライブラリ側で提供したとして、
あまり役に立たないんじゃないかなーと。
理由は以下のとおり:
* 求められる暗号レベルはゲームによって異なる
* ライブラリ側で用意したものは復号アルゴリズムがばればれなので無意味

代わりに、「Texture.load の第一引数に IO オブジェクトを渡せる」ようにして、
暗号化、複合化をゲーム作る側が自由に定義できるようにすればよいと思いました。

例 1) 先頭に 1 バイトごみをつけるだけの暗号 (?) 化

読み込むときは 1 バイト読み捨てるだけで復号できます。

texture = open("hoge.png") do |fp|
fp.getc
Texture.load(fp)
end

例 2) 0xff で XOR かける暗号化

IO に対してフィルターをかける IO がほしいんですが、 Ruby だとどうやるのがいいんでしょう…。

class XorIO < IO
def initialize(io)
@io = io
end
def getc
(0xff ^ @io.getc[0]).chr # Ruby 1.8
end
# 他のメソッドもオーバーライドする必要がある
end

texture = open("hoge.png") do |fp|
XorIO.new(str) do |io|
Texture.load(io)
end
end

復号アルゴリズムが書かれているスクリプトは
どう隠蔽するのって問題にはなりますが、
それはおいおい考えていけばよいかなと思います。
とりあえず画像ファイルが直接開けなくなる、だけでずいぶん違うんじゃないかと。

> Texture#crypted?みたいなプロパティは必要なのかなぁ。

それはいらないんじゃないかと思います。
画像ファイルが暗号化できればいいのであって、
Texture オブジェクトはそのことに関与しない、でよいと思います。

--
Hajime Hoshi <hajim...@gmail.com>

Hajime Hoshi

unread,
Jul 23, 2008, 5:38:50 AM7/23/08
to star...@googlegroups.com
星です。

> XorIO.new(str) do |io|

XorIO.new(fp) do |io|

でした。

--
Hajime Hoshi <hajim...@gmail.com>

ISA

unread,
Jul 23, 2008, 6:40:51 AM7/23/08
to Star Ruby
> * ライブラリ側で用意したものは復号アルゴリズムがばればれなので無意味

確かに、そもそもStarRubyで復号できるのであまり暗号の意味がないですね。
saltを渡すにせよソースに書いてあればそのままsaveできますし。

暗号化Textureはsaveできないようにすれば解決?
と思ったけど、空のTextureに書き込んでそれを保存すれば結局取れてしまいますね。

----
> 代わりに、「Texture.load の第一引数に IO オブジェクトを渡せる」ようにして、
> 暗号化、複合化をゲーム作る側が自由に定義できるようにすればよいと思いました。

IOオブジェクトを渡せるようになるのは非常に便利になると思います。
複数の画像を合わせてアーカイブすることもできるようになりますし。

----
> IO に対してフィルターをかける IO がほしいんですが、 Ruby だとどうやるのがいいんでしょう…。

IOオブジェクトを継承して独自のクラスを作ったとしても、オープンするには

XorIO.open(IO.sysopen("hoge")) do |io|
p io.getc
end

のようにしないといけないような感じですね(マニュアルを読む限り)。
あまり良い手が思いつきません。

----
> 復号アルゴリズムが書かれているスクリプトは
> どう隠蔽するのって問題にはなりますが、
> それはおいおい考えていけばよいかなと思います。
> とりあえず画像ファイルが直接開けなくなる、だけでずいぶん違うんじゃないかと。

IOから開けるようになるだけでずいぶん夢は広がると思います!

----
> > Texture#crypted?みたいなプロパティは必要なのかなぁ。
> それはいらないんじゃないかと思います。
> 画像ファイルが暗号化できればいいのであって、
> Texture オブジェクトはそのことに関与しない、でよいと思います。

ここまで考えると確かに不要ですね。
暗号、復号は完全にユーザの裁量で行えうわけですし。
Message has been deleted

dan...@gmail.com

unread,
Jul 23, 2008, 10:16:22 PM7/23/08
to Star Ruby
だんです。

フォルダを開くと画像データが簡単に見えちゃうのがまずいわけですよね。

暗号化するかどうかは別として、複数の画像データファイルを1つのファイルに
合体させたらどうでしょうか。

ゲームによっては画像ファイル数が数千とか数万といった数になるのですが、
総容量が少なくてもファイル数がやたら多いと配布時になにかと面倒なことがあります。

ファイルの連結なら音楽ファイルも大丈夫ですし。

Hajime Hoshi

unread,
Jul 24, 2008, 2:04:32 AM7/24/08
to star...@googlegroups.com
星です。

> だんです。
>
> フォルダを開くと画像データが簡単に見えちゃうのがまずいわけですよね。
>
> 暗号化するかどうかは別として、複数の画像データファイルを1つのファイルに
> 合体させたらどうでしょうか。
>
> ゲームによっては画像ファイル数が数千とか数万といった数になるのですが、
> 総容量が少なくてもファイル数がやたら多いと配布時になにかと面倒なことがあります。

たしかに。
聞いた話では、 Windows は、ファイル数が多いと zip の展開が遅くなるらしいですね。
Texture.load が IO を取るようになればこれもできますね。
(ゲーム作る側が何らかの手段でファイルを分割して IO を作らなければなりませんが。)

> ファイルの連結なら音楽ファイルも大丈夫ですし。

なぜ大丈夫なのでしょう?
SDL_mixer の API にはファイル名を指定するものしかなかったと思いますが。

--
Hajime Hoshi <hajim...@gmail.com>

ISA

unread,
Jul 24, 2008, 3:00:29 AM7/24/08
to Star Ruby
> (ゲーム作る側が何らかの手段でファイルを分割して IO を作らなければなりませんが。)

Texture.loadの第二引数でサイズを指定できるようにすれば

open("data") do |io|
t1 = Texture.load io, :length => io.getbyte
t2 = Texture.load io, :length => io.getbyte
end

のようにPascal文字列のような格納方法ができますね。
IOの作成が一度だけになるので高速で処理できそうな気がします。

Hajime Hoshi

unread,
Jul 24, 2008, 3:35:33 AM7/24/08
to star...@googlegroups.com
星です。

なるほど。それ採用しましょう。
キーの名前が "length" だと一般的過ぎる気がします。
"io_length" にするかもしれません。

ところで、 IO#getbyte というメソッドは見当たりませんが、
個々のファイルのサイズの整数と解釈して OK ですよね?

--
Hajime Hoshi <hajim...@gmail.com>

ISA

unread,
Jul 24, 2008, 4:28:57 AM7/24/08
to Star Ruby
> なるほど。それ採用しましょう。
> キーの名前が "length" だと一般的過ぎる気がします。
> "io_length" にするかもしれません。

ありがとうございます。
確かにキーはio独特のものにしたほうが良いと思います。

# 第一引数にファイル名か配列、ってのは何のライブラリだっけ

----
> ところで、 IO#getbyte というメソッドは見当たりませんが、
> 個々のファイルのサイズの整数と解釈して OK ですよね?

あー、そうです。
1.9からgetcが文字単位になるので導入されたのですが、
移行措置として1.8.7にバックポートされたようです。

Daigo

unread,
Jul 24, 2008, 4:58:22 PM7/24/08
to Star Ruby
皆さんご存知かと思いますが、実行プログラムやリソースを単一Rubyファイルにパッキングできる、
tar2rubyscript というものがあります。
http://www.erikveen.dds.nl/tar2rubyscript/#1.0.0

StarRubyに新しい機能をつける代わりに、こちらで代替できないものでしょうか?

Hajime Hoshi

unread,
Jul 24, 2008, 11:29:21 PM7/24/08
to star...@googlegroups.com
星です。

それは起動にやたら時間かかるとか、まだまだ難点がありそうな。
Texture.load の引数に IO オブジェクトをとる改造はそう不自然じゃないし、
むしろもうやってしまったのでいいかなと思うのですが。

--
Hajime Hoshi <hajim...@gmail.com>

Reply all
Reply to author
Forward
0 new messages