您当前的位置: 首页 > 

mutourend

暂无认证

  • 1浏览

    0关注

    661博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Merlin——零知识证明(1)理论篇

mutourend 发布时间:2019-09-10 17:51:50 ,浏览量:1

https://github.com/dalek-cryptography/merlin中的Merlin transcript是基于STROBE(参见博客strobe——面向IoT物联网应用的密码学协议框架)的封装,使用的是keccak-f/1600 128-bit安全级别。

Merlin是基于Fiat-Shamir transform(可参见博客Fiat-Shamir heuristic(含实现)和Random oracle)的实现,通过非交互式的方式实现交互式执行的效果。(直白说就是可将交互式零知识证明转化为非交互式零知识证明。)

1. Merlin VS STROBE

STROBE是一种协议框架,意在构建在线传输协议。而Merlin主要用于零知识证明,仅需要用到STROBE的部分功能。Merlin在实际实现时,可直接调用STROBE库,也可单独实现STROBE中需用到的功能。

Merlin中有两大对象:

  • a transcript,将prover和verifier之间的公开交互模型化;
  • a transcript RNG,使用transcript来深度防御entropy attack熵攻击(可常见博客Entropy attack——hash函数的熵攻击)。
2. Merlin transcript operation

Merlin代码库中的Merlin transcript是对STROBE对象的封装,库中使用的是0.3.0版本的strobe-rs库(当前最新版本为0.5.2),实例化为仅支持128-bit安全级别和使用Keccak-f/1600。

app_label:代表特定应用层面的分隔符,为a byte string。Merlin transcripts通常用它来初始化。

构建Merlin transcript的过程为:

  • 1)构建一个STROBE-128对象,该对象具有11-byte label b"Merlin v1.0"
  • 2)将message body消息体通过label b"dom-sep"附加在app_label后面。

Merlin的消息为byte strings,最大可支持4GB(u32::max_value() bytes)。通常不建议使用太长的消息,若消息过长,考虑将其hash化,并将相应的hash值作为消息附加上。 通过STROBE操作,将一条消息message附加在label label上:

AD[label || LE32(message.len())](message);

其中的LE32(x)为4字节的,以little-endian编码的32-bit数字x。采用的是STROBE论文第9页所定义的OP[meta](data)格式。由于Merlin没有传输的概念,其中的metadata采用meta-AD编码。

  • 3)构建完成,返回相应的transcript。

在交互式沟通时,会使用到多个challenges,若要将其转换为非交互式沟通,需要具有能将一序列的challenge bytes依序extract提取出来的能力。 为了将以label标记的一序列challenge bytes提取到buffer dest中,Merlin采用如下的STROBE操作:

dest             
关注
打赏
1664532908
查看更多评论
0.0429s