CipherFlute 復号 v16

3Dプリントした笛の並び(コーム)を、先頭の基準笛から順に1本ずつ吹くと、検出した音から秘密を復号します。マイクだけで動きます。

デモンストレーション用です。本物の秘密情報には使わないでください(理由と、版の履歴)。

マイクの許可を求めています…(表示が出たら「許可」してください)
Hz
今鳴っている音の目安です。各笛がここにきちんと出るのを確かめてから測ると確実です。 バーは音の強さ(笛の音域の中でいちばん強い山が、鳴っていると判定する高さからどれだけ上か)を表します。

1. 順番に吹いて測る(押しながら吹く)

押すと1秒の準備のあと拍が始まります。
押した瞬間から1秒の準備。その後、緑に光るたびに次の笛へ。最後の笛を吹いたら離してください。

2. 続けて吹く(無音で自動送り)

「開始」を押したら、笛を順に吹いていきます。1本吹くたびに一瞬(0.1秒ほど)息を切って無音をつくると、そこが区切りとして検出され、次の桁へ自動で進みます。拍に合わせる必要はありません。下の設定を入れると、息を切らずに続けて吹き、音が変わったところで区切ることもできます。
吹き終えたらもう一度ボタンを押して「終了し復号」します。終わりを決めるのは利用者であり、システムは秘密が何本あるかを知りません。途中で間が空いても勝手に確定しないので、急かされずに吹けます。余計な音が1本入ってしまったときは「1本取り消す」で戻せます。
開始すると、まず部屋の静けさを0.4秒ほど測り、そこを基準に区切りを判定します。
100 ms
短くすると速く吹けます。1本のつもりが2本に切れるときは長くしてください。吹いている途中でも変えられます。
息継ぎをせず、唇を当てたまま次の笛へ滑らせて読めます。隣り合う笛が同じ音だと1本に融合してしまうので、同じ音が隣り合わない並びのときだけ使ってください(印刷済みのスプールとカードはどちらも条件を満たしています)。
区切りの細かい調整
50 セント
小さくすると音の変わり目を拾いやすくなります。半音は100セントです。上の「音が変わったところでも区切る」に入れているときだけ効きます。
70 ms
離れた音がこの時間続いたら、そこで区切ります。短くすると速く反応しますが、吹き始めの音の揺れで誤って区切りやすくなります。
120 ms
咳や物音を1本と数えないための足切りです。速く吹いて取りこぼすときは短くしてください。
鳴らない笛があったら「この笛は飛ばす」を押してください。その位置を空けたまま次へ進めるので、並びがずれません。空けた分は誤り訂正で埋められます(検査用の笛が足りていれば復元できます)。
その場で吹く代わりに、録音した音声(m4a・wav・mp3など)を読み込んで同じように解析します。 うまく読めなかったときに、何度でも条件を変えて試せます。マイクの許可は要りません。
担体が複数あるとき(スプール2枚など)は、吹いた順にまとめて選べます。 名前の順に続けて読み、担体の切れ目は持ち替えの空白として扱うので、あらかじめ音声を繋いでおく必要はありません。
録音を読み込むと自動でも復号します。設定を変えたあとに押し直せます。

2''. 一定のテンポで吹いて、あとから読む(おすすめ)

その場で録音して、あとからまとめて読みます。読み取りは録音ファイルを読むときとまったく同じ道を通ります。
吹いている最中は何も判定しません。拍の印に合わせて、止まらずに最後まで吹いてください。 鳴らない笛があっても、そこは休符のつもりで1拍ぶん空けて次へ進みます。あとから拍を見て、空いた位置に「飛ばし」を入れます。
途中で担体を持ち替えるとき(スプール2枚など)は、拍を気にせず3秒以上ゆっくり持ち替えてください。持ち替えの空白として扱われ、笛の数には数えません。
700 ms
拍の印が動きはじめたら、その速さで吹いてください。

2'. 1文字ずつ入力(1本ずつ確定)

「開始」を押すと1本ぶんの音を受け付けます。いま鳴っている音が下に出ます(新しい音に上書き)。「入力」でその音を1本ぶん確定。全部入れ終えたら「終了して復号」。

3. 復号して照合

秘密 payload (hex):
照合:

4. 2枚を合わせて認証する(2-of-2)

秘密を2つに分けて2枚のカードに入れてある場合の読み方です。片方には乱数が、もう片方には「秘密−乱数」が入っているので、2枚そろって初めて秘密が出ます。1枚だけでは何も分かりません。
1枚ずつ別々に読みます。それぞれのカードが自分の基準笛を先頭に持っているためで、2枚を続けて吹くと2枚目の基準笛がデータとして読まれてしまいます。読み方は「2. 続けて吹く」と同じで、息を切るか音の変わり目で自動的に次の笛へ進みます。
吹き始めはストラップ穴と同じ側の端の笛です。そこから反対の端へ向かって8本を続けて吹き、もう一度ボタンを押して確定してください。
いま印刷してあるカードは検査用の笛が1本だけなので、途中の笛が鳴らなかったときは訂正が効きません。読めなかったらそのカードを吹き直してください(何度でもやり直せます)。
合わせた秘密:
照合:

5. いくつかそろえば開く(k-of-n の秘密分散)

