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

📄 ec.java

📁 椭圆曲线的初始化和生成
💻 JAVA
字号:
import java.math.*;

public class EC
{
	
	BigInteger a;
	BigInteger b;
	BigInteger p;
	static BigInteger gn;//基点G的阶
	
	public void initialize()//初始化一条椭圆曲线
	{
		ECInitialize eci=new ECInitialize();
		eci.setAB();//这个方法在生成椭圆曲线时,要保证只用一次
		eci.setEllipticCurve();
        this.a=eci.setEllipticCurve().getA();
		this.b=eci.setEllipticCurve().getB();
		this.p=eci.getP();
	}
	
	public ECPoint getECPoint()//取一个符合椭圆曲线要求条件的点
	{
		ECInitialize eci=new ECInitialize();
		BigInteger right;
		BigInteger left;
        BigInteger x=eci.setBigSeed();
        BigInteger y=BigInteger.valueOf(0);
        do
        {
        	right=x.multiply(x.multiply(x)).add(a.multiply(x)).add(b);
            left=this.nrsqrt(right);//一般都是left.pow(2)<right 如5开平方得2,而2^2<5一样.
            x=x.add(BigInteger.ONE);
           
        }
        while(!(left.pow(2).compareTo(right)==0));
        return new ECPoint(x,y);
        
	}

	public BigInteger getGOrdor()
	{
		ECPoint G=this.getECPoint();
		if(this.isCurvePoint(G))
		{
			BigInteger x=G.x;
		    for(BigInteger i=BigInteger.ONE;G.x.compareTo(x)==0;i=i.add(BigInteger.ONE))
		    {
			    G=G.multiply(i,a,p);
			    if(G.x.compareTo(x)==0)
			    {
				    gn=i;
				    
				}
			}
			return gn;
		}
		else
		{
			return null;
		}
		
	}
	
	private static BigInteger nrsqrt(BigInteger n) //求数的平方根,移位实现
	{
  
        BigInteger t = n.shiftRight(BigInteger.valueOf(n.bitLength()).shiftRight(1).intValue()), 
        result = null; 
        for (;;) 
        {
           result = t.add(n.divide(t)).shiftRight(1);
           if (t.compareTo(result) == 0) break;
           t = result;
        }
        return result;
    }


    boolean isCurvePoint(ECPoint P)//是否为曲线上的点
    {
    	BigInteger x=P.x;
    	BigInteger y=P.y;
    	BigInteger left;
    	BigInteger right;
    	left=x.multiply(x.multiply(x)).add(a.multiply(x).add(b));
    	left=left.mod(p);
    	right=y.multiply(y);
    	right=right.mod(p);
    	if (left.compareTo(right)==0)
    		return true;
    	else 	return false;
    }
    
    public static void main(String args[])
    {
    	EC ec=new EC();
    	ECPoint p=new ECPoint(BigInteger.TEN,BigInteger.ONE);
    	ec.initialize();
    	System.out.println("*************************输出椭圆曲线参数的值*************************");
    	System.out.println("椭圆曲线参数a的值:a="+ec.a);
    	System.out.println();
    	System.out.println("椭圆曲线参数b的值:b="+ec.b);
    	System.out.println();
    	System.out.println("有限域p的值p="+ec.p);
    	System.out.println("***************************椭圆曲线参数的值***************************");
     	//输出以下结果的计算非常耗时
     	/*System.out.println(ec.isCurvePoint(p));
     	System.out.println(ec.getECPoint());
    	System.out.println(ec.gn);
    	System.out.println(ec.getGOrdor());
    	*/
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -