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

📄 j2eeeecpoint.java

📁 j2eeeECPoint.rar
💻 JAVA
字号:
package ecc.elliptic;import java.math.BigInteger;import java.util.Arrays;import java.io.*;public class ECPoint {    public final static BigInteger TWO = new BigInteger("2");    public final static BigInteger THREE = new BigInteger("3");    private EllipticCurve mother;    private BigInteger x, y;    private boolean iszero;    private ECPoint[] fastcache = null;    private ECPoint[] cache = null;    public void fastCache() {	try {	    if(fastcache == null) {		fastcache = new ECPoint[256];		fastcache[0] = new ECPoint(mother);		for(int i = 1; i < fastcache.length; i++) {		    fastcache[i] = fastcache[i-1].add(this);		}	    }	} catch (NoCommonMotherException e) {	    System.out.println("ECPoint.fastcache: THIS CANNOT HAPPEN!!!");	}    }    /** Constructs a point on an elliptic curve.     *@param mother The elliptic curve on wich the point is surposed to lie     *@param x the x coordinate of the point     *@param y the y coordinate of the point     *@exception Throws a NotOnMotherException if (x,y) is not on the mother curve.*/    public ECPoint(EllipticCurve mother, BigInteger x, BigInteger y) throws NotOnMotherException{	this.mother = mother;	this.x = x;	this.y = y;	if (!mother.onCurve(this)) throw new NotOnMotherException(this);	iszero = false;    }    /** Decompresses a compressed point stored in a byte-array into a new ECPoint.     *@param bytes the array of bytes to be decompressed     *@param mother the EllipticCurve the decompressed point is supposed to lie on.*/    public ECPoint(byte[] bytes, EllipticCurve mother) {	this.mother = mother;	if (bytes[0] == 2){	    iszero = true;	    return;	}	boolean ymt = false;	if(bytes[0] != 0) ymt = true;	bytes[0] = 0;	x = new BigInteger(bytes);	if(mother.getPPODBF() == null) System.out.println("Fuck dig!!!");	y = x.multiply(x).add(mother.geta()).multiply(x).add(mother.getb()).modPow(mother.getPPODBF(),mother.getp());	if(ymt != y.testBit(0)) {	    y = mother.getp().subtract(y);	}	iszero = false;    }         /** IMPORTANT this renders the values of x and y to be null! Use this constructor     *only to create instances of a Zero class!*/    public ECPoint(EllipticCurve e){	x = y = BigInteger.ZERO;	mother = e;	iszero = true;    }    public byte[] compress() {	byte[] cmp = new byte[mother.getPCS()];	if (iszero){	    cmp[0] = 2;	}	byte[] xb = x.toByteArray();	System.arraycopy(xb, 0, cmp, mother.getPCS()-xb.length, xb.length);	if(y.testBit(0)) cmp[0] = 1;	return cmp;    }    /** Adds another elliptic curve point to this point.     *@param q The point to be added     *@return the sum of this point on the argument     *@exception Throws a NoCommonMotherException if the two points don't lie on the same elliptic curve.*/    public ECPoint add(ECPoint q) throws NoCommonMotherException{	if (!hasCommonMother(q)) throw new NoCommonMotherException();	if (this.iszero) return q;	else if (q.isZero()) return this;	BigInteger y1 = y;	BigInteger y2 = q.gety();	BigInteger x1 = x;	BigInteger x2 = q.getx();	BigInteger alpha;	if (x2.compareTo(x1) == 0) {	    if (!(y2.compareTo(y1) == 0)) return new ECPoint(mother);	    else {		alpha = ((x1.modPow(TWO,mother.getp())).multiply(THREE)).add(mother.geta());		alpha = (alpha.multiply((TWO.multiply(y1)).modInverse(mother.getp()))).mod(mother.getp());	    }	} else {	    alpha = ((y2.subtract(y1)).multiply((x2.subtract(x1)).modInverse(mother.getp()))).mod(mother.getp());	} 	BigInteger x3,y3;	x3 = (((alpha.modPow(TWO,mother.getp())).subtract(x2)).subtract(x1)).mod(mother.getp());	y3 = ((alpha.multiply(x1.subtract(x3))).subtract(y1)).mod(mother.getp()); 	try{ return new ECPoint(mother,x3,y3); }	catch (NotOnMotherException e){	    System.out.println("Error in add!!! Result not on mother!");	    return null;	}    }        public ECPoint multiply(BigInteger coef) {	try{	    ECPoint result = new ECPoint(mother);	    byte[] coefb = coef.toByteArray();	    if(fastcache != null) {		for(int i = 0; i < coefb.length; i++) {		    result = result.times256().add(fastcache[coefb[i]&255]);		}		return result;	    }	    if(cache == null) {		cache = new ECPoint[16];		cache[0] = new ECPoint(mother);		for(int i = 1; i < cache.length; i++) {		    cache[i] = cache[i-1].add(this);		}	    }	    for(int i = 0; i < coefb.length; i++) {		result = result.times16().add(cache[(coefb[i]>>4)&15]).times16().add(cache[coefb[i]&15]);	    }	    return result;	} catch (NoCommonMotherException e) {	    System.out.println("Error in pow!!!");	    return null;	}    }    private ECPoint times16() {	try {	    ECPoint result = this;	    for(int i = 0; i < 4; i++) {		result = result.add(result);	    }	    return result;	} catch (Exception e) {	    System.out.println("ECPoint.times16: THIS CANNOT HAPPEN!!!");	    return null;	}    }    private ECPoint times256() {	try {	    ECPoint result = this;	    for(int i = 0; i < 8; i++) {		result = result.add(result);	    }	    return result;	} catch (Exception e) {	    System.out.println("ECPoint.times256: THIS CANNOT HAPPEN!!!");	    return null;	}    }    public BigInteger getx(){	return x;    }    public BigInteger gety(){	return y;    }    public EllipticCurve getMother(){	return mother;    }    public String toString(){	return "(" + x.toString() + ", " + y.toString() + ")";    }    public boolean hasCommonMother(ECPoint p){	if (this.mother.equals(p.getMother())) return true;	else return false;    }    public boolean isZero(){	return iszero;    }}

⌨️ 快捷键说明

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