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

📄 deriobuffer.java

📁 在ECC椭圆曲线上的一种加密算法
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
						new Integer(in[j + 2 + (in[j + 1] & 0x7f) + k]),						vec.size());				}				out.insertElementAt(vec, out.size());				j += (1 + in[j + 1] & 0x7f) + l;			} else { // Short				for (k = j; k <= j + 1 + in[j + 1]; k++) {					vec.insertElementAt(new Integer(in[k]), vec.size());				}				out.insertElementAt(vec, out.size());				j += 1 + in[j + 1];			}			vec = new Vector();		}		return out;	}	protected static int[] DerSeqEncode(int[] der_rep) {		Vector v = Utils.OS2V(der_rep);		DerInsertLength(v, 0x30);		int[] b = Utils.Vector2OS(v);		return b;	}	protected static int[] DerSeqEncode(Vector in) {		int[] seq_rep = Utils.Vector2OS((Vector) in.elementAt(0));		for (int i = 1; i < in.size(); i++) {			seq_rep =				Utils.concatenate(					seq_rep,					Utils.Vector2OS((Vector) in.elementAt(i)));		}		Vector v = Utils.OS2V(seq_rep);		DerInsertLength(v, 0x30);		seq_rep = Utils.Vector2OS(v);		return seq_rep;	}	protected static int DerExtractLength(Vector data) {		int length = 0;		data.removeElementAt(0); // erase DER type OCTET		if ((((Integer) data.elementAt(0)).intValue() & 0x80) != 0) { // Long			for (int j = 1;				j <= (((Integer) data.elementAt(0)).intValue() & 0x7f);				j++) {				length *= 0x100;				length += ((Integer) data.elementAt(j)).intValue();			}			int k = ((Integer) data.elementAt(0)).intValue() & 0x0f;			for (int l = 0; l < k + 1; l++) {				data.removeElementAt(0);			}		} else { // Short			length = ((Integer) data.elementAt(0)).intValue();			data.removeElementAt(0);		}		if (length != data.size())			length = 0;		return length;	}	protected static void DerInsertLength(Vector data, int DerTypeOctet) {		if (data.size() > 127) { // long form			long length = data.size();			int no_octets = 0x80;			while (length != 0) {				data.insertElementAt(new Integer((int) (length % 256)), 0);				length /= 256;				no_octets++;			}			data.insertElementAt(new Integer((int) no_octets), 0);		} else { // short form			data.insertElementAt(new Integer((int) (data.size())), 0);		}		data.insertElementAt(new Integer((int) DerTypeOctet), 0);	}	/**	 * Constructor	 */	/*public DerIOBuffer (int[] data)	{		this.data = new int[data.length];		for (int i=0; i<data.length; i++) {			this.data[i] = data[i];		}	}*/	/**	 * Constructor	 */	public DerIOBuffer(byte[] data) {		this.data = Utils.toIntArray(data);	}	protected static int[] DER_Encode(ECPubKey pk) {		Vector algorithmidentifier = new Vector();		// 06 Length (40*01+02+840+10045+02+01=)		Vector a = new Vector();		Vector algorithm = new Vector(9);		algorithm.insertElementAt(new Integer(0x06), 0);		algorithm.insertElementAt(new Integer(0x07), 1);		algorithm.insertElementAt(new Integer(0x2a), 2);		algorithm.insertElementAt(new Integer(0x86), 3);		algorithm.insertElementAt(new Integer(0x48), 4);		algorithm.insertElementAt(new Integer(0xce), 5);		algorithm.insertElementAt(new Integer(0x3d), 6);		algorithm.insertElementAt(new Integer(0x02), 7);		algorithm.insertElementAt(new Integer(0x01), 8);		a.insertElementAt(algorithm, a.size()); // version		// EC domain parameters		a.insertElementAt(Utils.OS2V(DER_Encode(pk.dp)), a.size());		algorithmidentifier = Utils.OS2V(DerSeqEncode(a));		Vector buf = new Vector();		buf.insertElementAt(algorithmidentifier, buf.size());		Vector ecpoint = DER_Encode((ECPointF2m) pk.W); // public key		ecpoint.insertElementAt(new Integer(0x00), 0);		if (ecpoint.size() > 127) {			int size = ecpoint.size();			int no_octets = 0;			while (size > 0) {				ecpoint.insertElementAt(new Integer(size % 0x100), 0);				size /= 0x100;				no_octets++;			}			no_octets |= 0x80;			ecpoint.insertElementAt(new Integer(no_octets), 0);		} else {			ecpoint.insertElementAt(new Integer(ecpoint.size()), 0);		}		ecpoint.insertElementAt(new Integer(0x03), 0);		buf.insertElementAt(ecpoint, buf.size());		int[] der_rep = DerSeqEncode(buf);		return der_rep;	}	protected static ECPubKey DER2ECPubKey(int[] der_rep) throws Exception {		if (der_rep[0] != 0x30)			throw (new Exception("DER2ECPrivKey: Not a Sequence"));		Vector buf = DerSeqDecode(der_rep);		Vector a = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(0)));		// buf[0]		// 06 Length (40*01+02+840+10045+02+01=)		// a[0]		// algorithm[0] = 0x06; algorithm[1] = 0x07; algorithm[2] = 0x2A;		// algorithm[3] = 0x86; algorithm[4] = 0x48; algorithm[5] = 0xCE;		// algorithm[6] = 0x3D; algorithm[7] = 0x02; algorithm[8] = 0x01;		int algorithm =			((Integer) (((Vector) a.elementAt(0)).elementAt(8))).intValue();		if (algorithm != 0x01)			throw (new Exception("DER2ECPubKey: Invalid Algorithm"));		// a[1]		ECDomainParameters dp =			DER2ECDP(Utils.Vector2OS((Vector) a.elementAt(1)));		// buf[1]		if (((Integer) ((Vector) buf.elementAt(1)).elementAt(0)).intValue()			!= 0x03)			throw (new Exception("DER2ECPubKey: ECPOINT Invalid"));		else {			// Use this to delete the length OCTETs			int length = DerExtractLength((Vector) buf.elementAt(1));			// delete 0x00 OCTET			 ((Vector) buf.elementAt(1)).removeElementAt(0);		}		ECPointF2m W = DER2Point(Utils.Vector2OS((Vector) buf.elementAt(1)));		ECPubKey pk = new ECPubKey(dp, W);		return pk;	}	protected static int[] DER_Encode(ECPrivKey sk) {		Vector v = new Vector();		v.insertElementAt(DER_Encode(1), v.size()); // version		v.insertElementAt(DER_Encode(sk.s), v.size()); // private key		v.insertElementAt(Utils.OS2V(DER_Encode(sk.dp)), v.size());		// EC domain parameters		int[] der_rep = DerSeqEncode(v);		return der_rep;	}	protected static ECPrivKey DER2ECPrivKey(int[] der_rep) throws Exception {		if (der_rep[0] != 0x30)			throw (new Exception("DER2ECPrivKey: Not a Sequence"));		Vector v = DerSeqDecode(der_rep);		if (DER2BigInt(Utils.Vector2OS((Vector) v.elementAt(0))).intValue()			!= 0x01)			throw (new Exception("DER2ECPrivKey: Unsupported Version"));		BigInteger s = DER2BigInt(Utils.Vector2OS((Vector) v.elementAt(1)));		ECDomainParameters dp =			DER2ECDP(Utils.Vector2OS((Vector) v.elementAt(2)));		ECPrivKey sk = new ECPrivKey(dp, s);		return sk;	}	protected static int[] DER_Encode(ECDSA sig) {		Vector AlgorithmIdentifier = new Vector();		// 06 Length (40*01+02+840+10045+02+01=)		Vector alg = new Vector(9);		alg.insertElementAt(new Integer(0x06), 0);		alg.insertElementAt(new Integer(0x07), 1);		alg.insertElementAt(new Integer(0x2a), 2);		alg.insertElementAt(new Integer(0x86), 3);		alg.insertElementAt(new Integer(0x48), 4);		alg.insertElementAt(new Integer(0xce), 5);		alg.insertElementAt(new Integer(0x3d), 6);		alg.insertElementAt(new Integer(0x02), 7);		alg.insertElementAt(new Integer(0x01), 8);		Vector algid_buf = new Vector();		algid_buf.insertElementAt(alg, algid_buf.size()); // algorithm		AlgorithmIdentifier = Utils.OS2V(DerSeqEncode(algid_buf));		Vector ECDSA_Sig_Value = new Vector();		Vector sigval_buf = new Vector();		sigval_buf.insertElementAt(DER_Encode(sig.c), sigval_buf.size());		// r in X9.62		sigval_buf.insertElementAt(DER_Encode(sig.d), sigval_buf.size());		// s in X9.62		ECDSA_Sig_Value = Utils.OS2V(DerSeqEncode(sigval_buf));		Vector buf = new Vector();		buf.insertElementAt(AlgorithmIdentifier, buf.size());		buf.insertElementAt(ECDSA_Sig_Value, buf.size());		int[] der_rep = DerSeqEncode(buf);		return der_rep;	}	protected static ECDSA DER2ECSignature(int[] der_rep) throws Exception {		if (der_rep[0] != 0x30)			throw (new Exception("DER2ECSignature: Not a Sequence"));		Vector buf = DerSeqDecode(der_rep);		Vector a = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(0)));		// buf[0]		// 06 Length (40*01+02+840+10045+02+01=)		// a[0]		// algorithm[0] = 0x06; algorithm[1] = 0x07; algorithm[2] = 0x2A;		// algorithm[3] = 0x86; algorithm[4] = 0x48; algorithm[5] = 0xCE;		// algorithm[6] = 0x3D; algorithm[7] = 0x02; algorithm[8] = 0x01;		int algorithm =			((Integer) (((Vector) a.elementAt(0)).elementAt(8))).intValue();		if (algorithm != 0x01)			throw (new Exception("DER2ECSignature: Invalid Algorithm"));		Vector b = DerSeqDecode(Utils.Vector2OS((Vector) buf.elementAt(1)));		// c is r in X9.62, d is s in X9.62		BigInteger c = DER2BigInt(Utils.Vector2OS((Vector) b.elementAt(0)));		BigInteger d = DER2BigInt(Utils.Vector2OS((Vector) b.elementAt(1)));		return new ECDSA(c, d);	}	protected static int[] DER_Encode(ECIES ct) {		Vector buf = new Vector();		buf.insertElementAt(Utils.OS2V(DER_Encode(ct.V)), buf.size());		buf.insertElementAt((DER_Encode(ct.C)), buf.size());		buf.insertElementAt((DER_Encode(ct.T)), buf.size());		int[] der_rep = DerSeqEncode(buf);		return der_rep;	}	protected static ECIES DER2ECIES(int[] der_rep) throws Exception {		if (der_rep[0] != 0x30)			throw (new Exception("DER2ECIES: Not a Sequence"));		Vector buf = DerSeqDecode(der_rep);		ECPubKey V = DER2ECPubKey(Utils.Vector2OS((Vector) buf.elementAt(0)));		int C[] = Utils.Vector2OS(DER2OCTETSTR((Vector) buf.elementAt(1)));		int T[] = Utils.Vector2OS(DER2OCTETSTR((Vector) buf.elementAt(2)));		return new ECIES(V, C, T);	}	/**	 * Constructor	 */	public DerIOBuffer(ECDomainParameters dp) {		data = DER_Encode(dp);	}	public ECDomainParameters toECDP() throws Exception {		return DER2ECDP(data);	}	/**	 * Constructor	 */	public DerIOBuffer(ECPubKey pubKey) {		data = DER_Encode(pubKey);	}	public ECPubKey toECPubKey() throws Exception {		return DER2ECPubKey(data);	}	/**	 * Constructor	 */	public DerIOBuffer(ECPrivKey privKey) {		data = DER_Encode(privKey);	}	public ECPrivKey toECPrivKey() throws Exception {		return DER2ECPrivKey(data);	}	/**	 * Constructor	 */	public DerIOBuffer(ECDSA sig) {		data = DER_Encode(sig);	}	public ECDSA toECSignature() throws Exception {		return DER2ECSignature(data);	}	/**	 * Constructor	 */	public DerIOBuffer(ECIES ct) {		data = DER_Encode(ct);	}	public ECIES toECIES() throws Exception {		return DER2ECIES(data);	}	public byte[] toByteArray() {		return Utils.toByteArray(data);	}	public String toString() {		String s = new String();		for (int i = 0; i < data.length; i++) {			if (data[i] < 16)				s = s.concat("0");			s = s.concat(BigInteger.valueOf(data[i]).toString(16));			s = s.concat(",");		}		return s;	}	protected Object clone() {		return new DerIOBuffer(Utils.toByteArray(data));	}}

⌨️ 快捷键说明

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