#elgamal #elliptic-curve #ristretto255 #ristretto #properties #crypto

no-std rust-elgamal

使用 ristretto255 椭圆曲线群的 ElGamal 同态加密的简单实现

4 个版本 (2 个重大更新)

0.4.0 2021 年 1 月 29 日
0.3.2 2021 年 1 月 14 日
0.3.1 2021 年 1 月 14 日
0.3.0 2021 年 1 月 14 日
0.2.0 2021 年 1 月 13 日

#1551密码学

Download history 8/week @ 2024-03-31 1/week @ 2024-04-07 16/week @ 2024-06-16 5/week @ 2024-06-23 24/week @ 2024-06-30 17/week @ 2024-07-07

每月 62 次下载

Apache-2.0

28KB
348

此包提供了一个简单的 ElGamal 密码系统实现,该系统在 ristretto255 椭圆曲线群上使用 curve25519-dalek 包。**本包不针对一般开发者**,而是针对实现使用 ElGamal 的协议的密码学家。

我应该使用 ElGamal 吗?

使用 ElGamal 密码系统的主要原因是需要 同态属性:给定消息 m1m2,它们的加密和是 m1 + m2 的加密。在椭圆曲线群中,这种同态是乘法的。

在其他情况下,ElGamal **通常不适用**。这是因为它对选择密文攻击(这是同态属性的直接后果)不安全。

警告:虽然本包的作者在密码学方面受过教育,但他们不保证实现的安全性。请自行承担风险。

致谢

作者感谢 Henry de Valence 提供的反馈和建议。

使用

要导入 rust-elgamal,请将以下依赖项添加到您的 Cargo.toml 文件中

rust-elgamal = "0.2"

因为此包处于预发布状态(主要版本 0),次要版本可能引入破坏性更改。因此,您不应使用 rust_elgamal = "0"

示例

use rand::rngs::StdRng;
use rand::SeedableRng;
use rust_elgamal::{DecryptionKey, Scalar, GENERATOR_TABLE};

const N: usize = 100;

let mut rng = StdRng::from_entropy();
let dec_key = DecryptionKey::new(&mut rng);
let enc_key = dec_key.encryption_key();

let message = &Scalar::from(5u32) * &GENERATOR_TABLE;
let encrypted = enc_key.encrypt(message, &mut rng);
let decrypted = dec_key.decrypt(encrypted);
assert_eq!(message, decrypted);

功能

  • std(默认启用):包括 Rust 标准库。对于嵌入式环境,请禁用此功能。
  • enable-serde:启用 serde 支持。
  • simd_backend:该软件包使用 curve25519-dalek 来实现椭圆曲线群操作。在 nightly Rust 中,curve25519-dalek 支持使用 SIMD(单指令,多数据)指令以获得额外的效率。使用 Rust 的 nightly 版本启用此功能以使用 SIMD 操作(无论是 avx2 还是 ifma)。例如
# Requires nightly, RUSTFLAGS="-C target_feature=+avx2" to use avx2
cargo build --features "simd_backend"
# Requires nightly, RUSTFLAGS="-C target_feature=+avx512ifma" to use ifma
cargo build --features "simd_backend"
  • nightly:用于构建文档和 SIMD 支持。

依赖项

~1.5–2MB
~46K SLoC