常用的双线性群:
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";