密码学使用双线性对运算遇到的问题小结(java JPBC)

常用的双线性群:

1、双线性群G1、G2
2、指数群Zr
3、目标群GT

双线性对运算

e(g1 ^ a , g2 ^ b) =e(g1,g2)^ab
公式中的g1,g2是属于双线性群G1,G2,指数a,b属于指数群Zr;
对运算的结果保存在目标群GT中;
也就是公式中的每一个数都属于一个群,你没法用指数群的两个数,进行对运算;

 CurveParameters params = new DefaultCurveParameters()
                .load(new ByteArrayInputStream(curveParams.getBytes()));
        Pairing pairing = PairingFactory.getPairing(params);

        Element g1 = pairing.getG1().newRandomElement();
        Element g2 = pairing.getG2().newRandomElement();
        Element gt = pairing.getGT().newElement();
        gt = pairing.pairing(g1,g2);

注意事项1

在进行对运算的时候,g1,g2必须要进行赋值,如果只是声明一个双线性群中的元素Element g1= pairing.getG1().newElement(),那么对计算结果会一直为{x=0,y=1},在JPBC中, G1,G2群中的元素都是一个个点坐标(基于椭圆曲线)。

注意事项2

在进行指数运算时,g1.powZn(a),会直接将指数运算后的值保存到g1中(即g1 = g1.powZn(a),当我们在后续得计算中,需要用原来的g1进行计算时,会发现g1的值被修改了,为了避免这种情况,不要直接用g1参与计算。(也包括乘加运算)

 CurveParameters params = new DefaultCurveParameters()
                .load(new ByteArrayInputStream(curveParams.getBytes()));
        Pairing pairing = PairingFactory.getPairing(params);

        Element g1 = pairing.getG1().newRandomElement();
        Element g2 = pairing.getG2().newRandomElement();
        Element a = pairing.getZr().newRandomElement();
        Element gt = pairing.getGT().newElement();
        
        Element ga = pairing.getG1().newElement();
        ga = g1.duplicate();//通过duplicate方法将g1的值赋值给ga
        ga.powZn(a);
        gt = pairing.pairing(ga,g2);

注意事项3

jpbc中的参数类型都是Element,可以通过内置的toBytes(),toString()方法进行转化,以便结合其他密码学算法。

  		Element g1 = pairing.getG1().newRandomElement();
  		byte[] b = g1.toBytes();
  		String str = g1.toString();

使用JPBC时,需要定义椭圆曲线的参数:

  		private static String curveParams = "type a\n"
            + "q 87807107996633125224377819847540498158068831994142082"
            + "1102865339926647563088022295707862517942266222142315585"
            + "8769582317459277713367317481324925129998224791\n"
            + "h 12016012264891146079388821366740534204802954401251311"
            + "822919615131047207289359704531102844802183906537786776\n"
            + "r 730750818665451621361119245571504901405976559617\n"
            + "exp2 159\n" + "exp1 107\n" + "sign1 1\n" + "sign0 1\n";
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值