秘密を複数に分けてある場合の読み方です。決められた数だけそろえば開き、それに満たなければ何も分かりません。いくつか失っても残りで復元できます。
担体(カード・箱・本立て・画像タイルなど)には番号が彫ってあるか、作ったときに決めてあります。番号は復元の計算に必要なので、吹く前に選んでください。読み方は「2. 続けて吹く」と同じです。
例。北斎の画像タイル9枚は 2-of-9 なので、どの2枚でも開きます。左上から右へ1・2・3、次の行が4・5・6、最下段が7・8・9です。
合わせた秘密:
照合:

このページについて

★デモンストレーション用です。本物の秘密情報には使わないでください★(押すと理由が開きます)
このページはCipherFluteのデモンストレーション用です。本物の秘密情報には使わないでください。 仕組みを実際に試して見ていただくことを目的に作ってあり、秘密情報の扱いには次のような弱点が残っています。
  • 照合用の値や遷移先といった設定を、URLに載せて渡しています。そのためURLを手に入れた人は、笛を持っていなくても、手元で秘密の候補を片端から試せます。暗証番号のような小さい秘密であれば、これだけで破られます。
  • 復号した秘密は画面に表示されます。周りから見えますし、画面の記録にも残ります。
  • 吹いた音は聞こえるので、その場にいる人や録音した人には秘密が伝わります。
実際に秘密を守る用途では、これらの情報をURLに載せず別の適切な手段で受け渡し、復号も管理された場で行う必要があります。 なお、笛という物体そのものに秘密を守る力はありません。保管場所を知られた場合は、吹かなくても計測や透過撮影で読み取れます。
照合用:期待する音列を貼る(デバッグ)

設計どおりの音列を空白区切りで貼ると、吹いた結果と1本ずつ突き合わせて色分けします。 例 C7 G7 D#7 F7 G#6 A#6 C#7 D#7。基準笛を含めて先頭から並べてください。

版の履歴

v16(2026-08-18)… 画面の並びを直しました。冒頭にあった注意書き・版の履歴・照合用の入力欄(デバッグ)を、このページの末尾へ移しています。実演のときに、吹くための操作がすぐ目に入るようにするためです。
v15(2026-08-07)… 新しい入口「2''. 一定のテンポで吹いて、あとから読む」を足しました。吹いている最中は何も判定せず、その場で録音するだけです。読むのは終わってからで、録音ファイルを読むのとまったく同じ道を通ります。鳴らない笛があっても、拍を1つ空けて吹き続ければ、あとから拍を見て自動で「飛ばし」が入ります。途中で判定する入口は、気づいて立ち止まると拍が崩れてかえって直せなくなるため、こちらを勧めます。
v14(2026-08-07)… 照合用の音列を expect= でURLに仕込めるようにしました。吹いている最中は、直前の1本が期待と合っていたかと次に吹く音を案内し、違ったときは「この笛は飛ばす」を押すよう促します。鳴らない笛でつまずいてもそこから先がずれません。
v13(2026-08-07)… マイクで拾うときも、録音とまったく同じ「笛の音域の中でいちばん強い山を追う」方式にしました。これまでの自己相関にもとづく検出は符号の最低音 G#6 を誤ります。あわせて、復号の結果をこの節にも出し、「いまの音列で復号する」ボタンを付けました。
v12(2026-08-06)… 録音ファイルの音の高さを、笛の音域だけを見てFFTの山を追う方式に替えました。これまでの方式は符号の最低音 G#6(1661Hz)を 3992Hz と誤り、それが復号を止めていました。スプール2枚の録音で128ビットの秘密が復元できています。担体が複数あるときは録音をまとめて選べるようになり、あらかじめ音声を繋いでおく必要がなくなりました。
v11(2026-08-06)… 音域から外れた音を列から消さず、読めなかった印を付けて残すようにしました(消すと位置が詰まって以降がずれます)。倍音の引き戻しはやめ、飛ばしとしてパリティに直させます。
v10(2026-08-06)… 録音ファイルを読み込めるようにしました(マイクの代わり。節2の下)。あわせて、音域のすぐ外にある音を倍音と取り違えないようにしました。
v9(2026-08-06)… 担体を持ち替える空白を「鳴らなかった笛」と誤解しないようにしました。スプール2枚のように途中で持ち替える読み方でも、本数が狂いません。
v8(2026-08-06)… 鳴らなかった笛を「除外」ではなく「飛ばし」にしました。位置を保つので、誤り訂正のパリティで直せます。拍に音が来なかったところにも飛ばしを入れます。
v7(2026-08-06)… 秘密分散の節で、担体の番号を1〜9から選べるようにしました(画像タイル9枚の 2-of-9 に対応)。
v6(2026-08-06)… 「続けて吹く」で、吹いたテンポを手がかりに雑音を見分けるようにしました。 捨てられた音も列に残し、拍に乗っていれば拾い直します。各音はクリックで除外・復帰できます。

これまでの版 v5 … 期待する音列を貼ると、吹いた結果と1本ずつ突き合わせて色分けします。
v4 … v3で音域外の音が鳴るとページが固まる不具合を直しました。
v3 … 符号の音域から外れた音を、列にも入れないようにしました。
v2 … 音名を基準笛で補正して表示するようにし、倍音の取り違えをオクターブ単位で引き戻すようにしました。

復号ロジックは cipher_codec.js(Python版 fue/cipher_codec.py と一致)。設定は cipher_config.json。音の高さは fft_peak.js で読みます(笛の音域の中でいちばん強い山を追う方式。マイクでも録音でも同じ)。測定・較正ツールは こちら

認証成功

秘密のページへ移動します…