Swift 同态加密

Swift 同态加密 是同态加密 (HE) 的 Swift 实现,包括私有信息检索 (PIR) 等应用。

Swift 同态加密的应用包括

概述

Swift 同态加密是一个库和可执行文件的集合。 更多信息,请参考以下库的文档:

以及可执行文件:

文档托管在 Swift Package Index 上。

背景

同态加密 (HE)

Swift 同态加密实现了一种特殊的加密形式,称为同态加密 (HE)。 HE 是一种密码系统,能够对加密数据进行计算。 计算直接在加密数据上执行,而不会将该数据的明文透露给操作过程。 因此,HE 计算的发生无需解密或访问解密密钥。

因此,HE 允许客户端使服务器能够对加密数据执行操作,而无需将数据透露给服务器。 典型的 HE 工作流程可能是:

Swift 同态加密实现了 Brakerski-Fan-Vercauteren (BFV) HE 方案,该方案基于带错误的环学习 (RLWE) 难题。 可以将此方案配置为支持后量子 128 位安全性。

警告

当存在不可忽略的解密错误概率时,BFV 不提供 IND-CCA 安全性,也不提供 IND-CPAD 安全性。 应相应地使用 BFV。 特别是,不应将有关每个解密密文的任何信息发回服务器。 为了防止恶意服务器,客户端还应验证解密的内容是否为预期格式。

在开发和部署同态加密应用程序时,请咨询密码学专家。

私有信息检索 (PIR)

私有信息检索 (PIR) 是 HE 的一种应用。 PIR 使客户端能够从托管关键字-值数据库的服务器执行数据库查找,而服务器不会知道客户端查询中的关键字。数据库中的每一行都是一个关键字以及关联的。 在 PIR 协议期间,客户端使用其私有关键字发出查询,并了解与该关键字关联的值。

PIR 的一种简单的实现是让客户端发出通用的“获取数据库”请求,而与它的私有关键字无关。 然后,服务器将整个数据库发送到客户端。 虽然此简单 PIR 协议满足 PIR 的隐私和正确性要求,但它仅适用于小型数据库。

Swift 同态加密中的 PIR 实现使用 HE 来改进简单的 PIR 协议。

警告

PIR 是非对称的,这意味着客户端可能会了解未请求的关键字-值对,例如在简单的 PIR 中发生的情况。 需要 PIR 的一种变体,称为对称 PIR,以确保客户端不会了解任何未请求的值。

私有最近邻搜索 (PNNS)

私有最近邻搜索 (PNNS) 使拥有私有向量的客户端能够搜索服务器托管的数据库中最近的向量,而服务器不会知道客户端的向量。 数据库中的每一行都是一个向量以及关联的条目标识符条目元数据。 在 PNNS 协议期间,客户端使用其私有向量发出查询,并根据 DistanceMetric 了解最近的邻居。 具体来说,客户端了解客户端查询向量与最近邻居之间的距离,以及最近邻居的条目标识符和条目元数据。

PNNS 的一种简单的实现是让客户端发出通用的“获取数据库”请求,而与它的私有向量无关。 然后,服务器将整个数据库发送到客户端,客户端在本地计算距离。 虽然此简单 PNNS 协议满足 PNNS 的隐私和正确性要求,但它仅适用于小型数据库。

Swift 同态加密中的 PNNS 实现使用同态加密来改进简单的 PNNS 协议。

使用 Swift 同态加密

Swift 同态加密可作为 Swift Package Manager 包使用。 要使用 Swift 同态加密,请选择一个 标签。 然后,在您的 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"),

到您的目标的依赖项中。

重要说明

在链接您的可执行文件时,请务必启用 cross-module-optimization。 如果没有此标志,由于无法专门化泛型,Swift 同态加密的性能会大大降低。 例如:

.executableTarget(
   name: "YourTarget",
   dependencies: [
       .product(name: "HomomorphicEncryption", package: "swift-homomorphic-encryption"),
   ],
   swiftSettings: [.unsafeFlags(["-cross-module-optimization"],
      .when(configuration: .release))]
)

然后,您可以添加

 import HomomorphicEncryption

到您的 Swift 代码中,以访问 HomomorphicEncryption 库中的功能。

注意

如果您正在使用 Swift 同态加密进行研究,请使用 CITATION.cff 文件进行引用。

示例

有关使用 HomomorphicEncryption 的示例,请参见 Snippets。 要运行 EncryptionParametersSnippet,请运行:

swift run -c release EncryptionParametersSnippet

支持的平台

Swift 同态加密旨在支持所有 Swift 支持的平台。

注意

Swift 同态加密依赖于 SystemRandomNumberGenerator 作为加密安全的随机数生成器,它可能具有平台相关的行为。

Swift / Xcode 版本

下表将 Swift 同态加密包版本映射到所需的 Swift 和 Xcode 版本:

包版本 Swift 版本 Xcode 版本
1.0.x >= Swift 5.10 >= Xcode 15.3
main >= Swift 6.0 >= Xcode 16.1

源代码稳定性

Swift 同态加密遵循 语义化版本 2.0.0。 对公共 API 的源代码破坏性更改只能在新主要版本中发布,但以下情况例外:

该软件包的未来次要版本可能会根据需要对此规则进行更改。

我们希望该软件包能够快速采用与其任务相关的 Swift 语言和工具链的改进。 因此,我们预计此软件包的新版本会不时要求客户端升级到更新的 Swift 工具链版本。 要求新的 Swift 版本只需要一个次要版本更新。

开发 Swift 同态加密

依赖项

开发 Swift 同态加密需要:

构建

您可以通过 Xcode 或在终端中使用命令行来构建 Swift 同态加密。

克隆存储库后,运行:

cd swift-homomorphic-encryption
git submodule update --init --recursive

Xcode

要从 Xcode 构建 Swift 同态加密,只需在 Xcode 中打开根目录即可。 有关使用 Xcode 进行开发的更多详细信息,请参见 Xcode 文档

命令行

要从命令行构建 Swift 同态加密,请在终端中打开克隆的存储库的根目录(即 swift-homomorphic-encryption 目录),然后运行:

swift build -c release

构建产品将位于 .build/release/ 文件夹中。

要在调试模式下构建,请运行:

swift build

构建产品将位于 .build/debug/ 文件夹中。

警告

在调试模式下,运行时可能会慢得多。

安装

要安装 Swift 同态加密目标,请使用 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 --parallel

要在调试模式下运行测试,请运行:

swift test --parallel

警告

在调试模式下,测试将很慢。

基准测试

Swift 同态加密使用 Benchmark 进行基准测试。 默认情况下,基准测试需要 jemalloc 依赖项。

警告

由于已知的 问题,基准测试可能会间歇性崩溃。 为了可靠地执行,基准测试可以在没有 jemalloc 的情况下运行,如 此处 所述。

运行基准测试的两种方法是:

贡献

如果您有兴趣为 Swift 同态加密做出贡献,请参见我们的 贡献指南

文档

Swift 同态加密使用 DocC 进行文档编制。 有关更多信息,请参见 DocC 文档Swift-DocC 插件

Xcode

可以通过 Xcode 通过 Product -> Build Documentation 来构建文档。

命令行

可以通过运行以下命令从命令行构建文档:

swift package generate-documentation

并通过运行以下命令预览:

swift package --disable-sandbox preview-documentation --target HomomorphicEncryption