#同态加密 #concrete #密文 #错误 # #安全 #密钥

concrete_lib

Concrete是一个完全同态加密(FHE)库,实现了Zama的TFHE变体

6个版本

0.1.5 2020年12月4日
0.1.4 2020年12月4日
0.1.3 2020年11月20日
0.1.0 2020年10月1日

#757 in 密码学

AGPL-3.0

2MB
28K SLoC

警告

开发已转移到concrete crate。请注意,您的Cargo.toml文件具有正确的以下依赖项

[dependencies]
concrete = "^0.1"

我们感谢Daniel May支持此项目并捐赠了Concrete crate。

Concrete通过扩展TfhE快速在密文中运行

Concrete是一个完全同态加密(FHE)库,实现了TFHE的Zama变体。Concrete基于学习错误(LWE)问题和环学习错误(RLWE)问题,这些是研究良好的密码学硬度假设,被认为是安全的,甚至对量子计算机也是如此。

要使用Concrete,您必须安装RustFFTW并将concrete添加到依赖项列表。

Rust安装

要在Linux或Macos上安装rust,您可以执行以下操作

curl  --tlsv1.2 -sSf https://sh.rustup.rs | sh

如果您想了解其他rust安装方法,请参阅rust网站

FFTW和openssl安装

您还需要安装FFTW和openssl库。

MacOS

安装 fftw 最直接的方法是使用 Homebrew Formulae。要安装 Homebrew,您可以执行以下操作:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

然后安装 FFTW 和 openssl。

brew install fftw
brew install openssl

Linux

要在基于 Debian 的发行版上安装 FFTW,您可以执行以下操作

sudo apt-get update && sudo apt-get install -y libfftw3-dev libssl-dev

从源代码

如果您想直接从源代码安装 FFTW,可以遵循 FFTW 网站上的说明

在您的项目中使用 concrete

您需要在 Rust 项目中 将 Concrete 库作为依赖项添加

要这样做,只需在 Cargo.toml 文件中添加依赖项。这里是一个 简单示例

[package]
name = "play_with_fhe"
version = "0.1.0"
authors = ["FHE Curious"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.net.cn/cargo/reference/manifest.html

[dependencies]
concrete_lib = "0.1"

现在,您可以使用 cargo build 命令来编译您的项目,这将获取 Concrete 库。

您还可以通过克隆此存储库并运行来从源代码构建库

cd concrete
make build

测试

要运行测试,您可以执行以下操作

cd concrete
make test

示例

use concrete_lib::*;
use crypto_api::error::CryptoAPIError;

fn main() -> Result<(), CryptoAPIError> {
    // generate a secret key
    let secret_key = LWESecretKey::new(&LWE128_630);

    // the two values to add
    let m1 = 8.2;
    let m2 = 5.6;

    // specify the range and precision to encode messages into plaintexts
    // here we encode in [0, 10[ with 8 bits of precision and 1 bit of padding
    let encoder = Encoder::new(0., 10., 8, 1)?;

    // encode the messages into plaintexts
    let p1 = encoder.encode_single(m1)?;
    let p2 = encoder.encode_single(m2)?;

    // encrypt plaintexts
    let mut c1 = VectorLWE::encrypt(&secret_key, &p1)?;
    let c2 = VectorLWE::encrypt(&secret_key, &p2)?;

    // add the two ciphertexts homomorphically
    c1.add_with_padding_inplace(&c2)?;

    // decrypt and decode the result
    let m3 = c1.decrypt_decode(&secret_key)?;

    // print the result and compare to non-FHE addition
    println!("Real: {} + {} = {}", m1, m2, m1 + m2);
    println!(
        "FHE: {} + {} = {}",
        p1.decode()?[0],
        p2.decode()?[0],
        m3[0]
    );
 Ok(())
}

致谢

此库使用多个依赖项,我们感谢这些库的贡献者

我们还使用了一些由 The Rust Project Developers 发布的、MIT 或 Apache 2.0 许可证的 crate

许可证

本软件根据 AGPL-v3 许可证分发。如果您有任何疑问,请联系我们 [email protected]

依赖项

~8–20MB
~246K SLoC