JPBC实现非对称双线性配对:typeF型曲线

文章目录

  • 引言
  • 一、对称与非对称双线性对
  • 二、TypeF简单使用
    • 1.初始化实例
    • 2.生成群元素与计算
  • 疑问与补充



引言

    最近在做基于身份的签名算法仿真,涉及到椭圆曲线双线性配对,本人比较小白所以就用了JPBC库来实现。网上比较多教程的主要是使用TypeA曲线,但是TypeA曲线是对称的双线性对,搜索发现TypeF曲线是非对称的,本文简单分享下相关的内容。


一、对称与非对称双线性对

    简单来说:设q是大素数,G_{1}G_{2}均为阶为q的乘法循环群,其中是生成元。假设在群G_{1},G_{2}中离散对数问题难解,双线性映射。

     如果说,就认为是对称双线性对;否则就是非对称双线性对。在设计基于非对称双线性对的密码体制时,群G_{1},G_{2}中元素的长度往往是不同的,因此在两个群中计算效率也是不一样的。可以把主要的运算安排在元素短的群中,提高密码体制的效率。


二、TypeF简单使用


1.初始化pairing实例

    把jpbc库里下载的params文件里的f.properties复制到工程下,再开始写代码。这一步不会的可以搜一下网上有大把typeA的教程。

        import it.unisa.dia.gas.jpbc.Element;
        import it.unisa.dia.gas.jpbc.Field;
        import it.unisa.dia.gas.jpbc.Pairing;
        import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
        //import相关的库

        Pairing bp = PairingFactory.getPairing("f.properties");
        //读取文件中的椭圆曲线参数 生成一个pairing实例
        //f曲线是非对称的
        PairingFactory.getInstance().setUsePBCWhenPossible(true);
        
        Field G1 = bp.getG1();
        Field G2 = bp.getG2();
        Field Zr = bp.getZr();
        //生成三个域 z是整数域 G1 G2是包含椭圆曲线上点的域


 


2.生成群元素与计算

   生成需要的群元素,在进行运算时要注意,不同群中的元素不能进行乘法等运算。

   在元素后加上.getImmutable(),保证在运算过程中元素值不会跟着改变。

        Element g1 = G1.newRandomElement().getImmutable();//G1生成元
        Element g2 = G2.newRandomElement().getImmutable();//G2生成元

        Element sk = Zr.newRandomElement().getImmutable();//个人私钥
        Element pk = g2.powZn(sk).getImmutable();//用私钥计算公钥       
        e1 = bp.pairing(Sig,g2).getImmutable();//e(s,g2)
  	    e2 = bp.pairing(hm,pk).getImmutable();//e(hm,pk)
  	     
  	    left=e1.getImmutable();
  	    right=e2.getImmutable();
  	        
  	     if(left.isEqual(right)) {
  	    		
  	    		System.out.println("签名合法");
  	     }



疑问与补充

①TypeF曲线两个群中的元素长度:

G_{1}中元素长度是40bytes,G_{2}中元素长度是80bytes。

②我用typeF实现的方案比typeA实现的效率要差好多,是曲线特性的原因吗?

你可能感兴趣的:(密码学仿真,java)