2 个不稳定版本
0.2.0 | 2023 年 2 月 21 日 |
---|---|
0.1.0 | 2022 年 9 月 15 日 |
#1114 在 算法 中
625 次每月下载
用于 cait-sith
305KB
157 行
Magikitten
使用 Meow 使公共币协议非交互式。
这个库也深受 Merlin 的启发,提供类似的构建方法,尽管有一些差异。
使用方法
使用库的本质是初始化一个 Transcript
对象,然后交替输入数据和提取随机数。
use rand_core::RngCore;
use magikitten::Transcript;
let mut transcript = Transcript::new(b"my cool protocol");
transcript.message(b"message0", b"hello world!");
let c0 = transcript.challenge(b"challenge0").next_u64();
transcript.message(b"message1", b"hello world again!");
let c1 = transcript.challenge(b"challenge1").next_u64();
challenge
函数更新转录本的状态,然后提供一个实现 RngCore
的对象,允许提取任意随机数。这个随机数(不可预测地)依赖于到目前为止的转录本状态,但其他方面是确定的。你用来创建挑战 RNG 的标签也会影响转录本,但 RNG 的状态是独立的,并且使用 RNG 的方式不会影响转录本。实现 RngCore
允许你使用挑战 RNG 生成任意复杂的对象。例如,可以进行拒绝采样或其他复杂技术。
顺序组合
在大多数情况下,你应该编写接受 Transcript
作为参数的方案,而不是自己创建它。
这允许方案按顺序组合,通过一个方案使用另一个方案交互的运行转录本。
与 Merlin 的差异
这个库深受 Merlin 的启发,基本上服务于相同的用例。尽管有一些差异。
Magikitten 使用减少轮次排列
我们使用 KitTen(Keccak 只用 10 轮),而不是使用 24 轮的 Keccak。这使得协议更快,但显然更易受 Keccak 密码分析潜在进步的影响。
有关使用 KitTen 的更多理由,请参阅 Meow。
挑战是一串字节
Merlin要求您指定挑战的长度,然后它将生成相应长度的挑战。另一方面,Magikitten提供给您一个任意的RNG对象。我认为这使得库更容易使用,因为许多函数可以轻松地编写以接受实现RngCore
特质的对象。一些采样算法,如拒绝采样,如果需要提前知道要采样的位数长度,则效果不佳。
此外,RNG对象是从transcript中播种的,然后变得独立。具有独立状态,您查询RNG位的方式不会影响transcript的其余部分。这更直观,因为看似等效的行为不会改变结果。例如,如果您使用字节数组缓冲区进行拒绝采样,增加此缓冲区大小不会影响您使用Magikitten获得的结果,因为RNG可以被视为一个简单的无限字节流。
在Merlin中,记录了每个RNG查询的长度,因此不同的RNG查询模式会改变结果。
不支持私有RNG
目前,Magikitten不支持私有随机性。但这可能是未来可能会添加的功能。
依赖项
~0.6–1.1MB
~19K SLoC