OpenRung
A free, privacy-first relay network that helps you reach the open internet. Open source and nonprofit-run.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Split a secret QR into printable visual cryptography shares and recover it by overlaying sheets. Day125.
翻訳待ち
Loading the full README.
Read the full README ↗English · 日本語
Day125 - 生成AIで作るセキュリティツール200
Overlay QR Sharesは、秘密の文字列を載せたQRコードを視覚暗号で2〜5枚のシートに分け、必要な枚数を重ねてカメラで復元するツールです。 「どれか2枚」または「全部」を選び、短い復旧コードや金庫の番号などを別々に保管する使い方を試せます。
本ツールは実験用の公開版です。 唯一のバックアップにはせず、別の復旧手段を残してください。 読み取りに成功しても、改ざんがないことの証明にはなりません。
2026-10-24の作者の実物試験で、(2,2)、版4、Mの紙2枚をトレース台で重ね、2.54mmと2.032mmの両寸法でiPhone上の本ツールによる復元を確認しています。 この確認は記録した条件に限られるため、本番の秘密を入れる前に、使うプリンターと素材でテスト印刷から読み取りまでを確認する必要があります。
名前は、重ねることを表す「overlay」、QRコードの「QR」、分け札を表す「shares」を組み合わせています。 秘密分散を数値計算で戻すDay124とは異なり、紙やフィルムの黒い部分を重ねる光学的なORでQRの濃淡を戻します。 その濃淡を判定して文字列に戻すための端末は必要です。
リポジトリーを一式保存し、index.htmlをfile://で開いても使えます。
秘密の分割と復元はブラウザー内で行い、秘密やシートのデータをアプリから外部へ送信しません。
公開版の読み込みや外部リンクへの移動には通信が発生します。
ライブラリーは同梱しており、実行時のCDNや追加パッケージはありません。
印刷データはOSの印刷処理へ渡され、プリンターへの送信やPDF保存は選んだ印刷経路に従います。
カメラを使えないローカル環境では画面の案内からGitHub Pages版を開いてください。
秘密を扱う場合は、保存したコードと信頼できる端末を使い、オフラインでの動作も事前に確認してください。
以下の5枚はライトモードで、例の文字列はテストベクターのTEST-OQS-1です。
右上の丸いボタンで明暗、言語、ヘルプを切り替えます。
用意するもの、テスト印刷から始める案内、今の段階を示す4つの段階が並ぶ画面。
図柄を画面に出さず、記号とセットIDでシートを選んで印刷。
A4の上半分に正像、下半分に上下の鏡像を置いたデモ用の版下。
①印刷面同士を合わせる、②カメラで読む。①は手順ごとに図を添え、冒頭のリンクから②へ移れます。
白黒の柄を重ねる原理と、計算による秘密分散との比較。
「分ける」の冒頭には、用意するものと、テスト印刷から始める案内があります。 上部の4つの段階は今の段階を示し、押すとその見出しへ移ります。 「分ける」で枚数と戻す条件を選びます。 最初は2枚に分けて2枚で戻す(2,2)、版4、誤り訂正M、2.54mmを選び、「テスト用のシートを作る」を押してください。 テスト用の文字列はランダムに作られ、秘密の入力欄は使いません。 版3と4では2.032mmと2.54mmのテストセットをそれぞれ作り、各シートを別のA4用紙に印刷します。 版5〜7は2.032mmだけが収まります。 テスト用のシートは寸法ごとにまとめて表示し、選んでいる寸法の組を先に出します。 初回は2.54mmでセットIDが同じカードを選び、「シート TA を印刷」「シート TB を印刷」を押して、それぞれ1枚ずつ印刷します。 同じTAという記号でも寸法やセットIDが異なるものを混ぜないでください。
2枚の紙を重ねる例として、AとB(テストではTAとTB)で説明します。
上のQRの大きな四角(位置検出パターン)3つを、両シートの輪郭がぴったり1本になるまで合わせます。 周囲の小さい四角(■。1か所は中抜き)は、両シートの対応する位置どうしが重なることを補助にします。 QRの脇の中間位置にある黒い長方形どうしを重ねる必要はありません。 長方形を合わせるためにシートをずらさないでください。 撮影時には、上のQRと周囲の小さい四角をカメラに入れます。 鏡文字の確認表示「裏返し OK」が読めることも確認します。 紙の端では合わせません。 プリンターの位置の片寄りが裏返しによって2倍になり、作者の予備試験では3mmのずれが生じました。
重ねた紙の裏から十分な光を通し、反対側から撮影します。
トレース台を使うと平らに置きやすく、表面への照明の映り込みが多い場合は室内照明を落として調整します。
大きな四角が4つ見える場合は裏返し方を確認し、片方の文字だけがかすれる場合は印刷面が接触しているか確認してください。
作者の紙による予備試験で、iPhone標準のQRリーダーでは読み取り結果が出ませんでした。
この観察だけでは、QRの位置検出、復号、結果の表示のどの段階で止まったかは区別できません。
標準のQRリーダーで読める保証はありません。
「重ねて読む」タブで復元値を表示し、テストカードのTEST-...と一致することを確認してから本番へ進みます。
このチェックは利用者による確認であり、公開版の方式の状態を「試験済み」に変える操作ではありません。
予備試験での観察とは別に、公開版OQS v1では後述する(2,2)、版4、M、2.54mmと2.032mmの条件で実物の復元を確認しています。
「全部」の3〜5枚は透明フィルムを使う実験です。 3枚以上の印刷面をすべて互いに接触させることはできません。 各フィルムの上の正像を同じ方向にそろえて重ね、厚みによる間隔やにじみの影響を別途確認してください。 普通紙を3〜5枚重ねる手順としては案内していません。
テスト用シートを作成したPCの「分ける」タブへ戻り、同じ方式と寸法で印刷したテストを読めたことにチェックを入れます。 確認欄のチェックは寸法ごとです。寸法を切り替えるとテストの組は残りますが、チェックは外れます。 チェックを入れるまで「分けて確かめる」は押せず、ボタンの下にその理由を表示します。 理由の中の「3 印刷したテストを読む」を押すと、その確認欄へ移ります。 秘密を入力し、「分けて確かめる」を押します。 初期設定の版4とMでは62バイトまでで、日本語の文字数とは一致しません。 入力を勝手に削除、正規化、短縮することはありません。 URLらしい入力と前後の空白には注意を出しますが、利用者が確認したうえで作成できます。
作成後は「機能の確認です。安全性の検査ではありません。」という説明と検査結果が表示されます。 記号とセットIDを確認して「シート A を印刷」のように1枚ずつ印刷します。 図柄を描き直す設定変更では、作成済みセットを画面と印刷対象から外し、作成途中の古い結果も捨てます。 言語や明暗の切り替えではセットを作り直しません。
実際の読み取りには、本ツールの「重ねて読む」に用意した専用の復元機能を使います。 撮影画像の射影と照明を補正し、各モジュール内のサブピクセルの濃淡を平均して白黒を判定し、通常のQRとして復号します。 「専用」は用意した機能を指し、このアプリだけでしか復元できないという意味ではありません。 同じ前処理を実装した別のリーダーでも復元できます。 同梱のread_photo.pyは、写真から通常の白黒QR画像を再構成する独立した実装です。 PBM形式の出力までを行い、文字列は復号しません。
「①印刷面同士を合わせる」と「②カメラで読む」の2つの欄に分かれています。 初めは両方とも開いており、見出しを押すとそれぞれ折りたためます。 ①では、裏返し方、横から見た重ね方、位置合わせの目印の図を、それぞれの手順の中に置いています。 タブの冒頭のリンクから、①を読み飛ばして②へ移れます。 準備ができたら①を閉じ、②で読み取ることもできます。 ②を閉じるとカメラは停止し、開き直しても自動では起動しません。
「カメラで読む」を押すと背面カメラを要求します。 基準マークの候補、位置検出パターン、機械読み取り帯、明るさ、モジュールの濃淡の順に処理します。 診断の「余裕あり」「ぎりぎり」「不足」は画像の条件を示す目安であり、秘密やシートが正しいことの証明ではありません。 位置のずれや明るさについての表示も原因の候補です。 診断は、白と黒の濃さを測れたときだけ表示します。 読み取り中の状態表示は数秒おきに更新し、しばらく読めない場合は理由を添えます。
自動で読めない場合は「止めて四隅を指定」を押し、止めた画像のQR周囲にある小さい4つの基準マークの中心を、画像上の左上、右上、右下、左下の順に指定します。 大きな四角3つは指定しません。 拡大鏡と近くのマークへの吸着を使えます。 キーボードでは矢印キーで移動し、Shiftを併用して細かく動かし、EnterまたはSpaceで点を選びます。 4点を選び終わる前なら「四隅を選び直す」で点を選び直せます。 「中止して映像を消す」で止めた画像を消します。 4点での読み取り後は成否にかかわらず停止画像を消すため、読めなければ「カメラで読む」から撮り直します。 読めなかったときは、理由とあわせてその案内を表示します。
読めるとカメラが止まり、値は目隠しされた状態になります。 「表示」で確認し、必要な場合だけ「文字列をコピー」を押してください。 コピーした値はOSのクリップボードやその履歴、同期機能の対象になる可能性があります。 カメラは停止操作、タブの変更、画面の非表示、ページを離れる操作でも停止します。
必要なシートがそろい、物差しとテスト読み取りを確認したら、印刷後のチェックリストに従って別々に保管します。 刷り損じを回収してシュレッダーで処分し、「すべて消す」で入力、シート、読み取り結果を消します。 「重ねて読む」にある同じ操作は、「分ける」の入力とシートも消すため「すべて消す(「分ける」も含む)」と表示します。 配列はゼロで上書きし、止めた画像も消去しますが、JavaScriptの文字列、ブラウザーやOSの内部コピーを確実に消去する保証はありません。
版下は純黒のSVGで、CSSの背景印刷を必要としません。 各シートは正像と上下の鏡像を同じA4に含みます。 2種類の寸法を同じA4へ詰めると所定の配置に収まらないため、テストセットも寸法ごとに別用紙です。
This is the beginning of the README. Read the rest at the original. Read the full README ↗