⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eccfp.java

📁 椭圆加密
💻 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 + -