diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/asymmetric/SM2.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/asymmetric/SM2.java index 52f08dd39..ae01de6f3 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/asymmetric/SM2.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/asymmetric/SM2.java @@ -12,12 +12,6 @@ package org.dromara.hutool.crypto.asymmetric; -import org.dromara.hutool.core.lang.Assert; -import org.dromara.hutool.core.codec.HexUtil; -import org.dromara.hutool.crypto.bc.BCUtil; -import org.dromara.hutool.crypto.CryptoException; -import org.dromara.hutool.crypto.bc.ECKeyUtil; -import org.dromara.hutool.crypto.SecureUtil; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.InvalidCipherTextException; @@ -33,6 +27,11 @@ import org.bouncycastle.crypto.signers.SM2Signer; import org.bouncycastle.crypto.signers.StandardDSAEncoding; import org.bouncycastle.util.BigIntegers; import org.bouncycastle.util.encoders.Hex; +import org.dromara.hutool.core.codec.HexUtil; +import org.dromara.hutool.core.lang.Assert; +import org.dromara.hutool.crypto.CryptoException; +import org.dromara.hutool.crypto.SecureUtil; +import org.dromara.hutool.crypto.bc.ECKeyUtil; import org.dromara.hutool.crypto.bc.SmUtil; import java.math.BigInteger; @@ -104,8 +103,8 @@ public class SM2 extends AbstractAsymmetricCrypto { */ public SM2(final byte[] privateKey, final byte[] publicKey) { this( - ECKeyUtil.decodePrivateKeyParams(privateKey), - ECKeyUtil.decodePublicKeyParams(publicKey) + ECKeyUtil.decodePrivateKeyParams(privateKey), + ECKeyUtil.decodePublicKeyParams(publicKey) ); } @@ -118,7 +117,7 @@ public class SM2 extends AbstractAsymmetricCrypto { * @param publicKey 公钥 */ public SM2(final PrivateKey privateKey, final PublicKey publicKey) { - this(BCUtil.toParams(privateKey), BCUtil.toParams(publicKey)); + this(ECKeyUtil.toPrivateParams(privateKey), ECKeyUtil.toPublicParams(publicKey)); if (null != privateKey) { this.privateKey = privateKey; } @@ -132,13 +131,13 @@ public class SM2 extends AbstractAsymmetricCrypto { * 私钥和公钥同时为空时生成一对新的私钥和公钥
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密 * - * @param privateKeyHex 私钥16进制 + * @param privateKeyDValue 私钥16进制(私钥D值) * @param publicKeyPointXHex 公钥X16进制 * @param publicKeyPointYHex 公钥Y16进制 * @since 5.2.0 */ - public SM2(final String privateKeyHex, final String publicKeyPointXHex, final String publicKeyPointYHex) { - this(BCUtil.toSm2Params(privateKeyHex), BCUtil.toSm2Params(publicKeyPointXHex, publicKeyPointYHex)); + public SM2(final String privateKeyDValue, final String publicKeyPointXHex, final String publicKeyPointYHex) { + this(ECKeyUtil.toSm2PrivateParams(privateKeyDValue), ECKeyUtil.toSm2PublicParams(publicKeyPointXHex, publicKeyPointYHex)); } /** @@ -146,13 +145,14 @@ public class SM2 extends AbstractAsymmetricCrypto { * 私钥和公钥同时为空时生成一对新的私钥和公钥
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密 * - * @param privateKey 私钥 - * @param publicKeyPointX 公钥X - * @param publicKeyPointY 公钥Y + * @param privateKeyDValue 私钥(D值) + * @param publicKeyPointX 公钥X + * @param publicKeyPointY 公钥Y * @since 5.2.0 */ - public SM2(final byte[] privateKey, final byte[] publicKeyPointX, final byte[] publicKeyPointY) { - this(BCUtil.toSm2Params(privateKey), BCUtil.toSm2Params(publicKeyPointX, publicKeyPointY)); + public SM2(final byte[] privateKeyDValue, final byte[] publicKeyPointX, final byte[] publicKeyPointY) { + this(ECKeyUtil.toSm2PrivateParams(privateKeyDValue), + ECKeyUtil.toSm2PublicParams(publicKeyPointX, publicKeyPointY)); } /** @@ -182,8 +182,8 @@ public class SM2 extends AbstractAsymmetricCrypto { public SM2 init() { if (null == this.privateKeyParams && null == this.publicKeyParams) { super.initKeys(); - this.privateKeyParams = BCUtil.toParams(this.privateKey); - this.publicKeyParams = BCUtil.toParams(this.publicKey); + this.privateKeyParams = ECKeyUtil.toPrivateParams(this.privateKey); + this.publicKeyParams = ECKeyUtil.toPublicParams(this.publicKey); } return this; } @@ -206,7 +206,7 @@ public class SM2 extends AbstractAsymmetricCrypto { * C2 密文数据 * * - * @param data 被加密的bytes + * @param data 被加密的bytes * @return 加密后的bytes * @throws CryptoException 包括InvalidKeyException和InvalidCipherTextException的包装异常 * @since 5.7.10 @@ -270,7 +270,7 @@ public class SM2 extends AbstractAsymmetricCrypto { /** * 使用私钥解密 * - * @param data SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值 + * @param data SM2密文,实际包含三部分:ECC公钥、真正的密文、公钥和原文的SM3-HASH值 * @return 加密后的bytes * @throws CryptoException 包括InvalidKeyException和InvalidCipherTextException的包装异常 * @since 5.7.10 @@ -441,7 +441,7 @@ public class SM2 extends AbstractAsymmetricCrypto { super.setPrivateKey(privateKey); // 重新初始化密钥参数,防止重新设置密钥时导致密钥无法更新 - this.privateKeyParams = BCUtil.toParams(privateKey); + this.privateKeyParams = ECKeyUtil.toPrivateParams(privateKey); return this; } @@ -463,7 +463,7 @@ public class SM2 extends AbstractAsymmetricCrypto { super.setPublicKey(publicKey); // 重新初始化密钥参数,防止重新设置密钥时导致密钥无法更新 - this.publicKeyParams = BCUtil.toParams(publicKey); + this.publicKeyParams = ECKeyUtil.toPublicParams(publicKey); return this; } @@ -535,7 +535,7 @@ public class SM2 extends AbstractAsymmetricCrypto { * @since 5.5.9 */ public byte[] getD() { - return BigIntegers.asUnsignedByteArray(32,getDBigInteger()); + return BigIntegers.asUnsignedByteArray(32, getDBigInteger()); } /** 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 04d7a7da1..23e487495 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 @@ -12,14 +12,10 @@ package org.dromara.hutool.crypto.bc; -import org.dromara.hutool.core.io.IORuntimeException; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.asn1.x9.X9ECParameters; -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.ec.BCECPrivateKey; import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; import org.bouncycastle.jcajce.provider.asymmetric.util.EC5Util; @@ -27,12 +23,11 @@ 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.crypto.*; +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.io.InputStream; -import java.math.BigInteger; -import java.security.Key; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.ECPoint; @@ -155,182 +150,6 @@ public class BCUtil { ); } - /** - * 密钥转换为AsymmetricKeyParameter - * - * @param key PrivateKey或者PublicKey - * @return ECPrivateKeyParameters或者ECPublicKeyParameters - * @since 5.2.0 - */ - public static AsymmetricKeyParameter toParams(final Key key) { - return ECKeyUtil.toParams(key); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param d 私钥d值 - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toSm2Params(final String d) { - return ECKeyUtil.toSm2PrivateParams(d); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param dHex 私钥d值16进制字符串 - * @param domainParameters ECDomainParameters - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toParams(final String dHex, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPrivateParams(dHex, domainParameters); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param d 私钥d值 - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toSm2Params(final byte[] d) { - return ECKeyUtil.toSm2PrivateParams(d); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param d 私钥d值 - * @param domainParameters ECDomainParameters - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toParams(final byte[] d, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPrivateParams(d, domainParameters); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param d 私钥d值 - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toSm2Params(final BigInteger d) { - return ECKeyUtil.toSm2PrivateParams(d); - } - - /** - * 转换为 ECPrivateKeyParameters - * - * @param d 私钥d值 - * @param domainParameters ECDomainParameters - * @return ECPrivateKeyParameters - */ - public static ECPrivateKeyParameters toParams(final BigInteger d, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPrivateParams(d, domainParameters); - } - - /** - * 转换为ECPublicKeyParameters - * - * @param x 公钥X - * @param y 公钥Y - * @param domainParameters ECDomainParameters - * @return ECPublicKeyParameters - */ - public static ECPublicKeyParameters toParams(final BigInteger x, final BigInteger y, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPublicParams(x, y, domainParameters); - } - - /** - * 转换为SM2的ECPublicKeyParameters - * - * @param xHex 公钥X - * @param yHex 公钥Y - * @return ECPublicKeyParameters - */ - public static ECPublicKeyParameters toSm2Params(final String xHex, final String yHex) { - return ECKeyUtil.toSm2PublicParams(xHex, yHex); - } - - /** - * 转换为ECPublicKeyParameters - * - * @param xHex 公钥X - * @param yHex 公钥Y - * @param domainParameters ECDomainParameters - * @return ECPublicKeyParameters - */ - public static ECPublicKeyParameters toParams(final String xHex, final String yHex, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPublicParams(xHex, yHex, domainParameters); - } - - /** - * 转换为SM2的ECPublicKeyParameters - * - * @param xBytes 公钥X - * @param yBytes 公钥Y - * @return ECPublicKeyParameters - */ - public static ECPublicKeyParameters toSm2Params(final byte[] xBytes, final byte[] yBytes) { - return ECKeyUtil.toSm2PublicParams(xBytes, yBytes); - } - - /** - * 转换为ECPublicKeyParameters - * - * @param xBytes 公钥X - * @param yBytes 公钥Y - * @param domainParameters ECDomainParameters - * @return ECPublicKeyParameters - */ - public static ECPublicKeyParameters toParams(final byte[] xBytes, final byte[] yBytes, final ECDomainParameters domainParameters) { - return ECKeyUtil.toPublicParams(xBytes, yBytes, domainParameters); - } - - /** - * 公钥转换为 {@link ECPublicKeyParameters} - * - * @param publicKey 公钥,传入null返回null - * @return {@link ECPublicKeyParameters}或null - */ - public static ECPublicKeyParameters toParams(final PublicKey publicKey) { - return ECKeyUtil.toPublicParams(publicKey); - } - - /** - * 私钥转换为 {@link ECPrivateKeyParameters} - * - * @param privateKey 私钥,传入null返回null - * @return {@link ECPrivateKeyParameters}或null - */ - public static ECPrivateKeyParameters toParams(final PrivateKey privateKey) { - return ECKeyUtil.toPrivateParams(privateKey); - } - - /** - * 读取PEM格式的私钥 - * - * @param pemStream pem流 - * @return {@link PrivateKey} - * @since 5.2.5 - * @see PemUtil#readPemPrivateKey(InputStream) - */ - public static PrivateKey readPemPrivateKey(final InputStream pemStream) { - return PemUtil.readPemPrivateKey(pemStream); - } - - /** - * 读取PEM格式的公钥 - * - * @param pemStream pem流 - * @return {@link PublicKey} - * @since 5.2.5 - * @see PemUtil#readPemPublicKey(InputStream) - */ - public static PublicKey readPemPublicKey(final InputStream pemStream) { - return PemUtil.readPemPublicKey(pemStream); - } - /** * Java中的PKCS#8格式私钥转换为OpenSSL支持的PKCS#1格式 * diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/BCUtilTest.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/BCUtilTest.java index a6c4fd366..a988bcb73 100644 --- a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/BCUtilTest.java +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/BCUtilTest.java @@ -12,30 +12,6 @@ package org.dromara.hutool.crypto.bc; -import org.bouncycastle.crypto.params.ECPrivateKeyParameters; -import org.bouncycastle.crypto.params.ECPublicKeyParameters; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - public class BCUtilTest { - /** - * 密钥生成来自:... - */ - @Test - public void createECPublicKeyParametersTest() { - final String x = "706AD9DAA3E5CEAC3DA59F583429E8043BAFC576BE10092C4EA4D8E19846CA62"; - final String y = "F7E938B02EED7280277493B8556E5B01CB436E018A562DFDC53342BF41FDF728"; - - final ECPublicKeyParameters keyParameters = BCUtil.toSm2Params(x, y); - Assertions.assertNotNull(keyParameters); - } - - @Test - public void createECPrivateKeyParametersTest() { - final String privateKeyHex = "5F6CA5BB044C40ED2355F0372BF72A5B3AE6943712F9FDB7C1FFBAECC06F3829"; - - final ECPrivateKeyParameters keyParameters = BCUtil.toSm2Params(privateKeyHex); - Assertions.assertNotNull(keyParameters); - } } diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/ECKeyUtilTest.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/ECKeyUtilTest.java new file mode 100644 index 000000000..106c908e9 --- /dev/null +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/bc/ECKeyUtilTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2023. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.crypto.bc; + +import org.bouncycastle.crypto.params.ECPrivateKeyParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class ECKeyUtilTest { + + /** + * 密钥生成来自:... + */ + @Test + public void createECPublicKeyParametersTest() { + final String x = "706AD9DAA3E5CEAC3DA59F583429E8043BAFC576BE10092C4EA4D8E19846CA62"; + final String y = "F7E938B02EED7280277493B8556E5B01CB436E018A562DFDC53342BF41FDF728"; + + final ECPublicKeyParameters keyParameters = ECKeyUtil.toSm2PublicParams(x, y); + Assertions.assertNotNull(keyParameters); + } + + @Test + public void createECPrivateKeyParametersTest() { + final String privateKeyHex = "5F6CA5BB044C40ED2355F0372BF72A5B3AE6943712F9FDB7C1FFBAECC06F3829"; + + final ECPrivateKeyParameters keyParameters = ECKeyUtil.toSm2PrivateParams(privateKeyHex); + Assertions.assertNotNull(keyParameters); + } +}