From c64f1c8133f9483277d1e3119e9a244369f68e91 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 9 Nov 2023 09:31:02 +0800 Subject: [PATCH] fix code --- .../org/dromara/hutool/crypto/KeyUtil.java | 8 +- .../org/dromara/hutool/crypto/bc/BCUtil.java | 76 ------------------- .../dromara/hutool/crypto/bc/ECKeyUtil.java | 73 ++++++++++++++++++ 3 files changed, 77 insertions(+), 80 deletions(-) diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java index 14964d09c..be4eb5a98 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/KeyUtil.java @@ -20,7 +20,7 @@ import org.dromara.hutool.core.text.CharUtil; import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.RandomUtil; import org.dromara.hutool.crypto.asymmetric.AsymmetricAlgorithm; -import org.dromara.hutool.crypto.bc.BCUtil; +import org.dromara.hutool.crypto.bc.ECKeyUtil; import org.dromara.hutool.crypto.bc.SmUtil; import org.dromara.hutool.crypto.provider.GlobalProviderFactory; import org.dromara.hutool.crypto.symmetric.SymmetricAlgorithm; @@ -724,7 +724,7 @@ public class KeyUtil { * @since 4.4.4 */ public static byte[] encodeECPublicKey(final PublicKey publicKey) { - return BCUtil.encodeECPublicKey(publicKey); + return ECKeyUtil.encodeECPublicKey(publicKey); } /** @@ -737,7 +737,7 @@ public class KeyUtil { * @since 4.4.4 */ public static PublicKey decodeECPoint(final String encode, final String curveName) { - return BCUtil.decodeECPoint(encode, curveName); + return ECKeyUtil.decodeECPoint(encode, curveName); } /** @@ -750,7 +750,7 @@ public class KeyUtil { * @since 4.4.4 */ public static PublicKey decodeECPoint(final byte[] encodeByte, final String curveName) { - return BCUtil.decodeECPoint(encodeByte, curveName); + return ECKeyUtil.decodeECPoint(encodeByte, curveName); } /** diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/BCUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/BCUtil.java index 23e487495..f392fe8fe 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/BCUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/BCUtil.java @@ -16,22 +16,13 @@ import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.params.ECDomainParameters; -import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; -import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; -import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util; import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil; -import org.bouncycastle.jce.spec.ECNamedCurveSpec; import org.bouncycastle.jce.spec.ECParameterSpec; -import org.bouncycastle.math.ec.ECCurve; import org.dromara.hutool.core.io.IORuntimeException; -import org.dromara.hutool.crypto.KeyUtil; -import org.dromara.hutool.crypto.SecureUtil; import java.io.IOException; import java.security.PrivateKey; import java.security.PublicKey; -import java.security.spec.ECPoint; -import java.security.spec.ECPublicKeySpec; /** * Bouncy Castle相关工具类封装 @@ -41,73 +32,6 @@ import java.security.spec.ECPublicKeySpec; */ public class BCUtil { - /** - * 只获取私钥里的d,32位字节 - * - * @param privateKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey - * @return 压缩得到的X - * @since 5.1.6 - */ - public static byte[] encodeECPrivateKey(final PrivateKey privateKey) { - return ((BCECPrivateKey) privateKey).getD().toByteArray(); - } - - /** - * 编码压缩EC公钥(基于BouncyCastle),即Q值
- * 见:https://www.cnblogs.com/xinzhao/p/8963724.html - * - * @param publicKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey - * @return 压缩得到的Q - * @since 4.4.4 - */ - public static byte[] encodeECPublicKey(final PublicKey publicKey) { - return encodeECPublicKey(publicKey, true); - } - - /** - * 编码压缩EC公钥(基于BouncyCastle),即Q值
- * 见:https://www.cnblogs.com/xinzhao/p/8963724.html - * - * @param publicKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey - * @param isCompressed 是否压缩 - * @return 得到的Q - * @since 5.5.9 - */ - public static byte[] encodeECPublicKey(final PublicKey publicKey, final boolean isCompressed) { - return ((BCECPublicKey) publicKey).getQ().getEncoded(isCompressed); - } - - /** - * 解码恢复EC压缩公钥,支持Base64和Hex编码,(基于BouncyCastle)
- * 见:https://www.cnblogs.com/xinzhao/p/8963724.html - * - * @param encode 压缩公钥 - * @param curveName EC曲线名 - * @return 公钥 - * @since 4.4.4 - */ - public static PublicKey decodeECPoint(final String encode, final String curveName) { - return decodeECPoint(SecureUtil.decode(encode), curveName); - } - - /** - * 解码恢复EC压缩公钥,支持Base64和Hex编码,(基于BouncyCastle) - * - * @param encodeByte 压缩公钥 - * @param curveName EC曲线名,例如{@link SmUtil#SM2_DOMAIN_PARAMS} - * @return 公钥 - * @since 4.4.4 - */ - public static PublicKey decodeECPoint(final byte[] encodeByte, final String curveName) { - final X9ECParameters x9ECParameters = ECUtil.getNamedCurveByName(curveName); - final ECCurve curve = x9ECParameters.getCurve(); - final ECPoint point = EC5Util.convertPoint(curve.decodePoint(encodeByte)); - - // 根据曲线恢复公钥格式 - final ECNamedCurveSpec ecSpec = new ECNamedCurveSpec(curveName, curve, x9ECParameters.getG(), x9ECParameters.getN()); - return KeyUtil.generatePublicKey("EC", new ECPublicKeySpec(point, ecSpec)); - } - /** * 构建ECDomainParameters对象 * diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/ECKeyUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/ECKeyUtil.java index 81f7cab77..040c614c4 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/ECKeyUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/bc/ECKeyUtil.java @@ -12,6 +12,11 @@ package org.dromara.hutool.crypto.bc; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util; +import org.bouncycastle.jce.spec.ECNamedCurveSpec; import org.dromara.hutool.core.io.IORuntimeException; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.sec.ECPrivateKey; @@ -38,6 +43,7 @@ import java.security.InvalidKeyException; import java.security.Key; import java.security.PrivateKey; import java.security.PublicKey; +import java.security.spec.ECPublicKeySpec; import java.security.spec.KeySpec; /** @@ -48,6 +54,73 @@ import java.security.spec.KeySpec; */ public class ECKeyUtil { + /** + * 只获取私钥里的d,32位字节 + * + * @param privateKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey + * @return 压缩得到的X + * @since 5.1.6 + */ + public static byte[] encodeECPrivateKey(final PrivateKey privateKey) { + return ((BCECPrivateKey) privateKey).getD().toByteArray(); + } + + /** + * 编码压缩EC公钥(基于BouncyCastle),即Q值
+ * 见:https://www.cnblogs.com/xinzhao/p/8963724.html + * + * @param publicKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey + * @return 压缩得到的Q + * @since 4.4.4 + */ + public static byte[] encodeECPublicKey(final PublicKey publicKey) { + return encodeECPublicKey(publicKey, true); + } + + /** + * 编码压缩EC公钥(基于BouncyCastle),即Q值
+ * 见:https://www.cnblogs.com/xinzhao/p/8963724.html + * + * @param publicKey {@link PublicKey},必须为org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey + * @param isCompressed 是否压缩 + * @return 得到的Q + * @since 5.5.9 + */ + public static byte[] encodeECPublicKey(final PublicKey publicKey, final boolean isCompressed) { + return ((BCECPublicKey) publicKey).getQ().getEncoded(isCompressed); + } + + /** + * 解码恢复EC压缩公钥,支持Base64和Hex编码,(基于BouncyCastle)
+ * 见:https://www.cnblogs.com/xinzhao/p/8963724.html + * + * @param encode 压缩公钥 + * @param curveName EC曲线名 + * @return 公钥 + * @since 4.4.4 + */ + public static PublicKey decodeECPoint(final String encode, final String curveName) { + return decodeECPoint(SecureUtil.decode(encode), curveName); + } + + /** + * 解码恢复EC压缩公钥,支持Base64和Hex编码,(基于BouncyCastle) + * + * @param encodeByte 压缩公钥 + * @param curveName EC曲线名,例如{@link SmUtil#SM2_DOMAIN_PARAMS} + * @return 公钥 + * @since 4.4.4 + */ + public static PublicKey decodeECPoint(final byte[] encodeByte, final String curveName) { + final X9ECParameters x9ECParameters = ECUtil.getNamedCurveByName(curveName); + final ECCurve curve = x9ECParameters.getCurve(); + final java.security.spec.ECPoint point = EC5Util.convertPoint(curve.decodePoint(encodeByte)); + + // 根据曲线恢复公钥格式 + final ECNamedCurveSpec ecSpec = new ECNamedCurveSpec(curveName, curve, x9ECParameters.getG(), x9ECParameters.getN()); + return KeyUtil.generatePublicKey("EC", new ECPublicKeySpec(point, ecSpec)); + } + /** * 密钥转换为AsymmetricKeyParameter *