引言
最近在做基于身份的签名算法仿真,涉及到椭圆曲线双线性配对,本人比较小白所以就用了JPBC库来实现。网上比较多教程的主要是使用TypeA曲线,但是TypeA曲线是对称的双线性对,搜索发现TypeF曲线是非对称的,本文简单分享下相关的内容。
一、对称与非对称双线性对
简单来说:设是大素数,
,
均为阶为
的乘法循环群,其中
是生成元。假设在群
,
中离散对数问题难解,双线性映射
。
如果说,就认为是对称双线性对;否则就是非对称双线性对。在设计基于非对称双线性对的密码体制时,群
,
中元素的长度往往是不同的,因此在两个群中计算效率也是不一样的。可以把主要的运算安排在元素短的群中,提高密码体制的效率。
二、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曲线两个群中的元素长度:
中元素长度是40bytes,
中元素长度是80bytes。
②我用typeF实现的方案比typeA实现的效率要差好多,是曲线特性的原因吗?