#pep #encryption-key #zero-knowledge-proofs #crypto #pseudonimization

no-std bin+lib libpep

PEP原语的实现,提供伪命名和加密接口

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 命令行界面

Apache-2.0

71KB
1K SLoC

libpep:多态伪命名和加密库

作者:Bernard van Gastel
许可证:Apache许可证2.0

不同语言中的同一库

该库实现了基于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):修改密文inM的加密形式),使得解密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