宣布Swift同态加密
apple 发布于 2024-09-07

我们很高兴地宣布一个新的开源Swift包,用于Swift中的同态加密:Swift同态加密

同态加密(HE)是一种加密技术,它能够对加密数据进行计算,而不会向操作过程泄露底层的未加密数据。它为客户端提供了一种将加密数据发送到服务器的方法,服务器对加密数据进行操作,并返回客户端可以解密的结果。在请求执行期间,服务器本身从不解密原始数据,甚至无法访问解密密钥。这种方法为云服务在保护用户数据隐私和安全的同时提供了新的机会,这对许多场景来说显然非常有吸引力。

在苹果,我们在自己的工作中使用同态加密;因此,我们很高兴在社区中分享这个Swift实现,供其他人使用和贡献。

我们如何在iOS 18中使用此实现的一个例子是新的Live Caller ID Lookup功能,该功能提供呼叫者ID和垃圾邮件拦截服务。Live Caller ID Lookup使用同态加密向服务器发送加密查询,该服务器可以提供有关电话号码的信息,而服务器不知道请求中的特定电话号码。为了证明这一点,我们还分享了实时呼叫者id查找示例,该示例提供了一个功能示例后端,用于使用同态加密测试实时呼叫者id查询功能。

这两个软件包充分利用了以下功能:

  • Swift on Server,包括Hummingbird HTTP框架和跨平台支持
  • 使用Benchmark库轻松进行基准测试
  • Swift Crypto中的高性能低级加密原语。

私有信息检索(PIR)

实时呼叫者ID查找依赖于私人信息检索(PIR),这是一种私钥值数据库查找形式。在PIR设置中,客户端有一个私有关键字(如电话号码),并希望从服务器检索相关值。因为关键字是私有的,所以客户端希望在服务器不学习关键字的情况下执行此查找。

PIR的一个简单实现是让服务器将整个数据库发送到客户端进行本地处理。虽然这确实会阻止服务器知道正在进行哪些查询,但它只适用于更新不频繁的小型数据库。

相比之下,我们的PIR实现依赖于同态加密,只需要与客户端同步少量的数据库元数据。此元数据很少更改,这允许高效处理具有大量更新的非常大的数据库。

同态加密

如上所述,同态加密能够在不解密或访问解密密钥的情况下对加密数据进行计算。

同态加密的典型工作流程可能如下:

  • 客户端对其敏感数据进行加密,并将结果发送到服务器。
  • 服务器对密文执行计算(可能包含其自己的明文输入),而不学习任何密文解密为什么。
  • 服务器将得到的密文响应发送给客户端。
  • 客户端解密得到的响应。

同态加密的Swift实现实现了Brakerski Fan-Vercauteren(BFV)HE方案(https://eprint.iacr.org/2012/078, https://eprint.iacr.org/2012/144). BFV基于具有量子抗性的带误差环学习(RLWE)硬度问题。

实时呼叫者ID查找功能需要具有后量子128位安全性的BFV参数,以提供针对经典和潜在未来量子攻击的强大安全性,如前所述https://security.apple.com/blog/imessage-pq3/.

使用同态加密

我们相信,开发人员会发现同态加密对苹果生态系统内外的各种独立隐私保护应用程序都很有用,包括私有集交集、安全聚合和机器学习。

下面是一个如何使用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上的存储库中阅读更多关于贡献的信息。如果您遇到任何问题或有改进建议,我们还建议您将问题提交给快速同态加密和实时呼叫者id查找示例。

我们很高兴看到同态加密如何使Swift社区的开发人员和研究人员能够实现新的用例!

翻译:Announcing Swift Homomorphic Encryption

 

apple
关注 私信
文章
13
关注
0
粉丝
0