remove EC

This commit is contained in:
Looly 2020-05-26 18:21:42 +08:00
parent 7c4c6c7af1
commit 44fe8904a2
5 changed files with 85 additions and 30 deletions

View File

@ -21,6 +21,7 @@
* 【script 】 ScriptUtil增加evalInvocable和invoke方法issue#I1HHCP@Gitee
* 【core 】 ImgUtil增加去除背景色的方法pr#124@Gitee
* 【system 】 OshiUtil增加获取CPU使用率的方法pr#124@Gitee
* 【crypto 】 AsymmetricAlgorithm去除ECissue#887@Github
### Bug修复
* 【core 】 修复SimpleCache死锁问题issue#I1HOKB@Gitee

View File

@ -1,7 +1,26 @@
package cn.hutool.crypto;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.io.InputStream;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
@ -17,32 +36,15 @@ import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.ECGenParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
/**
* 密钥工具类
*
@ -906,4 +908,49 @@ public class KeyUtil {
public static PublicKey decodeECPoint(byte[] encodeByte, String curveName) {
return BCUtil.decodeECPoint(encodeByte, curveName);
}
/**
* 通过RSA私钥生成RSA公钥
*
* @param privateKey RSA私钥
* @return RSA公钥null表示私钥不被支持
* @since 5.3.6
*/
public static PublicKey getRSAPublicKey(PrivateKey privateKey){
if(privateKey instanceof RSAPrivateCrtKey){
final RSAPrivateCrtKey privk = (RSAPrivateCrtKey)privateKey;
return getRSAPublicKey(privk.getModulus(), privk.getPublicExponent());
}
return null;
}
/**
* 获得RSA公钥对象
*
* @param modulus Modulus
* @param publicExponent Public Exponent
* @return 公钥
* @since 5.3.6
*/
public static PublicKey getRSAPublicKey(String modulus, String publicExponent){
return getRSAPublicKey(
new BigInteger(modulus, 16), new BigInteger(publicExponent, 16));
}
/**
* 获得RSA公钥对象
*
* @param modulus Modulus
* @param publicExponent Public Exponent
* @return 公钥
* @since 5.3.6
*/
public static PublicKey getRSAPublicKey(BigInteger modulus, BigInteger publicExponent){
final RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(modulus, publicExponent);
try {
return getKeyFactory("RSA").generatePublic(publicKeySpec);
} catch (InvalidKeySpecException e) {
throw new CryptoException(e);
}
}
}

View File

@ -13,9 +13,7 @@ public enum AsymmetricAlgorithm {
/** RSA算法此算法用了默认补位方式为RSA/ECB/PKCS1Padding */
RSA_ECB_PKCS1("RSA/ECB/PKCS1Padding"),
/** RSA算法此算法用了RSA/None/NoPadding */
RSA_None("RSA/None/NoPadding"),
/** ECElliptic Curve算法 */
EC("EC");
RSA_None("RSA/None/NoPadding");
private final String value;

View File

@ -4,6 +4,7 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.HexUtil;
import cn.hutool.crypto.BCUtil;
import cn.hutool.crypto.CryptoException;
import cn.hutool.crypto.KeyUtil;
import cn.hutool.crypto.SecureUtil;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.Digest;
@ -78,8 +79,8 @@ public class SM2 extends AbstractAsymmetricCrypto<SM2> {
*/
public SM2(byte[] privateKey, byte[] publicKey) {
this(//
SecureUtil.generatePrivateKey(ALGORITHM_SM2, privateKey), //
SecureUtil.generatePublicKey(ALGORITHM_SM2, publicKey)//
KeyUtil.generatePrivateKey(ALGORITHM_SM2, privateKey), //
KeyUtil.generatePublicKey(ALGORITHM_SM2, publicKey)//
);
}

View File

@ -1,14 +1,15 @@
package cn.hutool.crypto.test;
import java.security.KeyPair;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.crypto.CryptoException;
import cn.hutool.crypto.GlobalBouncyCastleProvider;
import cn.hutool.crypto.KeyUtil;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
public class KeyUtilTest {
@ -23,4 +24,11 @@ public class KeyUtilTest {
Assert.assertNotNull(pair);
}
@Test
public void getRSAPublicKeyTest(){
final KeyPair keyPair = KeyUtil.generateKeyPair("RSA");
final PrivateKey aPrivate = keyPair.getPrivate();
final PublicKey rsaPublicKey = KeyUtil.getRSAPublicKey(aPrivate);
Assert.assertEquals(rsaPublicKey, keyPair.getPublic());
}
}