?? eccfp.java
字號:
import java.security.spec.ECFieldFp;
import java.security.spec.EllipticCurve;
import java.security.spec.ECPoint;
import java.math.BigInteger;
import java.util.Random;
public class ECCFp
{
private static final BigInteger p=BigInteger.valueOf(3);
//private static final long para=100;
protected BigInteger a;
protected BigInteger b;
BigInteger x;
BigInteger y;
public void setA()
{
Random rand=new Random(p.longValue());
a=BigInteger.valueOf(rand.hashCode()).mod(p);
//System.out.println("a="+a);
}
public BigInteger getA()
{
this.setA();
return a;
}
public void setB()
{
Random rand=new Random(p.longValue()+1);
b=BigInteger.valueOf(rand.hashCode()).mod(p);
//System.out.println("b="+b);
}
public BigInteger getB()
{
this.setB();
return b;
}
public void judgeAB()
{
BigInteger del=BigInteger.valueOf(0);
del=a.multiply(a).multiply(a).valueOf(4).add(b.multiply(b).valueOf(27));
if(del.mod(p).compareTo(BigInteger.valueOf(0))==0)
{
System.out.println("a,b取值不合理");
}
else
{
System.out.println("a,b取值正確");
}
}
//求域//調用了包里的函數/////////////////////
public ECFieldFp getField()
{
ECFieldFp field=new ECFieldFp(p);
return field;
}
//求橢圓曲線
public EllipticCurve eccCurve()
{
EllipticCurve myECCurve=new EllipticCurve(this.getField(),this.a,this.b);
return myECCurve;
}
//求橢圓曲線的階
public long getSteps()
{
long n=0;
//System.out.println("\n求橢圓曲線點的個數n,,即群的階為#E(Fp)=");
for(x=BigInteger.valueOf(0);;x=x.add(BigInteger.valueOf(1)))
{
for(y=BigInteger.valueOf(0);;y=y.add(BigInteger.valueOf(1)))
{
if(((y.multiply(y))).compareTo(((x.multiply(x.multiply(x))
.add(a.multiply(x.multiply(x)))).add(b)).mod(p))==0)
{
System.out.print("("+x+","+y+")");
++n;
}
else if(y.equals(p))
{
break;
}
}
if(x.equals(p))
{
break;
}
}
System.out.println();
return n+1;//加無窮遠點
}
//求橢圓曲線上的所有點
public ECPoint[] getAllPoints()throws ArrayIndexOutOfBoundsException,NullPointerException
{
long count=this.getSteps()-1;
ECPoint allPoints[]=new ECPoint[Long.valueOf(count).intValue()];
int i;
/*for(i=0;i < count;i++)
{
allPoints[i]=new ECPoint(BigInteger.ZERO,BigInteger.ZERO);
}*/
//求橢圓曲線的點
i=0;
for(x=BigInteger.valueOf(0);;x=x.add(BigInteger.valueOf(1)))
{
for(y=BigInteger.valueOf(0);;y=y.add(BigInteger.valueOf(1)))
{
if(((y.multiply(y))).compareTo(((x.multiply(x.multiply(x))
.add(a.multiply(x.multiply(x)))).add(b)).mod(p))==0)
{
allPoints[i]=new ECPoint(x,y);
i++;
}
else if(y.equals(p))
{
break;
}
}
if(x.equals(p))
{
break;
}
}
/*
for(int k=0;k<count;k++)
{
System.out.print(this.getAllPoints()[k].getAffineX()+","+this.getAllPoints()[k].getAffineY());
}
*/
return allPoints;
}
//求所有點的階
public BigInteger[] calculateAllofStep()throws ArrayIndexOutOfBoundsException,ArithmeticException
{
long count=this.getSteps()-1;
ECPoint point[]=new ECPoint[Long.valueOf(count).intValue()];
point=this.getAllPoints();
/*for(int k=0;k<count;k++)
{
System.out.println(point[k].getAffineX()+","+point[k].getAffineY());
}*/
int i;
BigInteger degree, x1,y1,x2,y2,x3,y3,k,k1;
BigInteger pointOfStep[]=new BigInteger[BigInteger.valueOf(count).intValue()];
for(i=0;i < count;i++)
{
pointOfStep[i]=BigInteger.ZERO;
}
for(i=0;i<count;i++)
{
degree=BigInteger.ZERO;
x1=point[i].getAffineX();
y1=point[i].getAffineY();
System.out.println(x1+","+y1+","+i);
if(y1.compareTo(BigInteger.ZERO)==0)
{
pointOfStep[i]=BigInteger.ONE;//點的Y值為0,則點的階為1
System.out.println("pointOfStep["+i+"]="+pointOfStep[i]+", ");
continue;
}
//兩相同點的加法公式
k=BigInteger.valueOf(3).multiply(x1.multiply(x1)).add(this.getA()).
divide(BigInteger.valueOf(2).multiply(y1).mod(this.p));
x2=k.multiply(k).subtract(BigInteger.valueOf(2).multiply(x1)).mod(this.p);
y2=k.multiply(x1.subtract(x2)).subtract(y1).mod(this.p);
if(y2.compareTo(y1)==0)//平行X軸,點的階加1,退出本次循環
{
pointOfStep[i]=pointOfStep[i].add(BigInteger.valueOf(1));
System.out.println("pointOfStep["+i+"]="+pointOfStep[i]+", ");
continue;
}
degree=degree.add(BigInteger.ONE);
//while(x2.compareTo(x1)!=0&&y2.compareTo(y1)!=0)
while(x2.subtract(x1)!=BigInteger.ZERO)
{
k1=y2.subtract(y1).divide(x2.subtract(x1));//.mod(this.p);
x3=k1.multiply(k1).subtract(x1).subtract(x2);//.mod(this.p);
y3=k1.multiply(x1.subtract(x2)).subtract(y1);//.mod(this.p);
if(y2.subtract(y3)==BigInteger.ZERO)
{
degree=degree.add(BigInteger.valueOf(1));
break;
}
else
{
x2=x3;
y2=y3;
}
degree=degree.add(BigInteger.ONE);
}
pointOfStep[i]=degree;
System.out.println("pointOfStep["+i+"]="+pointOfStep[i]+", ");
if(x1.equals(x2)&&y2.compareTo(y1.negate())==0)
{
continue;
}
}
return pointOfStep;
}
//求基點G并返回G點的階
public ECPoint getG()throws ArrayIndexOutOfBoundsException
{
long count=this.getSteps()-1;
BigInteger pointStep[]=new BigInteger[Long.valueOf(count).intValue()];
BigInteger stepG;
pointStep=this.calculateAllofStep();
ECPoint point[]=new ECPoint[Long.valueOf(count).intValue()];
ECPoint pointG;
point=this.getAllPoints();
int j=0;
for(int i=1;i<count;i++)
{
if(pointStep[j].compareTo(pointStep[i])<0)
{
j=i;
}
break;
/*if(j>0)
{
BigInteger temp;
temp=pointStep[0];
pointStep[0]=pointStep[j];
pointStep[j]=temp;
}*/
}
stepG=pointStep[j];
pointG=point[j];
System.out.println("基點坐標:G=("+pointG.getAffineX()+","+pointG.getAffineY()+")"+", stepG="+stepG);
return pointG;
}
public static void main(String args[])
{
ECCFp ec=new ECCFp();
System.out.println("a="+ec.getA());
System.out.println("b="+ec.getB());
ec.judgeAB();
System.out.println("field="+ec.getField());
System.out.println("橢圓曲線點的個數,即群的階為#E(Fp)="+ec.getSteps());
System.out.println("輸出橢圓曲線的點");
ec.getAllPoints();
ec.calculateAllofStep();
ec.getG();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -