Swift Digest
Blog | Swift.org Blog

Swift Homomorphic Encryption の発表

Announcing Swift Homomorphic Encryption

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

何が発表されたのか

swift-homomorphic-encryption は、準同型暗号(HE)を Swift で利用できるようにするオープンソースパッケージです。

準同型暗号は、データを復号せずに、暗号化されたまま計算を行える 暗号技術です。これにより、クライアントが暗号化したデータをサーバーに送り、サーバーがその暗号化データに対して処理を行い、クライアントだけが復号できる結果を返す、という形が実現できます。処理の間、サーバーは元のデータを復号することも、復号鍵にアクセスすることもありません。そのため、ユーザーデータのプライバシーとセキュリティを守りながらクラウドサービスを動かす、という新しい可能性が生まれます。

Apple 自身も実際の業務で準同型暗号を利用しており、その Swift 実装をコミュニティに共有するものです。利用例の 1 つが iOS 18 の Live Caller ID Lookup 機能です。これは発信者番号表示と迷惑電話ブロックを提供する機能で、暗号化したクエリをサーバーに送り、サーバーは具体的な電話番号を知らないまま、その番号に関する情報を返します。この機能を試すための、動作するバックエンドの例として live-caller-id-lookup-example も公開されています。

これら 2 つのパッケージは、次のような Swift エコシステムの機能を活用しています。

何に使えるのか

Private Information Retrieval (PIR)

Live Caller ID Lookup は、Private Information Retrieval (PIR) という、プライベートなキー・バリュー検索の仕組みに基づいています。PIR では、クライアントが秘密にしたいキーワード(電話番号など)を持っていて、それに対応する値をサーバーから取得したいとします。キーワードは秘密なので、クライアントは サーバーにキーワードを知られることなく この検索を行いたい、という状況です。

PIR を素朴に実装するなら、サーバーがデータベース全体をクライアントに送り、手元で検索させる方法が考えられます。これならサーバーはどんな検索が行われたかを知りませんが、データベースが小さく更新もまれな場合にしか現実的ではありません。

これに対し、準同型暗号に基づくこのパッケージの PIR 実装では、ごく少量のデータベースメタデータをクライアントと同期するだけで済みます。このメタデータの更新頻度は低いため、更新が頻繁で非常に大きなデータベースでも効率的に扱えます。

準同型暗号の典型的な流れ

準同型暗号を使った処理は、典型的には次のような流れになります。

この Swift 実装では、Brakerski-Fan-Vercauteren (BFV) 暗号方式を採用しています。BFV は ring learning with errors (RLWE) という計算困難性問題に基づいており、量子コンピュータに耐性があります。Live Caller ID Lookup では、古典的な攻撃にも将来の量子攻撃にも強い、ポスト量子 128 ビットセキュリティの BFV パラメータが使われています。

基本的な使い方

準同型暗号を使う最小限の例は次のようになります。暗号化パラメータを選び、値を暗号化し、復号すると元の値が得られる、という一連の流れです。

import HomomorphicEncryption

// Bfv<UInt64> 方式の暗号化パラメータを選びます。
// ここで使うパラメータはテスト専用で、安全ではありません。
let encryptParams =
    try EncryptionParameters<Bfv<UInt64>>(from: .insecure_n_8_logq_5x18_logt_5)
// これらのパラメータでの HE 計算のための事前計算を行います。
let context = try Context(encryptionParameters: encryptParams)

// N 個の値を coefficient encoding でエンコードします。
let values: [UInt64] = [8, 5, 12, 12, 15, 0, 8, 5]
let plaintext: Bfv<UInt64>.CoeffPlaintext = try context.encode(
    values: values,
    format: .coefficient)

// 秘密鍵を生成し、それを使って平文を暗号化します。
let secretKey = try context.generateSecretKey()
let ciphertext = try plaintext.encrypt(using: secretKey)

// 復号すると元の値が得られます。
let decrypted = try ciphertext.decrypt(using: secretKey)
let decoded: [UInt64] = try decrypted.decode(format: .coefficient)
precondition(decoded == values)

導入・今後の位置づけ

準同型暗号は、Apple のエコシステムの内外を問わず、プライバシーを守るさまざまな単体アプリケーションに役立つと位置づけられています。具体例として、private set intersection や secure aggregation、機械学習などが挙げられています。

パッケージは GitHub で公開されており、貢献方法はリポジトリの説明から確認できます。問題を見つけたり改善の提案があれば、swift-homomorphic-encryptionlive-caller-id-lookup-example の issue として報告できます。

関連リンク