5个不稳定版本
0.3.1 | 2023年12月10日 |
---|---|
0.3.0 | 2022年12月7日 |
0.2.0 | 2022年11月26日 |
0.1.1 | 2022年11月25日 |
0.1.0 | 2022年10月12日 |
#117 in 命令行界面
71KB
1K SLoC
libpep:多态伪命名和加密库
作者:Bernard van Gastel
许可证:Apache许可证2.0
不同语言中的同一库
- libpep-cpp (C++);
- libpep on crates.io (Rust).
该库实现了基于ElGamal的PEP加密及其加密消息上的操作。消息M
可以为具有与秘密密钥y
相关联的公钥Y
的接收者加密。这种加密是随机的:每次使用不同的随机数r
时,会得到不同的密文(加密消息)。我们用EG(r, M, Y)
表示这个加密函数。
该库支持对密文in
(= EG(r, M, Y)
,加密消息M
用于公钥Y
并使用随机数r
)进行三种操作
out = rerandomize(in, s)
:打乱密文。输入in
和输出out
都可以用相同的密钥y
解密,结果都是相同的解密信息M
。然而,输入和输出的二进制形式不同。规范:in = EG(r, M, Y)
转换为out = EG(r+s, M, Y)
;out = reshuffle(in, n)
:修改密文in
(M
的加密形式),使得解密out
后,解密信息将等于n*M
。规范:in = EG(r, M, Y)
转换为out = EG(r, n*M, Y)
。out = rekey(in, k)
:如果in
可以用密钥y
解密,那么out
可以用密钥k*y
解密。解密结果都是信息M
。规范:in = EG(r, M, Y)
转换为out = EG(r, M, k*Y)
。
可以将rekey(in, k)
和reshuffle(in, n)
组合成rks(in, k, n)
。
这些操作也有零知识证明版本。这些是必要的,以便一方可以证明另一方它已对输入数据应用了操作,而不泄露操作中使用的因子。
在多个中心服务器之间分配信任时,这些零知识证明是必不可少的,这样有故障的服务器就不能违反系统的安全保证。
应用
在匿名化过程中,核心操作是对n
进行重新洗牌。这会修改一个主匿名标识符,使用一个特定于接收匿名标识符的用户(或用户组)的系数n
。在应用用户特定的系数n
后,匿名标识符被称为本地匿名标识符。系数n
通常与用户的访问组相关联。
仅使用重新洗牌是不够的,因为匿名标识符仍然使用公钥Y
(可以使用私钥y
解密)进行加密。为了让用户能够解密加密的匿名标识符,需要结合一个协议来向用户传递私钥k*y
,进行带有k
的重新密钥操作。系数k
通常与用户的当前会话相关联。
为了使匿名标识符更难以追踪,经常应用重新随机化。这样,对加密匿名标识符的二元比较就不会泄露任何信息。
实现
此库使用Curve25519曲线上的Ristretto编码,在curve25519-dalek crate中实现。对于标量和群元素有一系列算术规则:群元素可以相互相加和相减。标量支持加法、减法和乘法。可以通过乘以逆元(对于非零标量s
使用s.invert()
)来进行除法。标量可以转换为群元素(通过乘以特殊生成器G
),但反之则不行。群元素也可以乘以标量。
群元素的取值范围是几乎32字节(最高位总是零,某些其他值是无效的)。因此,并非所有AES-256密钥(使用完整的32字节范围)都是有效的群元素。但所有群元素都是有效的AES-256密钥。群元素可以通过GroupElement::random(..)
或GroupElement::from_hash(..)
生成。标量也是32字节,可以通过Scalar::random(..)
或Scalar::from_hash(..)
生成。
零知识证明是离线的Schnorr证明,基于Fiat-Shamir变换。使用的哈希算法是SHA512。
构建和运行
使用cargo构建
cargo test
使用cargo运行
cargo run --bin peppy --features=build-binary
安装
使用
cargo install libpep --bin peppy --features=build-binary
背景
基于Eric Verheul和Bart Jacobs的文章《在身份管理和医学研究中的多态加密和匿名化》,发表在Nieuw Archief voor Wiskunde (NAW),第5/18卷,第3期,2017年,第168-172页。该文章不包含零知识证明。
依赖关系
~2–12MB
~153K SLoC