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);。