Upgrade to Pro — share decks privately, control downloads, hide ads and more …

その画像、 誰が‧いつ‧どこで‧どう作った? モバイルアプリで扱うC2PAとコンテンツの来歴

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

その画像、 誰が‧いつ‧どこで‧どう作った? モバイルアプリで扱うC2PAとコンテンツの来歴

026/08/28 SAPPORO ENGINEER BASE #16 モバイル開発 の発表資料です。

Avatar for Shuhei Shitamori

Shuhei Shitamori

August 28, 2026

More Decks by Shuhei Shitamori

Other Decks in Programming

Transcript

  1. C2PA対応製品‧サービスの例 撮影‧作成 編集 配信‧変換 表⽰ Leica M11-P Adobe Photoshop Cloudflare

    Images Youtube 撮影時に来歴を署名 出⼒時に来歴を付与 変換後も保持‧再署名 AI⽣成かラベル表⽰
  2. C2PAの注意点② • 暗号的に検証できるのは 「どのツールがその来歴を記録し、その後に変更がないか」 • ツールが記録した内容が「真実」とは保証できない 僕が作ったアプリで、 カメラで作成した来歴を持つ ツチノコ画像を作れるぞ! ◦

    悪意あるコンテンツ提供者が嘘の来歴を記録 ◦ ツールの不具合により、誤った来歴が記録 ツール提供元も確認して総合的に判断することが⼤事 (https://spec.c2pa.org/conformance-explorerからC2PA公式が承認したツールを探せる)
  3. C2PA来歴を読み取る コンテンツのURLから来歴をJSON⽂字列として読み取ることができる // Swift import C2PA // Kotlin import org.contentauth.c2pa.*

    do { let manifestJSON: String = try C2PA.readFile(at: imageURL) print("C2PA manifest: \(manifestJSON)") } catch { print("Error reading C2PA data: \(error)") } try { val manifest = C2PA.readFile("/path/to/image.jpg") println("Manifest: $manifest") } catch (e: C2PAError) { println("Error reading manifest: $e") }
  4. C2PA来歴を読み取る ⽣成AI画像⼊⼒時の出⼒データの⼀部 { "manifests": { "title": "image.png", "assertions": [ {

    "label": "c2pa.actions.v2", "data": { "actions": [ { "action": "c2pa.created", "when": "2026-08-27T00:00:00Z", "softwareAgent": { "name": "gpt-image", "version": "2.0" }, "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" }, … ] }, "created": true } ], "signature_info": { "alg": "Es256", "issuer": "OpenAI OpCo, LLC", "common_name": "OpenAI Media Service", "cert_serial_number": "471440979205905794604524502504016020624908622401", "time": "2026-08-27T05:31:13.536137+00:00" }, "label": "urn:c2pa:94b278d2-fa5b-4bfe-8bb3-29a9874f16b0", "claim_version": 2 } }, … "validation_state": "Trusted" }
  5. C2PA来歴を書き込む JSON形式の来歴を署名⽤の鍵を渡してC2PA付きコンテンツを書き出す // Swift let signerInfo = SignerInfo( algorithm: .es256,

    certificatePEM: certificatePEM, privateKeyPEM: privateKeyPEM, tsaURL: nil ) // Kotlin val signerInfo = SignerInfo( algorithm = SigningAlgorithm.ES256, certificatePEM = certsPem, privateKeyPEM = privateKeyPem, tsaURL = "https://timestamp.server.com" ) let manifestJSON = """ { "claim_generator": "MyApp/1.0", "title": "Signed Image", "format": "image/jpeg" } """ val manifest = """{ "claim_generator": "my_app/1.0", "assertions": [ {"label": "c2pa.actions", "data": {"actions": [{"action": "c2pa.created"}]}} ] }""" try C2PA.signFile( source: inputURL, destination: outputURL, manifestJSON: manifestJSON, signerInfo: signerInfo ) try C2PA.signFile( sourcePath = "/path/to/input.jpg", destPath = "/path/to/output.jpg", manifest = manifest, signerInfo = signerInfo )
  6. デモ2: C2PA来歴を書き込む 冒頭の画像⽣成アプリに、⽣成画像にC2PA来歴を書き込む機能を追加 • ⽣成AI製であること • ⽣成⽇時 • ⽣成アプリ名 •

    スキャンしたユーザーと隠れプロンプト 作成時の特別なコンテキストが埋め込まれた思い出深い画像を作るアプリに!
  7. そのほか実装で気を付けること • C2PA来歴が消失しないよう、不要なデータ変換を避ける ◦ 例: 来歴付きPNG Data → UIImage →

    PNG Dataで来歴が消失 • プライバシーな情報は、必要でない限りC2PA来歴に書き込まない ◦ 例: Pixel 10カメラも位置情報はC2PA来歴に⼊れていない