发布 Swift 同态加密
我们很高兴宣布推出一个新的开源 Swift 软件包,用于 Swift 中的同态加密:swift-homomorphic-encryption。
同态加密 (HE) 是一种密码学技术,能够在加密数据上进行计算,而无需向操作过程泄露底层未加密数据。它为客户端向服务器发送加密数据提供了一种方法,服务器对加密数据进行操作并返回客户端可以解密的结果。在请求执行期间,服务器本身从不解密原始数据,甚至无法访问解密密钥。这种方法为云服务在保护用户数据隐私和安全的同时运行提供了新的机会,这对于许多场景显然极具吸引力。
在 Apple,我们正在自己的工作中使用同态加密;因此,我们很高兴在社区中分享这个 Swift 实现,供其他人使用和贡献。
我们在 iOS 18 中使用此实现的一个例子是新的 Live Caller ID Lookup 功能,该功能提供来电显示和垃圾邮件阻止服务。Live Caller ID Lookup 使用同态加密向服务器发送加密查询,服务器可以提供有关电话号码的信息,而无需知道请求中的特定电话号码。为了演示这一点,我们还分享了 live-caller-id-lookup-example,它提供了一个功能示例后端,用于测试使用同态加密的 Live Caller ID Lookup 功能。
这两个软件包充分利用了以下功能,例如
- Swift on Server,包括 Hummingbird HTTP 框架和跨平台支持
- 使用 Benchmark 库轻松进行基准测试
- Swift Crypto 中高性能的底层密码学原语。
私有信息检索 (PIR)
Live Caller ID Lookup 依赖于私有信息检索 (PIR),这是一种私有键值数据库查找形式。在 PIR 设置中,客户端拥有一个私有关键字(例如电话号码),并希望从服务器检索关联的值。由于关键字是私有的,因此客户端希望在服务器不知道关键字的情况下执行此查找。
PIR 的一种简单实现是让服务器将整个数据库发送给客户端进行本地处理。虽然这确实阻止了服务器知道正在进行哪些查询,但它仅适用于更新不频繁的小型数据库。
相比之下,我们的 PIR 实现依赖于同态加密,只需要与客户端同步少量数据库元数据。此元数据更改不频繁,这允许有效处理具有大量更新的超大型数据库。
同态加密
如上所述,同态加密能够在加密数据上进行计算,而无需解密或访问解密密钥。
同态加密的典型工作流程可能如下
- 客户端加密其敏感数据并将结果发送到服务器。
- 服务器对密文执行计算(可能包含其自己的明文输入),而无需了解任何密文解密成什么。
- 服务器将生成的密文响应发送给客户端。
- 客户端解密生成的响应。
Swift 同态加密的实现采用了 Brakerski-Fan-Vercauteren (BFV) HE 方案 (https://eprint.iacr.org/2012/078, https://eprint.iacr.org/2012/144)。BFV 基于环学习错误 (RLWE) 难题,该难题具有抗量子性。
Live Caller ID Lookup 功能需要具有后量子 128 位安全性的 BFV 参数,以提供针对经典攻击和潜在未来量子攻击的强大安全性,这在之前已在以下文章中解释过:https://security.apple.com/blog/imessage-pq3/。
使用同态加密
我们相信开发者会发现同态加密对于 Apple 生态系统内外各种独立的隐私保护应用程序都很有用,包括私有集合交集、安全聚合和机器学习。
以下是如何使用 Swift 同态加密的基本示例。
import HomomorphicEncryption
// We start by choosing some encryption parameters for the Bfv<UInt64> scheme.
// *These encryption parameters are insecure, suitable for testing only.*
let encryptParams =
try EncryptionParameters<Bfv<UInt64>>(from: .insecure_n_8_logq_5x18_logt_5)
// Perform pre-computation for HE computation with these parameters.
let context = try Context(encryptionParameters: encryptParams)
// We encode N values using 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)
// We generate a secret key and use it to encrypt the plaintext.
let secretKey = try context.generateSecretKey()
let ciphertext = try plaintext.encrypt(using: secretKey)
// Decrypting the plaintext yields the original values.
let decrypted = try ciphertext.decrypt(using: secretKey)
let decoded: [UInt64] = try decrypted.decode(format: .coefficient)
precondition(decoded == values)
我们期待与其他人合作增强此软件包:您可以在 GitHub 上的存储库中阅读有关贡献的更多信息。如果您遇到任何问题或对改进有建议,我们也鼓励您向 swift-homomorphic-encryption 和 live-caller-id-lookup-examples 提交 issue。
我们很高兴看到同态加密如何能够帮助 Swift 社区的开发者和研究人员实现新的用例!