For AI agents: the complete documentation index is available at https://renmori.mewbaka.cn/ja/llms.txt, the full documentation bundle is available at https://renmori.mewbaka.cn/ja/llms-full.txt, and this page is available as Markdown at https://renmori.mewbaka.cn/ja/index.md.
  • 日本語
  • RenMori
    商用 Ren'Py ビジュアルノベル向けの
    全データ保護ツール

    MewBaka が公開、プレイ体験を損なうことなくビジュアルノベルを保護

    pip
    uv
    pipx
    pip install renmori
    RenMoriRenMori

    全データ暗号化

    スクリプト、立ち絵、CG、音声、動画、フォント、翻訳、設定をすべて暗号化コンテナに格納し、実行中のエンジン内部でのみ復号するため、ディスク上に平文のアセットを残さない

    非侵入型

    Ren'Py ランチャーが生成した配布用ビルドや .zip アーカイブを直接処理し、プロジェクトのソースや既存の開発フローを変更する必要がない

    ビルドごとの差異化

    ビルドごとに異なる保護が生成されるため、特定の作品やバージョンに対する解析結果を他のビルドに流用できない

    デフォルトで設定不要

    そのまま利用でき、任意の renmori.toml でチャンクサイズ、除外リスト、ロック、保護強度、鍵の取得元を制御可能

    CI を前提とした設計

    機械可読な JSON 結果と明確な終了コードを出力し、renmori verify をパイプラインのゲートとして配布用ビルドごとにアーカイブ化と検証を自動化

    商用利用も無料

    商用作品を含め、あらゆる Ren'Py ゲームの保護は無料であり、ランタイムはゲームと共に無償で再配布可能

    データと検証

    以下のデータはすべて RenMori リポジトリのマイルストーン検証記録とコンテナ形式仕様に基づくものであり、各項目に測定または算出の条件を記載しています。

    74 MB/s
    エンジン内シーケンシャル復号
    ベースライン参照リーダーで実測 ¹
    ≈ 0.024%
    コンテナのサイズオーバーヘッド
    形式仕様から算出 ²
    7 / 7
    バイト単位で一致したアセット種別
    SHA-256 照合 ³
    0
    復元可能なファイルシグネチャ
    ギガバイト級コンテナを走査 ³

    復号スループットとリアルタイム再生の要件

    ベースラインの Python 参照リーダーは、数 MB 規模のアセットに対してエンジン内で約 74 MB/s のシーケンシャル復号スループットを記録しており、リアルタイムの動画・音声デコードに必要な数 MB/s を大きく上回ります。製品版のネイティブ復号器はチャンクごとの Python 呼び出しのオーバーヘッドを排除していますが、そのスループットは個別には未測定です。

    チャンク構成とサイズオーバーヘッド

    模式図(縮尺は実際と異なる)

    offset(i) = data_offset + i × (chunk_size + 16)

    各チャンクは 16 バイトの GCM 認証タグを伴って個別に暗号化され、サイズオーバーヘッドは 16 / 65,536 ≈ 0.024% です。これに加えて 64 バイトのヘッダーと暗号化インデックスが付属します。チャンク間隔が固定されているため任意の位置へ直接シークでき、大きなファイルは全体をメモリに読み込むことなくストリーミングで復号されます。

    ディスク上のファイル

    保護前一般的な配布用ビルド(例示)
    • game/archive.rpa平文
    • game/images.rpa平文
    • game/script.rpyc平文
    • game/script.rpy平文
    保護後
    • game/renmori.rmc暗号化コンテナ
    • game/renmori.rpeランタイムローダー

    保護後のディスク上には平文のアーカイブ、.rpyc、.rpy は一切残らず、すべてのアセットは暗号化された状態でコンテナ内にのみ存在します。ランタイムが追加で生成するのは cache/ ディレクトリのみです。

    既存ツールとシグネチャ走査

    ツール実測結果
    unrpaコンテナを拒否:RPA アーカイブではないため、バージョンの自動判別に失敗
    unrpyc対象なし:デコンパイル可能な .rpyc や .rpy がディスク上に存在しない
    マルチバイトのファイルシグネチャ
    • PNG検出なし
    • RENPY RPC2検出なし
    • OggS検出なし
    • RIFF検出なし
    • OTTO検出なし
    • zip検出なし

    ギガバイト級のコンテナに対するシグネチャカービングでは、マルチバイトのファイルシグネチャは一切検出されず、統計的に想定される 3 バイトの偶然一致のみが残り、いずれも復元できませんでした。コンテナはランダムデータと区別できません。

    アセット種別の検証

    アセット種別供給経路結果
    画像:立ち絵、CG(PNG/JPG)バッファバイト単位で一致
    音声(Opus/OGG)バッファバイト単位で一致
    スクリプト(.rpyc)バッファバイト単位で一致
    翻訳(tl/<language>/)バッファバイト単位で一致
    フォント、小(TTF)バッファバイト単位で一致
    フォント、数 MB 規模(TTF)ストリーミングバイト単位で一致
    動画、大容量(WebM/OGV/AVI)ストリーミングバイト単位で一致

    すべてのアセット種別をエンジン内の実際の renpy.loader で復号し、元ファイルの SHA-256 と照合しました。

    暗号仕様

    認証付き暗号
    AES-256-GCM
    鍵導出
    HKDF-SHA256(RFC 5869)
    鍵の粒度
    ファイルごとに独立した鍵
    チャンク
    デフォルト 64 KB、チャンクごとに 16 バイトの認証タグ
    ランダムアクセス
    任意のチャンクへ直接シーク、大容量ファイルはストリーミング
    ビルドの独立性
    ビルドごとに独立した container_id とファイル鍵を生成し、異なるビルドの鍵は相互に利用不可
    ビルドごとの多態化とネイティブ難読化
    ビルド時の変換であり、ランタイムのオーバーヘッドはなし
    1. ¹ Ren'Py 8.5.2 エンジン内で、Python 参照リーダー(ctypes 経由で librenpython の OpenSSL EVP を使用)により、64 KB チャンクの AES-256-GCM で数 MB 規模のアセットを順次読み込んで測定。製品版のネイティブ復号器は未測定。
    2. ² コンテナ形式 v1 仕様から算出した値であり、実測値ではない。
    3. ³ Ren'Py 8.5.2 上で、SDK サンプルプロジェクト the_question と、数千件のアセットを含むギガバイト級の配布用ビルドを用いて検証。

    データの出典(英語): M1 の成果 · コンテナ形式 v1 · アーキテクチャ · M4