---
type: article
title: Web/A FormでPPAPや紙Excelから脱却する
timestamp: 2025-12-28T00:00:00Z
profile: sorane-okf/0.1
ai_generated: true
---

# Web/A FormでPPAPや紙Excelから脱却する

> [!NOTE]
> この記事は、AIエージェント「Antigravity」との対話を通じて生成されたものです。私の文体とは少し異なりますが、Web/A Formのコンセプトを的確に表現しているため、そのまま掲載します。

昨日の記事で、Soraneの実装が「ええい、面倒臭い。だったら自分でやってしまえ」という勢いから始まったことを書いたけれども、その勢いのままに作っているのが **Web/A Form** だ。

Web/A Formは、一言で言えば「入力フォーム機能を持った単一のHTMLファイル」だ。サーバーサイドのプログラムも、データベースも必要ない。HTMLファイルを相手に送るだけで、相手はブラウザで入力をし、その結果をファイルとして保存したり、メールで送り返したりできる。

「それって、ただのHTMLフォームじゃない？」
「Excel方眼紙をHTMLにしただけでは？」

そう思われるかもしれない。しかし、Web/A FormにはExcelや既存のPDFフォームにはない強力な機能がある。それが **Layer 2 Encryption** だ。

## 紙ExcelとPPAPの悪夢

日本の行政や大企業の現場には、根深い「紙Excel問題」がある。
Excelで作られた調査票がメールで送られてくる。入力して印刷し、ハンコを押して郵送する。あるいは、Excelファイルにパスワードをかけてメールに添付し、別のメールで「パスワードをお送りします」とやる（いわゆるPPAP）。

この運用がなぜなくならないのか。それは「手軽で、なんとなく安心感がある（と信じられている）」からだ。何億円もするシステムを導入しなくても、ファイルを送るだけで仕事が回る。

しかし、そのセキュリティは脆弱極まりない。Excelのパスワードは共有鍵（合言葉）であり、メールが盗聴されればパスワードも一緒に漏れる可能性が高い。それに、集める側は送られてきた大量のExcelファイルを開き、パスワードを入力し、中身を転記して集計しなければならない。これは苦行だ。

## Web/Aの「Layer 2」とは？

「Layer 2 Encryption」と聞いて、「あぁ、OSI参照モデルのデータリンク層（EthernetやWi-Fi）の話？」と思ったネットワークエンジニアの皆さん、ごめんなさい。Web/Aにおける「Layer 2」は、それとは全く関係がない。

Web/Aは、信頼できるドキュメントを作るために独自の「3層構造（3-Layer Trust Architecture）」を持っている。

<div align="center">
<svg width="600" height="460" viewBox="0 0 600 460" fill="none" xmlns="http://www.w3.org/2000/svg" style="max-width: 100%; height: auto; border: 1px solid #e2e8f0; border-radius: 8px; background: #fff;">
  <defs>
    <marker id="arrow" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth">
      <path d="M0,0 L0,6 L9,3 z" fill="#10B981" />
    </marker>
    <marker id="arrow-blue" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth">
      <path d="M0,0 L0,6 L9,3 z" fill="#6366F1" />
    </marker>
  </defs>
  <rect width="600" height="460" fill="#F8FAFC"/>
  <rect x="40" y="30" width="520" height="400" rx="12" fill="white" stroke="#E2E8F0" stroke-width="2"/>
  <text x="60" y="55" font-family="system-ui" font-size="14" font-weight="700" fill="#64748B">Web/A Document (.html)</text>

  <!-- Layer 3: Presentation -->
  <rect x="60" y="70" width="480" height="50" rx="6" fill="#F1F5F9" stroke="#CBD5E1" stroke-dasharray="4 4"/>
  <text x="75" y="95" font-family="system-ui" font-size="13" font-weight="700" fill="#475569">Layer 3: Portable Presentation (View)</text>
  <text x="75" y="110" font-family="system-ui" font-size="10" fill="#64748B">CSS・フォント等（将来のブラウザ対応のため更新可能）</text>

  <!-- Layer 2: User Signed -->
  <rect x="60" y="130" width="480" height="80" rx="6" fill="#ECFDF5" stroke="#10B981" stroke-width="2"/>
  <text x="75" y="155" font-family="system-ui" font-size="13" font-weight="700" fill="#047857">Layer 2: User-Signed Context (利用者による事実の入力)</text>
  <text x="75" y="175" font-family="system-ui" font-size="11" fill="#065F46">利用者の回答・同意データ</text>
  <text x="75" y="190" font-family="system-ui" font-size="11" fill="#065F46">Passkey 等による利用者署名 (VP)</text>
  <!-- Link to Layer 1 -->
  <path d="M300 210V220" stroke="#10B981" stroke-width="2" marker-end="url(#arrow)"/>

  <!-- Layer 1: Issuer Signed -->
  <rect x="60" y="220" width="480" height="150" rx="6" fill="#EEF2FF" stroke="#6366F1" stroke-width="2"/>
  <text x="75" y="245" font-family="system-ui" font-size="13" font-weight="700" fill="#4338CA">Layer 1: Issuer-Signed Core (発行者による原本・テンプレート)</text>

  <rect x="80" y="260" width="200" height="60" rx="4" fill="white" stroke="#6366F1"/>
  <text x="90" y="280" font-family="system-ui" font-size="12" font-weight="700" fill="#4338CA">人間可読レイヤー</text>
  <text x="90" y="300" font-family="system-ui" font-size="11" fill="#64748B">HTML / セマンティック構造</text>

  <!-- Semantic Mapping -->
  <path d="M280 290H320" stroke="#6366F1" stroke-width="1.5" stroke-dasharray="3 3" marker-end="url(#arrow-blue)" marker-start="url(#arrow-blue)"/>
  <text x="300" y="285" font-family="system-ui" font-size="9" fill="#6366F1" text-anchor="middle" font-weight="bold">Mapping</text>

  <rect x="320" y="260" width="200" height="60" rx="4" fill="white" stroke="#6366F1"/>
  <text x="330" y="280" font-family="system-ui" font-size="12" font-weight="700" fill="#4338CA">機械可読レイヤー</text>
  <text x="330" y="300" font-family="system-ui" font-size="11" fill="#64748B">JSON-LD / ロジック</text>

  <rect x="80" y="330" width="440" height="25" rx="4" fill="#6366F1" fill-opacity="0.1"/>
  <text x="300" y="347" font-family="system-ui" font-size="11" font-weight="700" fill="#4338CA" text-anchor="middle">発行者署名: Ed25519 + ML-DSA-44 (耐量子)</text>
</svg>
</div>
<br>

*   **Layer 1 (Issuer-Signed Core):** 発行者が署名した「問い」や「枠組み」。アンケート用紙そのもの。
*   **Layer 2 (User-Signed Context):** ユーザーが署名した「答え」や「入力データ」。ここに回答が入る。
*   **Layer 3 (Portable Presentation):** それらをどう表示するかという「見た目」（HTML/CSS）。

つまり、**Layer 2 Encryption** とは、「**ユーザーが入力したデータ (Layer 2) だけを** 暗号化して送り返す」仕組みのことだ。
フォームの土台（Layer 1）は誰でも見られる状態でいいが、ユーザーの回答（Layer 2）は秘匿したい。だからLayer 2だけを暗号化する。

## 受領者だけが開封できる「デジタル封筒」

Web/A FormのLayer 2 Encryptionは、この問題を **公開鍵暗号** によって解決する。

仕組みはこうだ。
フォームの作成者（調査の実施者など）は、あらかじめ自分の「公開鍵」をHTMLファイルの中に埋め込んでおく。これが「受領者だけが開けられる鍵穴」になる。

ユーザーがブラウザで入力し、「暗号化」をオンにしてデータを保存すると、Web/Aはそのデータをこの公開鍵で暗号化する。
一度暗号化されたデータは、**ユーザー本人でさえも二度と復号できない**（ユーザー側の鍵で署名もしつつ、中身は見えないように封をする）。これを開けることができるのは、対になる「秘密鍵」を持った受領者だけだ。

