Swift Digest
Blog | Swift.org Blog

Swift Crypto の紹介

Introducing Swift Crypto

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

この記事の要点

何が発表されたのか

Swift Crypto は、Apple CryptoKit の API をより広い Swift コミュニティに届けるための Swift パッケージです。これにより、アプリをどのプラットフォーム上で動かすかにかかわらず、共通の暗号操作のための API に同じようにアクセスできるようになります。

Swift が動作するすべてのプラットフォームで、次のように書くだけで CryptoKit の API 一式を利用できます。

import Crypto

Apple プラットフォームでは Swift Crypto は CryptoKit に直接委譲し、それ以外のプラットフォームでは BoringSSL を土台にした新規実装を使います。これにより、どのプラットフォームでも安全で扱いやすい暗号 API を利用でき、クロスプラットフォームな暗号コードを書く際に役立ちます。

何に使えるのか

Swift Crypto は、自前で暗号方式を組み立てるときに陥りがちな落とし穴を避けながら、強力な操作を簡潔に書けるようにします。

たとえば、AES GCM による認証付き暗号化(データを隠しつつ改ざんに耐える暗号化)は次のように書けます。

func encrypt(input: [UInt8]) throws -> Data {
    // 鍵はどこかに必ず保存すること!
    let key = SymmetricKey(size: .bits256)
    let sealedBox = try AES.GCM.seal(input, using: key)
    return sealedBox.combined!
}

このコードは、ランダムに選ばれた nonce を必ず使うことや、暗号文を認証することを保証します。これらはさまざまな攻撃を防ぐうえで重要ですが、多くの暗号ライブラリでは自動的には行われません。

同様に、データが改ざんされていないことを確認するためのメッセージ認証コードも簡単に生成できます。

func authenticate(message: [UInt8]) -> [UInt8] {
    // ここでも鍵の保存を忘れずに!
    let key = SymmetricKey(size: .bits256)
    return Array(HMAC<SHA256>.authenticationCode(for: message, using: key))
}

楕円曲線を使った鍵交換のような複雑な処理もカバーされています。たとえば Curve25519 を使って共有秘密を生成するには次のようにします。

func curve25519SharedSecret(myKey: Curve25519.KeyAgreement.PrivateKey, theirKeyBytes: [UInt8]) throws -> SharedSecret {
    let theirKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: theirKeyBytes)
    return try myKey.sharedSecretFromKeyAgreement(with: theirKey)
}

このように、シンプルで強力な API のおかげで、ほとんどコードを書かずに、専門知識をそれほど必要とせずに、安全なクロスプラットフォーム暗号方式を構築できます。

仕組みと設計

Swift Crypto は本質的には次の 2 つの部分から成る、とてもシンプルなアイデアです。

このシンプルなアイデアの裏には、いくつかの込み入った実装上の事情があります。

CryptoKit と Swift Crypto でバックエンドを 1 つに統合せず、あえて 2 つの独立した実装を持つ最大の利点は 検証 です。同じ API の独立した 2 実装があることで、互いの出力を比較してテストでき、信頼性と互換性が高まり、リグレッションの混入を減らせます。

Swift Crypto はセマンティックバージョニングに従う Swift パッケージで、Apache 2.0 ライセンスのもとで提供されます。

今後の見通し

Swift Crypto の中心的な目標は、Apple CryptoKit の API をより広いプラットフォームで使えるようにすることなので、API は基本的に CryptoKit 自体の進化に追従していきます。一方でオープンソースプロジェクトとして、Swift Crypto に直接 API を提案する余地もあります。提案された API は、その内容次第で Apple CryptoKit 側での並行実装が検討されることもあります。

特殊なハードウェアを必要とする API を除けば、CryptoKit 側に実装がある場合は Swift Crypto は常にそれを使い、ない場合は Swift Crypto による実装を使えます。

ただし、あらゆる暗号プリミティブをサポートすることは明確な非目標 であるという設計方針に注意が必要です。プリミティブを増やしすぎると、利用者が(特に安全な)選択をするのが難しくなるためです。すでに、より広く使われている安全な代替手段が用意されている場合、新しいプリミティブはサポートされないことがあります。

関連リンク