热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Proof(ofknowledge)ofexponentiation

1.ProofofexponentiationProofofexponentiation是基于adaptiverootassumption(充分必要条件࿰

1. Proof of exponentiation

Proof of exponentiation是基于adaptive root assumption(充分必要条件)的。
在这里插入图片描述
在这里插入图片描述
特别适合当xxx很大时,计算r=xmodl,urr=x\ mod\ l,\ u^rr=x mod l, ur将大量节约verifier直接计算uxu^xux的时间。
在这里插入图片描述

借助Fiat-Shamir heuristic,可将上面的交互式PoE转化为NI-PoE:
在这里插入图片描述
对应在https://github.com/dignifiedquire/rust-accumulators/blob/master/src/proofs.rs中的实现为:

/// NI-PoE Prove
/// Assumes `u^x = w`
/// All operations are `mod n`.
pub fn ni_poe_prove(x: &BigUint, u: &BigUint, w: &BigUint, n: &BigUint) -> ExponentProof {debug_assert!(&u.modpow(x, n) &#61;&#61; w, "invalid input");// l <- H_prime(x, u, w)let mut to_hash &#61; x.to_bytes_be();to_hash.extend(&u.to_bytes_be());to_hash.extend(&w.to_bytes_be());let l &#61; hash_prime::<_, Blake2b>(&to_hash);// q <- floor(x/l)let q &#61; x.div_floor(&l);//Prover sends Q <- u^q ∈ G to the Verifier.u.modpow(&q, n)
}/// NI-PoE Verify
/// Assumes &#96;u^x &#61; w&#96;
/// All operations are &#96;mod n&#96;.
pub fn ni_poe_verify(x: &BigUint,u: &BigUint,w: &BigUint,q: &ExponentProof,n: &BigUint,
) -> bool {// l <- H_prime(x, u, w)let mut to_hash &#61; x.to_bytes_be();to_hash.extend(&u.to_bytes_be());to_hash.extend(&w.to_bytes_be());let l &#61; hash_prime::<_, Blake2b>(&to_hash);// r <- x mod llet r &#61; x.mod_floor(&l);// Q^l u^r &#61;&#61; w&((q.modpow(&l, &n) * &u.modpow(&r, &n)) % n) &#61;&#61; w
}// 基于hash值来获取prime数值。
// When the proofs are made non-interactive, using the
// Fiat-Shamir heuristic the challenge is generated by hashing the previous transcript/// Hash the given numbers to a prime number.
/// Currently uses only 128bits.
pub fn hash_prime, D: Digest>(input: &[u8]) -> BigUint {let mut y &#61; BigUint::from_bytes_be(&D::digest(input)[..16]);while !probably_prime(&y, 20) {y &#61; BigUint::from_bytes_be(&D::digest(&y.to_bytes_be())[..16]);}y
}

2. Proof of knowledge of exponentiation


2.1 有安全攻击隐患的PoKE

在这里插入图片描述
在这里插入图片描述
此时&#xff0c;verifier不需要自己计算余数rrr&#xff0c;改由prover提供。同时注意&#xff0c;此时要求discrete logarithm base ggg必须被包含在CRS中⇒\Rightarrow 存在安全攻击问题&#xff0c;不是secure protocol&#xff1a;
在这里插入图片描述


2.2 基于base ggguuu的两次PoKE

对witness xxx的证明&#xff0c;做了两次PoKE证明&#xff0c;一次是base ggg&#xff0c;一次是base uuu
在这里插入图片描述
以上&#xff0c;proof中包含了两个group元素Q和Q′Q和Q&#39;QQ。如下&#xff0c;通过增加一个challenge α\alphaα&#xff0c;可以将proof中的group元素仍然减为1个QQQ&#xff1a;
在这里插入图片描述
借助Fiat-Shamir heuristic&#xff0c;可将上面的交互式PoKE2转化为NI-PoKE2&#xff1a;
在这里插入图片描述
对应在https://github.com/dignifiedquire/rust-accumulators/blob/master/src/proofs.rs中的实现为&#xff1a;

//proof of knowledge of exponent, i.e. a proof that a computationally bounded prover knows the discrete logarithm between two elements in a group of unknown order. The proof is succinct in that the proof size and verification time is independent of the size of the discrete-log./// NI-PoKE2 Prove
/// assumes &#96;u^x &#61; w&#96;
/// All operations are &#96;mod n&#96;.
pub fn ni_poke2_prove(x: impl Into,u: &BigUint,w: &BigUint,n: &BigUint,
) -> (BigUint, BigUint, BigInt) {let x: BigInt &#61; x.into();debug_assert!(&modpow_uint_int(u, &x, n).unwrap() &#61;&#61; w, "invalid input");// g <- H_G(u, w)let mut to_hash &#61; u.to_bytes_be();to_hash.extend(&w.to_bytes_be());let g &#61; hash_group::<_, Blake2b>(&to_hash, n);// z &#61; g^xlet z &#61; modpow_uint_int(&g, &x, n).expect("invalid state");// l <- H_prime(u, w, z)to_hash.extend(&z.to_bytes_be());let l: BigInt &#61; hash_prime::<_, Blake2b>(&to_hash).into();// alpha &#61; H(u, w, z, l)to_hash.extend(&l.to_bytes_be().1);let alpha &#61; BigUint::from_bytes_be(&Blake2b::digest(&to_hash)[..]);// q <- floor(x/l)// r <- x % llet (q, r) &#61; x.div_rem(&l);// Q <- (ug^alpha)^qlet q_big &#61; modpow_uint_int(&(u * &g.modpow(&alpha, n)), &q, n).expect("invalid state");(z, q_big, r)
}/// NI-PoKE2 Verify
/// assumes &#96;u^x &#61; w&#96;
/// All operations are &#96;mod n&#96;
pub fn ni_poke2_verify(u: &BigUint,w: &BigUint,pi: &(BigUint, BigUint, BigInt),n: &BigUint,
) -> bool {// {z, Q, r} <- pilet (z, q_big, r) &#61; pi;// g <- H_G(u, w)let mut to_hash &#61; u.to_bytes_be();to_hash.extend(&w.to_bytes_be());let g &#61; hash_group::<_, Blake2b>(&to_hash, n);// l <- H_prime(u, w, z)to_hash.extend(&z.to_bytes_be());let l &#61; hash_prime::<_, Blake2b>(&to_hash);// alpha &#61; H(u, w, z, l)to_hash.extend(&l.to_bytes_be());let alpha &#61; BigUint::from_bytes_be(&Blake2b::digest(&to_hash)[..]);// Q^l(ug^alpha)^rlet lhs: BigInt &#61; ((q_big.modpow(&l, n)* modpow_uint_int(&(u * &g.modpow(&alpha, n)), &r, n).expect("invalid state"))% n).into();// wz^alphalet z_alpha &#61; z.modpow(&alpha, n);let rhs: BigInt &#61; ((w * z_alpha) % n).into();lhs &#61;&#61; rhs
}

3. Aggreating Knowledge of Co-prime Roots

在第2节中&#xff0c;已可证明ux&#61;wu^x&#61;wux&#61;w&#xff0c;若有一系列的co-prime roots x1,...,xnx_1,...,x_nx1,...,xn满足wixi&#61;αiw_i^{x_i}&#61;\alpha_iwixi&#61;αigcd(xi,xj)&#61;1∀i,j∈[1,n],i!&#61;jgcd(x_i,x_j)&#61;1\forall i,j\in[1,n],i!&#61;jgcd(xi,xj)&#61;1i,j[1,n],i!&#61;j
在这里插入图片描述
在这里插入图片描述
https://github.com/cambrian/accumulator/中也有相应的代码实现&#xff0c;且实现的性能要优于https://github.com/dignifiedquire/rust-accumulators/
&#96;&#96;

#[allow(non_snake_case)]
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
/// Struct for NI-PoKCR.
pub struct Pokcr {w: G::Elem,
}impl Pokcr {/// Generates an NI-PoKCR proof.pub fn prove(witnesses: &[G::Elem]) -> Self {Self {w: witnesses.iter().fold(G::id(), |a, b| G::op(&a, b)),}}/// Verifies an NI-PoKCR proof.pub fn verify(alphas: &[G::Elem], x: &[Integer], proof: &Self) -> bool {let y &#61; multi_exp::(alphas, x);let lhs &#61; G::exp(&proof.w, &x.iter().product());lhs &#61;&#61; y}
}

参考资料&#xff1a;
[1] 2018年论文《Batching Techniques for Accumulators with Applications to IOPs and Stateless Blockchains》
[2] 博客密码学中的各种假设——DL/SDH…


推荐阅读
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 本章详细介绍SP框架中的数据操作方法,包括数据查找、记录查询、新增、删除、更新、计数及字段增减等核心功能。通过具体示例和详细解析,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • Nature Microbiology: 人类肠道古菌基因组目录
    本研究揭示了人类肠道微生物群落中古细菌的多样性,分析了来自24个国家、农村和城市人群的1,167个非冗余古细菌基因组。研究鉴定了多个新分类群,并探讨了古菌对宿主的适应性及其与社会人口特征的关系。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • 本文详细介绍了 Linux 系统中用户、组和文件权限的设置方法,包括基本权限(读、写、执行)、特殊权限(SUID、SGID、Sticky Bit)以及相关配置文件的使用。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文介绍了如何在Java中使用org.apache.commons.math3.linear.ArrayRealVector.getEntry()方法,并提供了多个实际应用中的代码示例。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • Android 6.0 切换指定 Wi-Fi 的解决方案
    本文详细介绍了在 Android 6.0 系统中切换到指定 Wi-Fi 的方法,包括常见的问题、原因分析及解决方案。通过官方文档和代码示例,帮助开发者更好地理解和实现这一功能。 ... [详细]
author-avatar
饰间人爱642_370
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有