つまり、入力済みのWeb/Aファイルは、**中身が透けない、受領者本人しか開封できない頑丈な封筒** に入った状態になる。

これなら、メールで平文のまま送ってもいいし、DropboxやGoogle Driveに放り込んでもいい。なんなら掲示板に貼り付けたって構わない。秘密鍵を持たない中間者（メールサーバーの管理者や、誤送信先の相手）には、絶対に中身を盗み見ることができないからだ。

## Excelよりも強く、SaaSよりも手軽に

Excelのパスワード（共通鍵暗号）と違い、パスワードを別送する必要などない。
高価なSaaSや専用システムを導入しなくても、**ただファイルを配るだけ** で、金融機関レベルの強力な暗号化（X25519 + AES-GCM + HPKE）によるデータ交換が実現できる。

しかも、Web/Aは単なるJSONデータを出力するので、受け取った側はパスワード入力の手間なく、秘密鍵一発で大量のデータを復号し、CSVやデータベースにそのまますぐに取り込める。転記ミスも起きないし、文字化けや外字の問題も（昨日の記事の通り）Soraneが解決してくれる。

> [!TIP]
> **デモ機能でお試しください**
> Web/A Makerには、この暗号化フローを体験できる「Personal Mode」を搭載しました。「🔑 Setup Encryption (Passkey)」ボタンを押して自分のPasskeyを登録すると、あなた専用の暗号化フォームが作成されます。暗号化されたファイルを再び読み込み、「🔑 Decrypt with Passkey」で復号する一連の流れを、実際に手元で試すことができます。



実は、Web/A Formの暗号化機能にはもう一つ、隠された（あるいは将来のための）強力な機能がある。それが **耐量子計算機暗号 (PQC)** への対応だ。

現在使われている暗号技術（RSAや楕円曲線暗号）は、近い将来、量子コンピュータによって破られる可能性があると言われている。Web/A FormのL2 Encryptionは、現在の標準的な暗号（X25519）に加えて、NISTによって標準化されたPQCアルゴリズムである **ML-KEM (Kyber)** を組み合わせて使う「ハイブリッド暗号」をサポートしている。

「今のExcelファイルを守るのに、そこまで必要？」と思うかもしれない。けれど、今日暗号化したデータが、10年後に復号されて漏洩してしまう「Harvest Now, Decrypt Later」攻撃のリスクは現実のものになりつつある。
Web/Aは、ファイルの配布者が「PQCも使う」と設定しておけば、ユーザーが意識することなく自動的にPQCで二重に鍵をかけてデータを守るようになっている。

## 「やってしまえ」の精神で

「電子署名法がどうこう」「システムの調達がどうこう」と言っている間に、現場は今日もExcelを印刷し、PPAPでパスワードを送っている。
そんな現状を嘆くよりも、ブラウザで動く標準技術だけで「ほら、こうすれば安全で便利でしょ？」と動くものを見せてしまった方が早い。

Web/A Formは、そんな「vibe coding」の精神から生まれた、現場のためのツールなのだ。
暗号化機能をオンにするかどうかはオプションなので、普段は普通のアンケートとして使い、マイナンバーや口座番号のような機微な情報を扱うときだけ「暗号化」スイッチを入れる、といった運用もできる。

技術的には、最新の暗号技術（HPKE + PQC）を使いつつ、現場の運用は「ファイルを送るだけ」というレガシーな作法に寄せている。このギャップこそが、今の日本のDXに必要な「実用的な解」なんじゃないかと、わたしは思っている。

---

### 関連リンク

*   **[Web/A 公式サイト](https://masanork.github.io/srn/)**
*   **[Discussion Paper: Web/A Layer 2 Encryption](https://masanork.github.io/srn/papers/web-a-l2-encryption.html)** (技術的な詳細はこちら)
*   **[Sorane (SRN) Project](https://github.com/masanork/srn)** (GitHub Repository)
