Perdersen加密 Hyperledger实现
Perdersen承诺
Pedersen 承诺是一个满足完美隐藏、计算绑定的同态承诺协议,其完美隐藏性不依 赖与任何困难性假设,计算绑定依赖于离散对数假设(DLA),其构造分为 3 个阶段:
- 初始化阶段 setup:选择阶为大素数 q 的乘法群 G、生成元,G=
=,公开元祖 (g,h,q); - 承诺阶段 commit:承诺方选择随机数 r 作为盲因子,计算承诺值,然后发送 comm 给 接收者;
- 打开阶段 open:承诺方发送(v,r)给接收者,接收者验证 comm 是否等于 , 如果相等则接受,否则拒绝承诺。
代码实现
/**
* Setup
* @param ctx context, String security
* generate params
*/
@Transaction(name = "Setup", intent = Transaction.TYPE.SUBMIT)
public void Setup(final Context ctx, final String security) {
ChaincodeStub stub = ctx.getStub();
int securityInt = Integer.parseInt(security);
//生成p,q需要满足大质数性质
BigInteger p = BigInteger.probablePrime(2 * securityInt, new Random());
BigInteger q = p.multiply(BigInteger.valueOf(2)).add(BigInteger.valueOf(1));
//生成g,h只需要在1到q-1的范围内
Random random = new Random();
BigInteger g = new BigInteger(String.valueOf(random.nextInt(q.intValue()) + 1)) ;
BigInteger s = new BigInteger(String.valueOf(random.nextInt(q.intValue()) + 1)) ;
//根据相应关系计算h
BigInteger h = g.modPow(s,q);
//put参数
stub.putStringState("q", String.valueOf(p));
stub.putStringState("g", String.valueOf(g