1.算法原理
(原理图片直接截的知乎ID徐摆渡)
2.代码实现
package csdn;
import java.math.BigInteger;
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.jpbc.PairingParameters;
import it.unisa.dia.gas.jpbc.Point;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;
import it.unisa.dia.gas.plaf.jpbc.pairing.a.TypeACurveGenerator;
import it.unisa.dia.gas.plaf.jpbc.pbc.curve.PBCTypeACurveGenerator;
class Cipher{
//定义密文类型
Element X;
Element c;
}
class Algorithm{
Element s,P,Q;
Field G1,G2;
public void keygen() {
Pairing bp=PairingFactory.getPairing("a.properties");
G1=bp.getG1();
G2=bp.getZr();
//e= new EllipticCurve(new secp256r1());
BigInteger n=G2.getOrder();//椭圆曲线阶
Element G=G1.newRandomElement(); //椭圆曲线生成元
s=G2.newRandomElement();//私钥
P=G1.newRandomElement();//公钥
Q=P.duplicate().powZn(s);//公钥
System.out.println("public key is:"+P+" "+Q);
System.out.println("secret key is:"+s);
}
public Cipher enc(BigInteger m) {
Cipher ci=new Cipher();
Element r=G2.newRandomElement();
Element X1=P.duplicate().powZn(r);
Element X2=Q.duplicate().powZn(r);
Point X=(Point)X2;
Element c=X.getX().duplicate().mul(m);
ci.c=c;
ci.X=X1;
return ci;
}
public void Dec(Cipher ci) {
Element X3=ci.X.duplicate().powZn(s);
Point x=(Point)X3;
Element m=x.getX().duplicate().invert().mul(ci.c);
System.out.println("after decryption:"+m);
}
}
public class Elagamal {
public static void main(String[] args) {
// TODO Auto-generated method stub
Algorithm A=new Algorithm();
A.keygen();
BigInteger m=new BigInteger("178531257647819");//需要加密的明文,是一个大整数
Cipher c=A.enc(m);
A.Dec(c);
}
}
3.运算结果
public key is:6147642565949958508479793805198530026337706910044571940373701624048606296621639659716770523799809818875700108141306425063776316632389673692533068805432397,5807892737884636779977288008610194764293234855900208907484823780615667829992763728251242120523928614556036032284795094479936945398472193932456161925838585,0 2723377172141760623381345874347733744508532255110023260231320062964219922778033315396154860555909057963519888211088113400117660242449632763135899929101514,1201299932957086649327230028748357924226747702090875676399666620185245374107300800622569227242992973861259877487340411144395443748135070677427480394933416,0
secret key is:243278257380795219406081348922159421043848811809
after decryption:178531257647819