apple/swift-homomorphic-encryption
GitHub: apple/swift-homomorphic-encryption
Apple 推出的 Swift 同态加密库及其应用集合,支持在不解密的情况下对密文进行安全计算与隐私检索。
Stars: 649 | Forks: 46
# Swift 同态加密
*Swift 同态加密*(Swift Homomorphic Encryption)是同态加密(HE)及其应用(包括私密信息检索,Private Information Retrieval, PIR)的 Swift 实现。
Swift 同态加密的应用包括:
* [实用来电 ID 查询](https://developer.apple.com/documentation/identitylookup/getting-up-to-date-calling-and-blocking-information-for-your-app) 与 [Network Extension URL 过滤器](https://developer.apple.com/documentation/networkextension/url-filters)
* 有关示例服务,请参阅 [pir-service-example](https://github.com/apple/pir-service-example)
## 概述
Swift 同态加密是一系列库和可执行文件的集合。
有关更多信息,请参阅以下库的文档:
* [HomomorphicEncryptionProtobuf](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/homomorphicencryptionprotobuf)
* [HomomorphicEncryption](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/homomorphicencryption)
* [ApplicationProtobuf](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/applicationprotobuf)
* [PrivateInformationRetrieval](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/privateinformationretrieval)
* [PrivateNearestNeighborSearch](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/privatenearestneighborsearch)
以及可执行文件:
* [PIRGenerateDatabase](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/pirgeneratedatabase)
* [PIRProcessDatabase](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/pirprocessdatabase)
* [PIRShardDatabase](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/pirsharddatabase)
* [PNNSGenerateDatabase](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/pnnsgeneratedatabase)
* [PNNSProcessDatabase](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/main/documentation/pnnsprocessdatabase)
这些文档托管在 [Swift Package Index](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/documentation) 上。
## 背景
### 同态加密 (HE)
Swift 同态加密实现了一种称为同态加密(HE)的特殊密码学形式。
HE 是一种允许对加密数据进行计算的密码系统。
计算直接在加密数据上执行,*而不会向执行操作的进程泄露该数据的明文*。
因此,HE 的计算过程不需要解密或使用解密密钥。
由此,HE 允许客户端授权服务器对加密数据执行操作,从而不会向服务器泄露数据。
典型的 HE 工作流程可能如下:
* 客户端对其敏感数据进行加密,并将生成的密文发送给服务器。
* 服务器对该密文(以及可能的服务器自身明文输入)执行 HE 计算,而无法获知任何密文解密后的内容。
* 服务器将计算生成的密文响应发送给客户端。
* 客户端进行解密以获取响应结果。
Swift 同态加密实现了 Brakerski-Fan-Vercauteren (BFV) HE 方案,该方案基于带误差环学习(Ring Learning With Errors, RLWE)困难问题。
该方案可配置为支持后量子 128 位安全性。
### 私密信息检索 (PIR)
私密信息检索(PIR)是 HE 的一项应用。
PIR 允许客户端从托管“关键字-值”(keyword-value)数据库的服务器上执行数据库查询,*而服务器无法获知客户端查询中使用的关键字。*
数据库中的每一行都是一个*关键字*(keyword)以及与之关联的*值*(value)。
在 PIR 协议执行期间,客户端使用其私有关键字发出查询,并获取与该关键字关联的值。
PIR 的一种简单实现是让客户端发出一个通用的“获取数据库”请求,该请求与其私有关键字无关。
随后,服务器将整个数据库发送给客户端。
虽然这种*平凡 PIR(trivial PIR)*协议满足了 PIR 的隐私和正确性要求,但它仅适用于小型数据库。
Swift 同态加密中的 PIR 实现利用 HE 对平凡 PIR 协议进行了改进。
### 私密最近邻搜索 (PNNS)
私密最近邻搜索(PNNS)允许拥有私有向量的客户端,在服务器托管的数据库中搜索最近的向量,*而服务器无法获知客户端的向量。*
数据库中的每一行都是一个*向量*,以及与之关联的*条目标识符*(entry identifier)和*条目元数据*(entry metadata)。
在 PNNS 协议执行期间,客户端使用其私有向量发出查询,并根据 ``DistanceMetric`` 获知最近邻。
具体而言,客户端将获知客户端查询向量与最近邻之间的距离,以及该最近邻的条目标识符和条目元数据。
PNNS 的一种简单实现是让客户端发出一个通用的“获取数据库”请求,该请求与其私有向量无关。
随后,服务器将整个数据库发送给客户端,由客户端在本地计算距离。
虽然这种*平凡 PNNS(trivial PNNS)*协议满足了 PNNS 的隐私和正确性要求,但它仅适用于小型数据库。
Swift 同态加密中的 PNNS 实现利用同态加密对平凡 PNNS 协议进行了改进。
## 使用 Swift 同态加密
Swift 同态加密以 Swift Package Manager 包的形式提供。
要使用 Swift 同态加密,请选择一个 [标签](https://github.com/apple/swift-homomorphic-encryption/tags)。
然后,在你的 `Package.swift` 中添加以下依赖项
```
.package(
url: "https://github.com/apple/swift-homomorphic-encryption",
from: "tag"),
```
,将 `tag` 替换为你选择的标签,例如 `1.0.0`。
要使用 `HomomorphicEncryption` 库,请添加
```
.product(name: "HomomorphicEncryption", package: "swift-homomorphic-encryption"),
```
到你的 target 的依赖项中。
然后,你可以添加
```
import HomomorphicEncryption
```
到你的 Swift 代码中,以访问 `HomomorphicEncryption` 库中的功能。
#### 示例
有关使用 `HomomorphicEncryption` 的示例,请参阅 [Snippets](https://github.com/apple/swift-homomorphic-encryption/tree/main/Snippets)。
要列出可用的代码片段,
```
swift package show-executables | grep 'Snippet'
```
要运行 `EncryptionParametersSnippet`,请运行
```
swift run -c release EncryptionParametersSnippet
```
### 支持的平台
Swift 同态加密旨在支持所有支持 Swift 的平台。
### Swift / Xcode 版本
下表列出了 Swift 同态加密包版本与所需的 Swift 及 Xcode 版本之间的对应关系:
包版本 | Swift 版本 | Xcode 版本
----------------|---------------|-----------------------------------------
1.0.x | >= Swift 5.10 | >= Xcode 15.3
main | >= Swift 6.2 | >= Xcode 26
### 源码稳定性
Swift 同态加密遵循 [语义化版本 2.0.0](https://semver.org/spec/v2.0.0.html)。对公共 API 的破坏性源码更改只能在一个新的主版本中进行,但以下情况除外:
* 向公共 `enum` 类型添加新的 `case` 只需要提升次要版本号。例如,我们可能会向 [HeError](https://swiftpackageindex.com/apple/swift-homomorphic-encryption/documentation/homomorphicencryption/heerror) 添加一个新的 `enum`。为了避免破坏源代码,在对 enum 值添加 `switch` 时,请添加 `default` case。
该包未来的次要版本可能会根据需要对这些规则进行更改。
我们希望这个包能够迅速采用与其目标相关的 Swift 语言和工具链改进。因此,我们预计该包的新版本将不时要求客户端升级到更新的 Swift 工具链版本。要求使用新的 Swift 版本仅需要提升次要版本号。
## 开发 Swift 同态加密
### 依赖项
开发 Swift 同态加密需要:
* [Nick Lockwood SwiftFormat](https://github.com/nicklockwood/SwiftFormat), 0.60.0
* [pre-commit](https://pre-commit.com)
* [swift-format](https://github.com/swiftlang/swift-format), 602.0.0
* [swift-protobuf](https://github.com/apple/swift-protobuf), 1.31.1
* [SwiftLint](https://github.com/realm/SwiftLint), 0.63.2
### 构建
你可以通过 Xcode 或在终端的命令行中构建 Swift 同态加密。
克隆仓库后,运行
```
cd swift-homomorphic-encryption
git submodule update --init --recursive
```
#### Xcode
要在 Xcode 中构建 Swift 同态加密,只需在 Xcode 中打开根目录即可。
有关使用 Xcode 进行开发的更多详细信息,请参阅 [Xcode 文档](https://developer.apple.com/documentation/Xcode)。
#### 命令行
要在命令行中构建 Swift 同态加密,请在终端中打开克隆仓库的根目录(即 `swift-homomorphic-encryption` 目录),并运行
```
swift build -c release
```
构建产物将位于 `.build/release/` 文件夹中。
要在 debug 模式下构建,请运行
```
swift build
```
构建产物将位于 `.build/debug/` 文件夹中。
### 安装
要安装 Swift 同态加密的 targets,请使用 Swift Package Manager 的 `experimental-install` 功能。
首先,请确保 `~/.swiftpm/bin` 目录包含在你的 `$PATH` 中。
例如,如果你使用的是 `zsh` shell,请将以下行添加到你的 `~/.zshrc` 中
```
export PATH="$HOME/.swiftpm/bin:$PATH"
```
确保通过(`source ~/.zshrc`)或重启你的终端模拟器来重新加载路径。
然后,要安装 `PIRProcessDatabase` 可执行文件,例如,请运行
```
swift package experimental-install -c release --product PIRProcessDatabase
```
### 测试
通过以下命令运行单元测试
```
swift test -c release
```
要在 debug 模式下运行测试,请运行
```
swift test
```
### 基准测试
Swift 同态加密使用 [Benchmark](https://github.com/ordo-one/package-benchmark) 进行基准测试。
要启用基准测试,请设置环境变量 `SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1`。
默认情况下,基准测试需要 [jemalloc](http://jemalloc.net) 依赖项。
运行基准测试的两种方式是:
* Xcode
* 在 Xcode 中打开 `swift-homomorphic-encryption` 文件夹并设置 `SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1`,例如:
* `open --env SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 Package.swift`
* 切换到 benchmark target。
* 运行该 target,例如,通过 `Product` 菜单。
* 命令行
* 运行 `SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_BENCHMARKING=1 swift package benchmark`。
* 有关运行基准测试的更多信息,请参阅 [Benchmark](https://github.com/ordo-one/package-benchmark) 文档。
# 文档
Swift 同态加密使用 DocC 生成文档。
有关更多信息,请参阅 [DocC 文档](https://www.swift.org/documentation/docc) 和 [Swift-DocC Plugin](https://swiftlang.github.io/swift-docc-plugin/documentation/swiftdoccplugin/)。
## Xcode
可以通过 Xcode 的 `Product -> Build Documentation` 来构建文档。
## 命令行
可以通过运行以下命令从命令行构建文档
```
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_DOCCPLUGIN=1 swift package generate-documentation
```
并通过运行以下命令进行预览
```
SWIFT_HOMOMORPHIC_ENCRYPTION_ENABLE_DOCCPLUGIN=1 swift package --disable-sandbox preview-documentation --target HomomorphicEncryption
```
标签:Swift, 同态加密, 密码学库, 私有信息检索, 网络安全, 隐私保护