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 STROBESTROBE是一种协议框架,意在构建在线传输协议。而Merlin主要用于零知识证明,仅需要用到STROBE的部分功能。Merlin在实际实现时,可直接调用STROBE库,也可单独实现STROBE中需用到的功能。
Merlin中有两大对象:
- a transcript,将prover和verifier之间的公开交互模型化;
- a transcript RNG,使用transcript来深度防御entropy attack熵攻击(可常见博客Entropy attack——hash函数的熵攻击)。
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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?