All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.apanlh.util.algorithm.ECKeyUtils Maven / Gradle / Ivy

There is a newer version: 2.0.0.2
Show newest version
package com.gitee.apanlh.util.algorithm;

import com.gitee.apanlh.exp.algorithm.InitPrivateKeyException;
import com.gitee.apanlh.exp.algorithm.InitPublicKeyException;
import com.gitee.apanlh.util.encode.Base64Utils;
import com.gitee.apanlh.util.encode.HexUtils;
import com.gitee.apanlh.util.random.RandomUtils;
import com.gitee.apanlh.util.valid.ValidParam;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.util.OpenSSHPrivateKeyUtil;
import org.bouncycastle.crypto.util.OpenSSHPublicKeyUtil;
import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.crypto.util.PrivateKeyInfoFactory;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
import org.bouncycastle.math.ec.ECPoint;

import java.math.BigInteger;
import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * 	EC密钥相关工具类
 * 	
 * 	@author Pan
 */
public class ECKeyUtils {
	
	/**
	 * 	默认构造函数
	 * 	
	 * 	@author Pan
	 */
	private ECKeyUtils() {
		// 不允许外部构造
		super();
	}
	
	/**
	 * 	生成EC密钥对
	 * 	
	 * 	@author Pan
	 * 	@param 	parameters	椭圆曲线参数
	 * 	@return	AsymmetricCipherKeyPair
	 */
	public static AsymmetricCipherKeyPair generateKeyPair(ECDomainParameters parameters) {
		ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
		keyPairGenerator.init(new ECKeyGenerationParameters(parameters, RandomUtils.getRandomOfSecure()));
		return keyPairGenerator.generateKeyPair();
	}
	
	/**	
	 * 	生成公钥
	 * 	
	 * 	@author Pan
	 * 	@param 	key			公钥
	 * 	@param 	parameters	椭圆曲线参数
	 * 	@return	ECPublicKeyParameters
	 */
	public static ECPublicKeyParameters generatePublicKey(AsymmetricKeyParameter key, ECDomainParameters parameters) {
		return new ECPublicKeyParameters(((ECPublicKeyParameters) key).getQ(), parameters);
	}

	/**	
	 * 	生成公钥
	 * 	
	 * 	@author Pan
	 * 	@param 	key			公钥
	 * 	@param 	parameters	椭圆曲线参数
	 * 	@return	ECPublicKeyParameters
	 */
	public static ECPublicKeyParameters generatePublicKey(ECPoint key, ECDomainParameters parameters) {
		return new ECPublicKeyParameters(key, parameters);
	}
	
	/**	
	 * 	生成公钥
	 * 	
	 * 	@author Pan
	 * 	@param 	keyPair		密钥对
	 * 	@param 	parameters	椭圆曲线参数
	 * 	@return	ECPublicKeyParameters
	 */
	public static ECPublicKeyParameters generatePublicKey(AsymmetricCipherKeyPair keyPair, ECDomainParameters parameters) {
		return generatePublicKey(keyPair.getPublic(), parameters);
	}
	
	/**	
	 * 	生成公钥
	 * 	
支持Q值(默认方式) *
X.509方式 * * @author Pan * @param publicKey 公钥 * @param parameters 椭圆曲线参数 * @return ECPublicKeyParameters */ public static ECPublicKeyParameters generatePublicKey(byte[] publicKey, ECDomainParameters parameters) { try { // 默认Q值解析 if (ValidParam.isNotNull(parameters)) { return new ECPublicKeyParameters(parameters.getCurve().decodePoint(publicKey), parameters); } } catch (Exception e) { // do nothing } // X.509解析 try { SubjectPublicKeyInfo instance = SubjectPublicKeyInfo.getInstance(publicKey); return (ECPublicKeyParameters) PublicKeyFactory.createKey(instance); } catch (Exception e) { try { // OpenSSH解析 return (ECPublicKeyParameters) OpenSSHPublicKeyUtil.parsePublicKey(publicKey); } catch (Exception e2) { throw new InitPublicKeyException(e2.getMessage(), e2); } } } /** * 生成公钥 * * @author Pan * @param publicKey 公钥 * @return ECPublicKeyParameters */ public static ECPublicKeyParameters generatePublicKey(PublicKey publicKey) { try { return (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey); } catch (Exception e) { throw new InitPublicKeyException(e.getMessage(), e); } } /** * 生成私钥 * * @author Pan * @param key 私钥 * @param parameters 椭圆曲线参数 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters generatePrivateKey(AsymmetricKeyParameter key, ECDomainParameters parameters) { return new ECPrivateKeyParameters(((ECPrivateKeyParameters) key).getD(), parameters); } /** * 生成私钥 * * @author Pan * @param keyPair 密钥对 * @param parameters 椭圆曲线参数 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters generatePrivateKey(AsymmetricCipherKeyPair keyPair, ECDomainParameters parameters) { return generatePrivateKey(keyPair.getPrivate(), parameters); } /** * 生成私钥 * * @author Pan * @param privateKey 私钥 * @param parameters 椭圆曲线参数 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters generatePrivateKey(byte[] privateKey, ECDomainParameters parameters) { try { // 默认D值解析 if (ValidParam.isNotNull(parameters)) { return new ECPrivateKeyParameters(new BigInteger(1, privateKey), parameters); } } catch (Exception e) { // do nothing } // X.509解析 try { PrivateKeyInfo privateKeyInfo = PrivateKeyInfo.getInstance(privateKey); return (ECPrivateKeyParameters) PrivateKeyFactory.createKey(privateKeyInfo); } catch (Exception e) { try { // OpenSSH解析 // OpenSSHPrivateKeySpec pKeySpec = new OpenSSHPrivateKeySpec(encodedKey); return (ECPrivateKeyParameters) OpenSSHPrivateKeyUtil.parsePrivateKeyBlob(privateKey); } catch (Exception e2) { throw new InitPublicKeyException(e2.getMessage(), e2); } } } /** * 生成私钥 * * @author Pan * @param privateKey 私钥 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters generatePrivateKey(PrivateKey privateKey) { try { return (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey); } catch (Exception e) { throw new InitPrivateKeyException(e.getMessage(), e); } } /** * 将key转换成byte[] * * @author Pan * @param key 公钥/私钥 * @return byte[] */ public static byte[] encodeToBytes(AsymmetricKeyParameter key) { try { if (key.isPrivate()) { return PrivateKeyInfoFactory.createPrivateKeyInfo(key).getEncoded(); } return SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(key).getEncoded(); } catch (Exception e) { throw new IllegalArgumentException(e.getMessage(), e); } } /** * 将key编码成十六进制 * * @author Pan * @param key 公钥/私钥 * @return byte[] */ public static String encodeToHex(AsymmetricKeyParameter key) { return HexUtils.encode(encodeToBytes(key)); } /** * 将key编码成Base64字符串 * * @author Pan * @param key 公钥/私钥 * @return byte[] */ public static byte[] encodeToBase64(AsymmetricKeyParameter key) { return Base64Utils.encode(encodeToBytes(key)); } /** * 将key编码成Base64 * * @author Pan * @param key 公钥/私钥 * @return String */ public static String encodeToBase64Str(AsymmetricKeyParameter key) { return Base64Utils.encodeToStr(encodeToBytes(key)); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy