C2产生的双线性对有问题,是哪错了?

public void Encrypt(String params,String g,String ID,String w) throws IOException {
    Field G1=pairing.getG1();
    //转换为byte字节
    byte[] bparams=params.getBytes();
    byte[] bg=g.getBytes();
    //转换为element元素
    Element eparams=G1.newElementFromBytes(bparams).getImmutable();
    Element eg=pairing.getG1().newElement().;
    //生成r
    Field Zr=pairing.getZr();
    Element r=Zr.newRandomElement().getImmutable();
    //生成C1
    Element C1=eg.duplicate().powZn(r);
    //生成C2
    //身份哈希
    Element Hid=pairing.getG1().newElement().setFromHash(ID.getBytes(),0,ID.length()).getImmutable();
    Element cp1=pairing.pairing(Hid,eparams);
    Element C21=cp1.duplicate().powZn(r).getImmutable();
    //关键字哈希
    Element Hw=pairing.getG1().newElement().setFromHash(w.getBytes(),0,w.length()).getImmutable();
    Element cp21=pairing.pairing(Hw,eg);
    Element c22=cp21.duplicate().powZn(r).getImmutable();
    Element C2=C21.duplicate().mulZn(c22);
    System.out.println("C2="+C2);

按理来说输出的结果应是:

但现在输出的结果为:

你这个写的有问题啊,第六行newElement() 后面多了一个 .
下面是来自chat的回答
在初始化变量eg时,语句不完整,缺少从字节数组转换为element元素的代码。应该使用下面的代码初始化变量eg:Element eg = G1.newElement().setFromBytes(bg).getImmutable();。

在计算哈希值时,需要指定哈希值的长度,而不是使用ID.length()和w.length(),这可能会导致哈希值长度不一致。应该使用下面的代码计算哈希值:Element Hid = pairing.getG1().newElement().setFromHash(ID.getBytes(), 0, 20).getImmutable(); 和 Element Hw = pairing.getG1().newElement().setFromHash(w.getBytes(), 0, 20).getImmutable();,其中20表示哈希值的长度为20字节。

在计算C2时,应该先计算C21和c22,然后再使用mulZn()方法相乘。即应该使用下面的代码:Element C21 = cp1.duplicate().powZn(r).getImmutable(); 和 Element c22 = cp21.duplicate().powZn(r).getImmutable();,然后使用Element C2 = C21.mul(c22);。