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

com.siashan.toolkit.crypt.util.ECKeyUtil Maven / Gradle / Ivy

package com.siashan.toolkit.crypt.util;

import com.siashan.toolkit.crypt.CryptException;
import com.siashan.toolkit.crypt.EncodeType;
import com.siashan.toolkit.crypt.KeyUtil;
import org.bouncycastle.crypto.params.AsymmetricKeyParameter;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.util.BigIntegers;

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

/**
 * EC密钥参数相关工具类封装
 *
 * 

参考 Hutool

* @author siashan * @since 1.0.7 */ public class ECKeyUtil { /** * 密钥转换为AsymmetricKeyParameter * * @param key PrivateKey或者PublicKey * @return ECPrivateKeyParameters或者ECPublicKeyParameters */ public static AsymmetricKeyParameter toParams(Key key) { if (key instanceof PrivateKey) { return toPrivateParams((PrivateKey) key); } else if (key instanceof PublicKey) { return toPublicParams((PublicKey) key); } return null; } //--------------------------------------------------------------------------- Public Key /** * 转换为 ECPublicKeyParameters * * @param q 公钥Q值 * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toSm2PublicParams(byte[] q) { return toPublicParams(q, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为 ECPublicKeyParameters * * @param q 公钥Q值 * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toSm2PublicParams(String q) { return toPublicParams(q, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为SM2的ECPublicKeyParameters * * @param x 公钥X * @param y 公钥Y * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toSm2PublicParams(String x, String y) { return toPublicParams(x, y, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为SM2的ECPublicKeyParameters * * @param xBytes 公钥X * @param yBytes 公钥Y * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toSm2PublicParams(byte[] xBytes, byte[] yBytes) { return toPublicParams(xBytes, yBytes, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为ECPublicKeyParameters * * @param x 公钥X * @param y 公钥Y * @param domainParameters ECDomainParameters * @return ECPublicKeyParameters,x或y为{@code null}则返回{@code null} */ public static ECPublicKeyParameters toPublicParams(String x, String y, ECDomainParameters domainParameters) { return toPublicParams(KeyUtil.decodeKey(x, EncodeType.HEX), KeyUtil.decodeKey(y,EncodeType.HEX), domainParameters); } /** * 转换为ECPublicKeyParameters * * @param xBytes 公钥X * @param yBytes 公钥Y * @param domainParameters ECDomainParameters曲线参数 * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toPublicParams(byte[] xBytes, byte[] yBytes, ECDomainParameters domainParameters) { if(null == xBytes || null == yBytes){ return null; } return toPublicParams(BigIntegers.fromUnsignedByteArray(xBytes), BigIntegers.fromUnsignedByteArray(yBytes), domainParameters); } /** * 转换为ECPublicKeyParameters * * @param x 公钥X * @param y 公钥Y * @param domainParameters ECDomainParameters * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toPublicParams(BigInteger x, BigInteger y, ECDomainParameters domainParameters) { if (null == x || null == y) { return null; } final ECCurve curve = domainParameters.getCurve(); return toPublicParams(curve.createPoint(x, y), domainParameters); } /** * 转换为ECPublicKeyParameters * * @param pointEncoded 被编码的曲线坐标点 * @param domainParameters ECDomainParameters * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toPublicParams(String pointEncoded, ECDomainParameters domainParameters) { final ECCurve curve = domainParameters.getCurve(); return toPublicParams(curve.decodePoint(KeyUtil.decodeKey(pointEncoded,EncodeType.HEX)), domainParameters); } /** * 转换为ECPublicKeyParameters * * @param pointEncoded 被编码的曲线坐标点 * @param domainParameters ECDomainParameters * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toPublicParams(byte[] pointEncoded, ECDomainParameters domainParameters) { final ECCurve curve = domainParameters.getCurve(); return toPublicParams(curve.decodePoint(pointEncoded), domainParameters); } /** * 转换为ECPublicKeyParameters * * @param point 曲线坐标点 * @param domainParameters ECDomainParameters * @return ECPublicKeyParameters */ public static ECPublicKeyParameters toPublicParams(org.bouncycastle.math.ec.ECPoint point, ECDomainParameters domainParameters) { return new ECPublicKeyParameters(point, domainParameters); } /** * 公钥转换为 {@link ECPublicKeyParameters} * * @param publicKey 公钥,传入null返回null * @return {@link ECPublicKeyParameters}或null */ public static ECPublicKeyParameters toPublicParams(PublicKey publicKey) { if (null == publicKey) { return null; } try { return (ECPublicKeyParameters) ECUtil.generatePublicKeyParameter(publicKey); } catch (InvalidKeyException e) { throw new CryptException(e); } } //--------------------------------------------------------------------------- Private Key /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值16进制字符串 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toSm2PrivateParams(String d) { return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toSm2PrivateParams(byte[] d) { return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值 * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toSm2PrivateParams(BigInteger d) { return toPrivateParams(d, SmUtil.SM2_DOMAIN_PARAMS); } /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值16进制字符串 * @param domainParameters ECDomainParameters * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toPrivateParams(String d, ECDomainParameters domainParameters) { return toPrivateParams(BigIntegers.fromUnsignedByteArray(KeyUtil.decodeKey(d,EncodeType.HEX)), domainParameters); } /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值 * @param domainParameters ECDomainParameters * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toPrivateParams(byte[] d, ECDomainParameters domainParameters) { return toPrivateParams(BigIntegers.fromUnsignedByteArray(d), domainParameters); } /** * 转换为 ECPrivateKeyParameters * * @param d 私钥d值 * @param domainParameters ECDomainParameters * @return ECPrivateKeyParameters */ public static ECPrivateKeyParameters toPrivateParams(BigInteger d, ECDomainParameters domainParameters) { if (null == d) { return null; } return new ECPrivateKeyParameters(d, domainParameters); } /** * 私钥转换为 {@link ECPrivateKeyParameters} * * @param privateKey 私钥,传入null返回null * @return {@link ECPrivateKeyParameters}或null */ public static ECPrivateKeyParameters toPrivateParams(PrivateKey privateKey) { if (null == privateKey) { return null; } try { return (ECPrivateKeyParameters) ECUtil.generatePrivateKeyParameter(privateKey); } catch (InvalidKeyException e) { throw new CryptException(e); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy