キー・署名ツール¶
キー・署名ツールについて¶
キー・署名ツール (krkrsign) は、配布するデータに対し、簡単な電子署名を行うためのツールです。
電子署名を使えば、ファイルが正当な制作者によって作成された物であることのチェック、ファイルの改ざんチェック、破損チェックを行うことができます。
現在では、
- ファイル破損チェックツール
- 吉里吉里Z 本体で署名を確認する sigcheck プラグイン (
Window.checkSignature)
がこの署名を利用します。
入手方法¶
キー・署名ツールは、吉里吉里Z の 標準ツール のひとつです。
- krkrz_dev で本体をビルドすると一緒にビルドされ、
make installでインストール先のtools/フォルダにkrkrsign(Windows ではkrkrsign.exe) が置かれます - ソースは krkrz_tools リポジトリにあり、単体でビルドすることもできます
ツールは実行ファイル 1 本で動きます (Windows / Linux / macOS)。
公開鍵・秘密鍵について¶
キー・署名ツールを使うためには、このツールを使って「公開鍵」(public key)と「秘密鍵」(private key)という2つの対になる(ペアになる)キー(キーペア)を作成する必要があります。
鍵といっても、実体は以下のような形式の文字列です。
-----BEGIN PUBLIC KEY-----
MIGJAoGBAJYfPysW57qE3J2ddGWEG+RzXUzFkWa0ct3p7qJfuWDB+52DbfS9qSpw
iTHQ54vl7K35x+WDQdn29cfgJxp9UD3fzY4h6E2ReE9vj4h0FCMK8dpCFnQkOD/M
hDSiXfXz7KmfMXppM0CjofvH+IL7BJ3/GcLFcuEw3hEnzoajIm1TAgMBAAE=
-----END PUBLIC KEY-----
公開鍵は公開してもかまわないキー、秘密鍵は公開してはならないキーです。
署名を行うときには秘密鍵を用います。電子署名は、その秘密鍵を使って生成します。
その署名を確認するときには公開鍵を用います。秘密鍵と公開鍵は常に対になり、該当する秘密鍵を使って行った署名のみが、その秘密鍵と対になる公開鍵で正常に確認できます。
秘密鍵を知らない者が他の秘密鍵で署名しても、正当な公開鍵では署名を確認できないことになります。公開鍵から秘密鍵を推測することは不可能ですので、秘密鍵を持っている人しか正当な署名ができないことになります。
Note: 秘密鍵はパスフレーズでの保護は行われず、テキストファイルとしてそのまま保存されます。秘密鍵のファイルは、配布ファイルやバージョン管理の公開リポジトリなどに含めないよう、取り扱いに注意してください。秘密鍵をなくすと、同じ公開鍵で確認できる署名は二度と作れません。
Note: 本来は、その「公開鍵」が公開される際に、その「公開鍵」が正当な物かどうかを確認させる必要があります。公開鍵がそもそも正当なものかどうかが分からなければ、電子署名の意味は薄くなります。しかし、吉里吉里のキー・署名ツールではそこまでの考慮は行っていません。
Note: 吉里吉里のキー・署名ツールが用いる暗号方式は RSA です (署名は SHA-256 のハッシュに対する RSA-PSS)。
生成する RSA キーの長さは既定で 1024 ビットで、吉里吉里2 のキー・署名ツールと同じです。2048 / 3072 / 4096 ビットを選ぶこともできます。
吉里吉里のキー・署名ツールが生成するRSA公開鍵・秘密鍵は他のソフトウェアのPEM形式のキーと互換性がありますが、キー・署名ツール以外で生成したキーを使った場合、あるいはキー・署名ツールで生成したキーを他のソフトウェアで使用した場合の動作はサポート外です。
吉里吉里2 との互換性¶
- 吉里吉里2 のキー・署名ツールで作った鍵は、そのまま使えます
- 吉里吉里2 のキー・署名ツールで作った署名 (.sig と、exe に埋め込まれた署名) は、このツールで確認できます
- このツールで作った署名は、吉里吉里Z の sigcheck プラグインで確認できます
コマンドラインの書式は吉里吉里2 のツールから変わっています (後述の「コマンドラインからの使用法」を参照)。
キー生成のしかた¶
キー・署名ツールを起動すると、ブラウザのウィンドウで画面が開きます (画面は実行ファイルに埋め込まれているので、インターネットへの接続は要りません)。画面は「鍵の生成」「署名」「署名の確認」の3つのタブに分かれていて、最初に表示されるのは「鍵の生成」です。
- 鍵の長さ
生成するキーの長さを選びます。通常は既定の 1024 bit (吉里吉里2 のツールと同じ) でかまいません。 - 「鍵を作る」ボタン
クリックするとキーペアの生成が始まります。長い鍵では数秒かかることがあります。
生成が終わると、下の「公開鍵」と「秘密鍵」の欄に、生成されたキーペアが表示されます。欄の内容はコピーして使うこともできます。
- 保存先フォルダ・ファイル名
生成したキーペアを保存するフォルダとファイル名を指定します。ファイル名の既定は公開鍵が public.txt、秘密鍵が private.txt です。
- 「保存」ボタン
公開鍵と秘密鍵を、それぞれのファイルに保存します。同じ名前のファイルが既にある場合は保存しません。上書きする場合は「上書き」をチェックしてください。
鍵は生成しただけでは保存されません。画面を閉じる前に保存してください。
署名のしかた¶
「署名」タブをクリックすると、署名の画面が表示されます。
- 秘密鍵
秘密鍵のファイルを指定してください。「参照…」ボタンで選ぶこともできます。 - 対象ファイル
署名の対象となるファイルを指定します。1 行に 1 ファイルずつ書くか、「追加…」ボタンでファイルを選んで追加してください。複数のファイルを一度に署名できます。「クリア」ボタンで一覧を空にします。 - 「署名する」ボタン
対象となるファイルを署名します。結果はファイルごとに一覧で表示されます。
署名ファイルは、対象ファイルのファイル名に、拡張子 .sig が付加されたファイル名になります (例: data.xp3 の署名は data.xp3.sig)。既に .sig がある場合は上書きします。
Note: 吉里吉里Z の本体 (実行可能ファイル) には、吉里吉里2 のような「exe の中に署名を埋め込む領域」がありません。そのため本体も、他のファイルと同じく «ファイル名.sig» に署名します。ファイル破損チェックツールは .sig の無い本体をチェックしないので、本体にも必ず署名をしてください。
吉里吉里2 の本体のように署名を埋め込む領域を持つ exe に署名した場合は、.sig は作らずに exe の中へ署名を書き込みます。
Note: 署名したあとにファイルを変更すると、署名の確認に失敗します。exe のアイコンやリソースの書き換え、xp3 の結合などは署名の前に済ませ、署名は配布物を作る最後の手順として行ってください。
署名確認のしかた¶
「署名の確認」タブをクリックすると、署名確認の画面が表示されます。
- 公開鍵
公開鍵のファイルを指定してください。「参照…」ボタンで選ぶこともできます。 - 対象ファイル
署名確認の対象となるファイルを指定します。署名と同じく、1 行に 1 ファイルずつ書くか「追加…」ボタンで追加します。複数のファイルを一度に確認できます。 - 「確認する」ボタン
対象ファイルの署名を確認します。
結果はファイルごとに「正常」「破損」「エラー」で表示されます。ファイルが変更されている場合や、別の鍵で作られた署名・壊れた署名の場合は「破損」、.sig が無いなどで確認できない場合は「エラー」となります。
コマンドラインからの使用法¶
--cli を付けると、画面を開かずにコマンドラインで鍵の生成・署名・署名確認を行うことができます。これはmakeなどのツールと組み合わせて使うときに便利です。
以下の書式で指定します。値を取るオプションは --名前=値 の形で書きます。
krkrsign --cli keygen [--bits=1024] [--public=FILE] [--private=FILE] [--force]
krkrsign --cli sign --key=<秘密鍵ファイル> <ファイル>...
krkrsign --cli verify --key=<公開鍵ファイル> <ファイル>...
- keygen
キーペアを生成し、公開鍵を--public(既定 public.txt)、秘密鍵を--private(既定 private.txt) のファイルに保存します。鍵の長さは--bitsで 1024 (既定) / 2048 / 3072 / 4096 から選びます。ファイルが既にある場合は失敗します。上書きするには--forceを付けます。 - sign
--keyの秘密鍵で、指定したファイルに署名します。一回の呼び出しで複数のファイルを署名できます。 - verify
--keyの公開鍵で、指定したファイルの署名を確認します。
鍵のファイルは、鍵をテキストとして保存したファイルです。ファイルの中から -----BEGIN ...----- 〜 -----END ...----- の部分を探して読むので、ファイル破損チェックツールの設定ファイル (.ini) を公開鍵として指定することもできます。
--json を付けると結果を JSON で出力し、--quiet を付けると進捗を表示しません。
たとえば、鍵を作って game.exe と data.xp3 に署名する場合は
krkrsign --cli keygen
krkrsign --cli sign --key=private.txt game.exe data.xp3
と指定します。署名すると、以下のように作られた署名ファイルが表示されます。
署名 game.exe game.exe.sig
署名 data.xp3 data.xp3.sig
署名を確認する場合は
krkrsign --cli verify --key=public.txt game.exe data.xp3
と指定します。ファイルごとに「正常」「破損」「エラー」が表示されます。
終了コードは以下のとおりです。
| 終了コード | 意味 |
|---|---|
| 0 | 成功 (verify では、すべて正常) |
| 1 | verify で、破損したファイルがある |
| 2 | 失敗 (鍵が読めない、ファイルが読めない・書けない、.sig が無いなど) |
Note: 吉里吉里2 のツールの
krkrsign -sign "対象ファイル名" "秘密鍵ファイル名"という書式は使えません。krkrsign --cli sign --key=秘密鍵ファイル名 対象ファイル名に書き換えてください。
ツール共通のオプション (--help など) は 標準ツール を参照してください。
署名ファイル (.sig) の形式¶
署名ファイルはテキストファイルで、1 行目が -- SIGNATURE - SHA256/PSS/RSA --、続く行が署名を Base64 で表したもの (64 文字ごとに改行) です。署名は、ファイル全体の SHA-256 ハッシュに対する RSA-PSS 署名です。
署名を埋め込む領域を持つ吉里吉里2 の exe では、同じ形式の文字列を exe の中の署名領域に書き込みます。このとき、署名領域を含む exe 内の埋め込み領域はハッシュの計算から除かれます。
吉里吉里Z 本体での署名の確認¶
sigcheck プラグインを使うと、ゲームの中から署名を確認できます。たとえば、ネットワークからダウンロードしたファイルが正当なものかを確かめる、といった用途に使えます。
Window.checkSignature(ファイル名, 公開鍵, ユーザ情報) で確認を始めると、確認はバックグラウンドで行われ、終了時に onCheckSignatureDone イベントで結果 (1 = 成功、0 = 失敗、-1 = キャンセル、-2 = エラー) が通知されます。.sig のあるファイルは .sig を使って確認します。
Note: 別の鍵で作られた署名や壊れた署名は、キー・署名ツールでは「破損」と表示されますが、sigcheck プラグインでは «エラー (-2)» として通知されます。