diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java index e21af86..4d1ffbc 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/utils/AntCertificationUtil.java @@ -10,9 +10,7 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Principal; import java.security.PublicKey; -import java.security.Security; import java.security.cert.Certificate; -import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateFactory; import java.security.cert.CertificateNotYetValidException; @@ -24,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,12 +41,7 @@ import com.egzosn.pay.common.util.str.StringUtils; public class AntCertificationUtil { private static final Logger LOGGER = LoggerFactory.getLogger(AntCertificationUtil.class); - static { - if (null == Security.getProvider("BC")) { - Security.removeProvider("SunEC"); - Security.addProvider(new BouncyCastleProvider()); - } - } + /** * 验证证书是否可信 @@ -283,12 +275,11 @@ public class AntCertificationUtil { private static X509Certificate[] readPemCertChain(String cert) { ByteArrayInputStream inputStream = new ByteArrayInputStream(cert.getBytes()); - CertificateFactory factory = null; try { - factory = CertificateFactory.getInstance("X.509"); + CertificateFactory factory = CertificateFactory.getInstance("X.509", "BC");; Collection extends Certificate> certificates = factory.generateCertificates(inputStream); return certificates.toArray(new X509Certificate[certificates.size()]); - } catch (CertificateException e) { + } catch (GeneralSecurityException e) { LOGGER.error("提取根证书失败", e); } return null; diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java index 5ebf06c..3c18fe8 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java @@ -240,10 +240,7 @@ public class XML { } } } - catch (ParserConfigurationException e) { - throw new PayErrorException(new PayException("XML failure", "XML解析失败\n" + e.getMessage())); - } - catch (SAXException e) { + catch (ParserConfigurationException | SAXException e) { throw new PayErrorException(new PayException("XML failure", "XML解析失败\n" + e.getMessage())); } finally { diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/AES.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/AES.java new file mode 100644 index 0000000..bd4bf64 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/encrypt/AES.java @@ -0,0 +1,77 @@ +package com.egzosn.pay.common.util.sign.encrypt; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.Security; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.commons.codec.digest.DigestUtils; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +/** + * AES 加解密 + * + * @author Egan + *
+ * email egan@egzosn.com + * date 2022/3/20 + *+ */ +public class AES { + /** + * 密钥算法 + */ + private static final String ALGORITHM = "AES"; + /** + * 加解密算法/工作模式/填充方式 + */ + private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS7Padding"; + + static { + if (null == Security.getProvider("BC")) { + Security.removeProvider("SunEC"); + Security.addProvider(new BouncyCastleProvider()); + } + } + + /** + * 解密 + * + * @param content 密文 + * @param privateKey 商户私钥 + * @param characterEncoding 编码格式 + * @return 解密后的字符串 + * @throws GeneralSecurityException 解密异常 + * @throws IOException IOException + */ + public static String decrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException { + byte[] reqInfoB = Base64.decode(content); + String key$ = DigestUtils.md5Hex(privateKey).toLowerCase(); + Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); + SecretKeySpec secretKeySpec = new SecretKeySpec(key$.getBytes(), ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); + return new String(cipher.doFinal(reqInfoB), characterEncoding); + } + + /** + * 解密 + * + * @param content 密文 + * @param privateKey 商户私钥 + * @param characterEncoding 编码格式 + * @return 解密后的字符串 + * @throws GeneralSecurityException 解密异常 + * @throws IOException IOException + */ + public static String encrypt(String content, String privateKey, String characterEncoding) throws GeneralSecurityException, IOException { + String key$ = DigestUtils.md5Hex(privateKey).toLowerCase(); + Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING, "BC"); + SecretKeySpec secretKeySpec = new SecretKeySpec(key$.getBytes(), ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); + byte[] doFinal = cipher.doFinal(content.getBytes(characterEncoding)); + return Base64.encode(doFinal); + } + +}