7个版本 (4个破坏性更新)

0.5.0 2023年5月3日
0.4.1 2023年3月27日
0.3.0 2022年10月6日
0.2.1 2022年10月4日
0.1.0 2022年10月1日

#928密码学


enquo-core 中使用

MIT 协议

120KB
2K SLoC

这是 cretrit(发音为“cre-TRIT”),一个用于在任意数据上执行比较揭示加密操作(加密、比较)的Rust库。它实现了斯坦福大学Kevin Lewi和David J. Wu在论文《顺序揭示加密:新构造、应用和下界》中描述的两个值和三个值的加密比较算法。

这个库允许您对明文值进行加密,然后在加密形式上执行比较操作,这些操作的结果与在明文上执行的等效比较操作相同。这通常用于执行排序(比较是“这个值是否小于、等于还是大于那个值?”)和等价性(“这个值是否等于或不等于那个值?”)。然而,该库设计用于适应其他比较运算符,以防需要。为了提供实现示例并满足常见用例,还提供了通用的排序和等价性密文类型。

如果您对这个库中的想法感兴趣,但又觉得在这些低级原语上动手有点繁琐,您可能希望查看Enquo项目的其余部分。Enquo项目旨在为每个人提供加密、可查询的数据存储,广泛使用比较揭示加密。

安全状态

此库尚未由任何合格第三方对实现缺陷进行审计。如果您想进行或赞助此类审计,请联系我们。

如果您认为您在此库中发现了安全漏洞,请通过电子邮件至security@enquo.org联系我们。

用法

要使用现有的排序和等价性类型,您只需选择一个 密码套件,然后使用该密码套件中对应于您要执行的操作的模块。目前,只有一个密码套件可用,名为aes128v1,并提供ore(顺序揭示加密)和ere(等价揭示加密)模块。

从那里,你实例化一个Cipher,其泛型参数表示块的数量(N)和每个块的“宽度”(每个块可表示的值的数量,W),并给它一个用于加密的密钥。例如

// Let's do some order-revealing encryption!
use cretrit::aes128v1::ore;
# use rand::{Rng, SeedableRng};
# use rand_chacha::ChaCha20Rng;

# fn main() -> Result<(), cretrit::Error> {
// Always use cryptographically-secure random keys!
let key = ChaCha20Rng::from_entropy().gen::<[u8; 32]>();

// This cipher has four blocks, the value of each is in the range
// 0-255.  Hence, this cipher can represent the ordering of values
// between 0 and 256^4-1 (aka 2**32-1), which corresponds to a 32-bit
// unsigned integer.
let cipher = ore::Cipher::<4, 256>::new(&key)?;
# Ok(())
# }

这种加密方式是用来加密明文的。内部,明文是每个块值的数组,你可以使用这种表示方式。对于加密无符号整数,有TryFrom特质的实现,允许你直接传递整数,如下所示

# use cretrit::aes128v1::ore;
# fn main() -> Result<(), cretrit::Error> {
# let cipher = ore::Cipher::<4, 256>::new(&[0u8; 32])?;
let forty_two: u32 = 42;
let ore_forty_two = cipher.full_encrypt(&forty_two.try_into()?)?;
let over_nine_thousand: u32 = 9001;
let ore_over_nine_thousand = cipher.full_encrypt(&over_nine_thousand.try_into()?)?;
# Ok(())
# }

如果你试图转换为明文的值不能被你使用的明文类型表示,将返回一个cretrit::Error::RangeError

用于揭示顺序和相等性的加密方案的密文实现了适当的OrdEqPartial*变体。因此,你可以像比较任何其他值一样比较encrypt函数的输出

# use cretrit::aes128v1::ore;
# fn main() -> Result<(), cretrit::Error> {
# let cipher = ore::Cipher::<4, 256>::new(&[0u8; 32])?;
# let ore_forty_two = cipher.full_encrypt(&42u32.try_into()?)?;
# let ore_over_nine_thousand = cipher.full_encrypt(&9001u32.try_into()?)?;
assert!(ore_forty_two != ore_over_nine_thousand);
assert!(ore_forty_two < ore_over_nine_thousand);
# Ok(())
# }

你还可以将密文序列化到u8向量中,或从u8向量反序列化密文,这使得你可以在文件、数据库等中存储它们。以下是密文往返的一个简单示例

// Pull in the necessary trait
use cretrit::SerializableCipherText;

# use cretrit::aes128v1::ore;
# fn main() -> Result<(), cretrit::Error> {
# let cipher = ore::Cipher::<4, 256>::new(&[0u8; 32])?;
# let ore_forty_two = cipher.full_encrypt(&42u32.try_into()?)?;
# let ore_over_nine_thousand = cipher.full_encrypt(&9001u32.try_into()?)?;
let v = ore_forty_two.to_vec()?;

// When deserialising a ciphertext, you need to specify the cipher parameters
// so that the types line up.
let new_forty_two = ore::CipherText::<4, 256>::from_slice(&v)?;

// Once it's deserialised, it's back to its original form and ready to
// go!
assert!(new_forty_two == ore_forty_two);
assert!(new_forty_two != ore_over_nine_thousand);
assert!(new_forty_two < ore_over_nine_thousand);
# Ok(())
# }

术语

为了帮助理解所有这些内容,以下是一些我们在代码库和文档中使用的术语。

  • 比较揭示加密:一种通用加密方案,它生成的密文可以通过比较来确定由密文产生的明文之间的定义关系。理想情况下,密文不揭示关于两个明文或它们之间关系的任何其他信息。

  • 顺序揭示加密:一种比较揭示加密形式,它产生的密文揭示密文的相对顺序,而不给出底层明文实际值的任何提示。这是通过揭示一个密文是否小于、等于或大于任何其他密文来完成的,这对于对任何密文集合进行排序是必要的。

  • 相等性揭示加密:一种比较揭示加密形式,它产生的密文揭示两个密文背后的明文值是否相等或不相等。虽然顺序揭示加密也可以用来揭示相等性,但此形式在有一组值没有明确定义排序,或者你特别不想揭示这种排序时很有用。相等性揭示加密生成的密文大小也小于顺序揭示加密生成的密文。

  • 密码套件:一组加密原语,它们组合起来需要执行完整的比较揭示加密操作集。可以定义多个密码套件以提高安全性或提供更高的性能。

  • 密码:密码套件和比较运算符的组合,共同提供将明文加密为特定比较揭示形式的能力。

  • 明文块:为了控制密文大小,Lewi-Wu方案将单个大明文分成较小的块。每个块可以表示一定范围的值,一个明文有一个特定的块数。这些参数控制相应密文的尺寸和泄露。

贡献

有关贡献的一般指南,请参阅CONTRIBUTING.md

许可证

除非另有说明,本存储库中的所有内容均受以下许可声明(MIT许可证)的保护

    Copyright (C) 2022  Matt Palmer <[email protected]>

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in
    all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    THE SOFTWARE.

依赖项

约2.4-3.5MB
~63K SLoC